From c212ad6870e36827ceb475f292b52edf6f394431 Mon Sep 17 00:00:00 2001 From: Julien Seren-Rosso Date: Mon, 4 Nov 2024 10:26:16 +0100 Subject: [PATCH 01/74] Fixes companies layout (#3708) --- front/src/Apps/Companies/CompaniesRoutes.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front/src/Apps/Companies/CompaniesRoutes.tsx b/front/src/Apps/Companies/CompaniesRoutes.tsx index 39438e2114..12d9ea3caf 100644 --- a/front/src/Apps/Companies/CompaniesRoutes.tsx +++ b/front/src/Apps/Companies/CompaniesRoutes.tsx @@ -35,7 +35,7 @@ export default function CompaniesRoutes() { return (
{!isMobile && } -
+
} /> From bcd266e06b946beed0203b602730f8a80e9db72a Mon Sep 17 00:00:00 2001 From: Julien Seren-Rosso Date: Mon, 4 Nov 2024 10:26:40 +0100 Subject: [PATCH 02/74] Updates sign reception text (#3710) --- .../src/Apps/Dashboard/Validation/BSDD/SignReception.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/front/src/Apps/Dashboard/Validation/BSDD/SignReception.tsx b/front/src/Apps/Dashboard/Validation/BSDD/SignReception.tsx index 758fd08e2d..1f1d4608c3 100644 --- a/front/src/Apps/Dashboard/Validation/BSDD/SignReception.tsx +++ b/front/src/Apps/Dashboard/Validation/BSDD/SignReception.tsx @@ -791,10 +791,11 @@ function SignReceptionModal({

En qualité de destinataire du déchet, je confirme la - réception des déchets pour la quantité indiquée dans ce bordereau. Un - mail automatique Trackdéchets informera le producteur de ce refus - partiel, accompagné du récépisséPDF. L’inspection des ICPE et ma société - en recevront une copie. + réception des déchets pour la quantité indiquée dans ce bordereau. En + cas de refus partiel ou total uniquement, un mail automatique + Trackdéchets informera le producteur de ce refus, accompagné du + récépissé PDF. L’inspection des ICPE et ma société en recevront + également une copie.

Date: Mon, 4 Nov 2024 14:00:49 +0100 Subject: [PATCH 03/74] [TRA-15350] Fix favicons / style imports from react-dsfr library (#3702) * Fixes react-dsfr imports * Fixes manifest format --- front/index.html | 20 +++++--------------- front/project.json | 2 +- front/public/android-chrome-192x192.png | Bin 0 -> 3631 bytes front/public/android-chrome-512x512.png | Bin 0 -> 9190 bytes front/public/apple-touch-icon.png | Bin 0 -> 3448 bytes front/public/favicon.ico | Bin 7197 -> 7406 bytes front/public/favicon.svg | 1 + front/public/manifest.json | 15 --------------- front/public/manifest.webmanifest | 14 ++++++++++++++ 9 files changed, 21 insertions(+), 31 deletions(-) create mode 100644 front/public/android-chrome-192x192.png create mode 100644 front/public/android-chrome-512x512.png create mode 100644 front/public/apple-touch-icon.png create mode 100644 front/public/favicon.svg delete mode 100644 front/public/manifest.json create mode 100644 front/public/manifest.webmanifest diff --git a/front/index.html b/front/index.html index cc26891b78..c9aed6c4c1 100644 --- a/front/index.html +++ b/front/index.html @@ -16,23 +16,13 @@ content="bsd, bsds, bsdr, dechet, dechet dangereux, cerfa, tracabilite" /> - - - + + + + diff --git a/front/project.json b/front/project.json index c8514e4b05..e9d3281e7d 100644 --- a/front/project.json +++ b/front/project.json @@ -7,7 +7,7 @@ "dsfr": { "executor": "nx:run-commands", "options": { - "command": "cd front && react-dsfr update-icons && react-dsfr copy-static-assets" + "command": "cd front && npx react-dsfr update-icons" } }, "build": { diff --git a/front/public/android-chrome-192x192.png b/front/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..ee27bbf22d56413e09cdbf39d8c5a421f9602ba7 GIT binary patch literal 3631 zcmV+~4$$$5P)-PWs z{o()zJUp#KL$Fj-w`pm>@$vco^z{V=m~U^wlatYynAGm>_x{sRM- z5)z#sAEG2Aq$nt*EG(zv0uV(-v7(~azP{wf#^>GL@ZaC@``zFE`S~_Bt2j8TU0u6) zc*T2r$GN%T_q@Q(&Fa_J?)>QK@9+2r2bl~En=&$~;{gmwNwQ5%v`|pBQc||)DK?Fb z&$P7PwzlBO$>`eJ@8#w5^Yi-t`uYL_mLVad<{ByKGeB!=!Gwf_etyV+fXRu8&F^=A zot@V4ijk(K+Vh>Gx3}T+qo~5d<<8FP_`}Ef&(iwS*5l*y?CkdP^7;As`~w4)4i1|T z5S$eio*EjUIXSH42N*v;uH_XYOG~rpEIC_Sx#%xE={H2`KumIS!|YXHgoMkHk9L{RHZS9Nv7?OJ4if5`1!XNro7?qh83W^as)&hKt_mX?<9bbOVS(w?54pP$#I zrP=b4n5?Yaudm(nnxOQcroh1D#Kh+Iw7B=TyUWYz_r1c_*4EY4?cw3_=jZh3==JI8 z_59@K@9*#Q^!oYv`4kkMBO{~a1{LKE9_Ak{=Or{)Sh!(fykum(>`+{Sg35z~%I#oj zj*gCphs=6va;T|xVXE!yY;87^{TJ;z{L2*$=uxB;^OlA z+T7^q=<4d~{qgb~9HB2Ss5&~VkkIgbg`Aw#@Pdh@rKRzP zjj5@ruCA`~l$!Rjw$|3};o;%>+1vH?_5Swv={-rStE=&il(4X{v9YngzrVo1z`?=6 z!^6YF!{*1w$H>UY_rJr`)YSRW)cV%g`{LyC^78%i^Y-@kJ8#E1000W=Nklb=$a}HP`SJr$mF3+?d57%5>DMBJZZGK?09dJ|H z{VfB92awPJ<|y{t=}tldkW}^nbG7*X#&Dqkh--nD{0>Za6#_tJKj5t&w=Jg*;Ft=Q z$nOhVx&UF1z(RS}jHd{YCxX+vj0=zpM(Cfu;VgPQ=fJ1X#2?0!z0v-(_1E93SWIy~okp#dvf54{a2>=A0 zz-K@7A^^}Aqy2CIKfnx}_QPfD0Iyl&wEtN+c7P}lzznhgAP1}c&sJauIEcY)zY%pO z2LQM{u33TIl^AP}0!R)5etG8O1E>TNinYZBu*{zb04)CQE79wN*CPiI7Xc~N zI~@SHiW(r9nEkL~D&tnfA_f@KpBzBFr)ocPMGNo(5Y_^;BQSxq{b^H?0yw-x*#6ja zXm_DYgzbNOIofj|!7If|I64keXD6g1Eq(@J+ZJ}Sb9mQoR0Z5$1 ze`q}cK3UTCy#*yeD(-{$&%1WD9bq4}`$Dm<2m!F)vOayY-HX`X@oYLmfJykBp&#b` zQ9TB`Ivy=>MF$`ua+J;cy~-Eu{Qfb*oBB71?4$FvMgaU?M_BBE{i@sk>9M~ve%z*c z+;Y@r0}${gPAz=6@RatW^#}`|UZxQjdm6lOg&0}%R)vEZ0Jo?__U{;K%z~Z(J>AW! zc|AgfV22@qak~@Dt-9<<1K@uX5v&2nw$6v{GzgBmS_~jLl-2s-{ZTXsHX8*f2~p%J zl?p{zrm<>|nD<*hc+&vz`@j%DruPtyy-^zT*V+Q_yk$XbUE9S9N~LpPD8mI-K|Tg1 z#B1(?+DVSN){eZHTvbfc7DOl{bA&Ns&-bmm1 zv;o+vcp;+J8oG!Uuw{rqsaz$Om(Pk!`QAgw#=DI8Vya13!pqHj_k4dr+W*!-&H;@$ z;f;QFLbLyYnIWZ(a`$t>8UXWSVlQ{Yy>8aYQUPo~?Eujgj)scl4D9=_xREd3GTfBK zq%jHu4Y|*&SWf1E+R+qBV2>IBP`%UIQUkT31vc3ARz64tJnwv77m$SF;2kCf!?kDF);KphOs&JnX9WR-hs zg#=c^$lJeB#05a*DBn)BF%{cSA#Q)Yk$XP(fa{5rSB{?0uVNw zbYk?rt(gGKZhvQ-q2$o2Jq^U?&>*t`7)6D#o(w58e4(^(9sm#!d4^?IJw(NuyUYiG zNmN|an?T3ugfo-*0RZ$JP5PFSO#?QIcmfR1(>|Tci=w3zR=_k7F97REH@z;7+Y~y1 zJkN`G07wfHb^SX@ZZwq%WTIk=_1zaHX6S`z@>HOsqviovM^%i|cO}l;k^(I)&F2hI z{KAZQc0VXn>hd(`{ia0&wgN9zJ7@x}RQG zPV4QjHbLYvV1td9+ccU8036(3(fgG{ysT=;ErM;_>V-ml^VsZ>Mf4g=0%DZh%4%7Ea`vC(P;wT} z_|$jGIxVC6t&*sgh0d!!qKf}*3O}E~&-|a+Qf}kRcGUTS%c8j-o9sw80wB4r>3qg) zRTp|pI-z4gwW?OCF{+P(-?H{A6Im!QS)b@3yHju>SpDd|NUgu#KT2BB_QT2iE_FPo ziEsgkXZZS5$S1`+wmWxYR`1a+obEoOBVcIU$1~JjD-z)wfliiC<@FTZs&D)1&WOQ= zZ=lm6!VHk5_^fr;Z4XDAO!0 zI77zUgV-!W1EA@|WqfKp%sP~)6ETbEp9#U#if!nYW)mTOMYrBz&s{UVfbj`3NL; z&VO0*SPq4}>+pqHd;k(VUVe&#Qz5duy(Iu^kOS-lyZP#nJ%U>y_38kN(uLzu1BCcH z$1@oS54#H-d!sGOv!{tr1Efe3LY<*U5yxhN2n*}i-$4x!I4izF3U-xZZuYxbTIo0! z`3N*IKD`IW>2I~n;&PRtr~yJ5pSU=bqx}h%r?m#729Pr;pEDfocSn%cdK)o7Nh1QW>tSO7ArXmtR2?muri09$biIW6tA*3~kA#796`b>=MwZ2-3;AONMc*zyCg z`P?3aA-~Vg@&J&hgK*^6GTuyp(qSMhdA4Mm1EBN(!Kr>aXMn&+5Tu4K=LS$J1A%JM zG%f&r`h#E9;7nY@#MiE#V0SQIIAF+gViAYN-f*_%i0=qOQ-Q5T(AcE4}N{1lb z-QBw%-(T~bxzEg;Gk5OHxzC+YZA~RI#BBrs0Awo43OWD)-art56WlbdpEF)0BBO}|4j9K5lO)W1U3JDdSon19HF15F>&dlslQ)e(RWU{g4E<(uE)XD<`yXWTi z_xI0n=jSXeIVmY4t*tA)y&JgGQ#d?%0U(Nv9ULFu<>xOjHLcy*Ib9-Rc>1)`!J&C~ z_l%o6e-Wg7@}wd@9y1vaq%KF`n$e<)!VnNTiV8%j68*-Z4&tLib|Jkv5 zo0&QK`SbWu*5|RYo%QwO>%ILImV0YL((B@n0|Eke-LVA)1^b~<`yZnZ;!{z_s4-EVI_3O`{v&UabPRgq~J6F5AyC)}i zr>1tdwoY#Rx=hEh!pIvM8X6ZDw`=dZ>+F%7oV@GeT~=0hT2(hay>~gcupz4v6ciL5 z9=_)nnvpSj5D{NpJ%3XAYh+~P-@o12+1ZPcvBky3m6es#)6;bk*=^&OQBhGJKlUaj z4rgX&=H%q$<^3xyojy#@t*@`|>gxLU@88AX$mZte^}*qmzU5K=*R!^+!^6W}2lwLQ z;-5c%R#sLvG&Hodw6wRk_xJZ-E-Xz=P3`RLTy1Qg{Hi`582otz9G%08rT~ z3bMNH6Wi%7UNmDD!TqGQ&Tdo-NU8;gD05;JIBPSTIMmIplC6EZ_?}VoT^&K~jh&sD z$(b3`%jwxy)G=FJd=Fl2^(3F3f75VH-15mxm$+bV8wyi%0jM&QRANV$B&8QmuC;_W zhz8RzpIKrO*kuGiIJ}0y(Ok{r%FKlQ8^XMFP!#F&*Bmj?5A`wAb8s+9UKtgWJ{3yA z{0RmL$vTkEBc0Yeaz{Y5Q(T@$`}IiGy3@e3I0)FHhOU0SuVja3X>U5F@v-?9mv;pC z0SChtl59c6-4XxY;20kQ%J#flomR5Id7*}U+y2;)6$+~!RxYnlwqZ#KM@eZu3^B0O zyF&!w=qLv%H8dkZBwB8zoqcHB(-Hzl(Q*byBSIt|-hxI2Sg0s76+Qn!07YhIL@Pi1 znZ8d0N8Qio{nM!FtBJxUsXIUBWj|H84@cd8=Bn(i?kRLbeRWd6r^9XMDeecby~jJC z{+8vxHWG36>|#6SPXQK-egTUV#h| zLHb1xJO7PRL%oIx0q&v2`k0>t$+d!T0sIpGok;+6O1nIi*Bv_1;eluU?#2xNo8v(? ztqe6Thge30K_K>|I4JAa^(ta$>7z4htj#J1+?=w&G7n-(1mT~?5kzzSgMvxzjo(EN zlw)+E~1U>OdISfwxxQAwe()_je>;$>3eNI{0!-H#$2T*#&n z3kRcamN#TD$Zgwq47QPxXe{B;m`IY0CpFXtrS|DO7vm3{Dl1HI5I_qv@h-!K01SnN zB+B3J#qdpm8+(6ka5lH#+G1eQ->X4gB=+Taw$U3P>tO^6=-yaGRT0=2VgplpS+)rw z1}8s&-j&&2N~rlb8tMkzBZ(@Uz8X|R0h?3$wdbo%Dd+^Uu|3$F5)ylSCujPKsKXD~ zdcVDbFA3{JAo)dI z;z7tI#0E_60QfWxDQG~ez*B&ARX*7ifXz9A(@can-D_nNz(VOqgM{AkX$Hwg|B)MgI@ zXg*lpGkO_K2|Aq^Ts{kEdbNFJvpw!>bpnhz|ZUVZAhukilYx~Dce8(@V*l|Lr6BRIKrjn_rM z49JCztt}&&&2Ble?#gBYo2)OHw{kTBZ)n~h|Gp98Iav0A#r-#+`-#7{hfq|F!(0K9 zmttb)vj!IVK{@`v>Ze~A5e^hz4!X=zzynpp0Ey0W-zTbj)VkWhYAcfO)!RH?j=U`3 z@eNE+)ss_{fXLOzm)wzHo0ocv>y|f*9JJ3?g94*kbHdb*3D|TCQlSS~U~MkK$$Ve98^b z_|J(^#K|TDhpbP1B(;)((pzb}oK4ZZkRUk;Wxq!t0$xf9E_d^%K-U0&Y+dq_ax^fE z(!!+`C<6w>ADg*6p?d*O%t`eI*#Vk>7E7XsAX*m1Zy@HAWI%F3!#dQTtfnM{_}66$RXzP3iKBEfR+o}P6G$H1L1Sd z2q?BZ2U;2rLgY}25Ouvq!2Whyh?e6`KPLpNQt$} zKf!xec$|!;%+WqUv61)HfJ}zS;U#7m1*F}v7ri(w!F#NZ5)_A3xm--HP_+%9(9C($ zX%sUxSL%G_b#Kp8cf(oMm3@I`WEF8_!|?z?anb(xr3QsS78)2OkaJuzoAq*#@+J@z zn6pxE)SsmBw$Km>wie=WUa<60x>`=;!`F_mT z*N2;06J8^y9rW1K+nA|va!8-8INof=Gp4)M=fNaVmeu``m(*FbHvW}iL}0j4DBl_q z?MOjsylk91*lf(gaJ@jq1lrWo+7Q$>GGg%Ihf3*pDFN4D13OL=(LZ>x;l7q9s!*PQ zqai zgMA$3UVgQkWK42WtAev3l>*iMyEJUiuQ4mBZYli?rg=)(ZKMaa){N)pW!0?6UVgf) z0?ICO?7vi@O7XpTOtQyZ>JdDO{D;^w2= zRLJg-NnU(RW^6iLVYz(t5L`pK2l$+yTx2@dpQcvh@Ggh_|K!2}dzs!&%=AP>R{y=C zTh~#yA?7@L(Z+gE_pX*$avgT8;1opqY^n^HHFDQf=Qe_3v(XRA8&@j)ls$;Gb+B(v zeF6COK_}k|tW@0iksA#s*z{goihTF#+7a`g_bQ|W40&|Bun@>76`cxkOSxr!-n#Cd zMg^Ipc|xu3=3h}(=53=*$O-1jZFD4Jha(#tIhs!Om@jxaL3A>9r5C~unW;Res>r>$ zKTe1YDd(i@DAJTefz~P1do@tf@;I7hkQMk3FOcUDFqqKv>Q0e#nelxluxT8knCrJ| zCTdLICs}|7JlzjcyDJ@}>_m93w$e}SrC#j_Be7pYn;r3z*O){>vj(r#$j#lWmgQUi zB!x(GG!PK^Tb37UZfB9mBVbjC1QLQQ9<19U(UWPk4T^U>JUsGGQdn|`AR{4r4d$(U zwT^<{_W-K35Wxvgl19a7f%h|Oqu&S7thS2h&by_#J zy4bk$Qy|+hC>0Z^UKrYEeT-BvRyS=S$6U)?!A+Se_F)Sl^hxTxYgb>TZh@0oDOF6{ za!ivm@EkXD{)d7Py{v6-nW1-%9*`21i%TL6%a;SzNG*ruUBJAZhlj1?!6?-p317|E z)aIgp?jJtQY>nbv(P(<|5UcT4jvlqp! z*C(A;)wDo{ITK&)$K9N8;!YdYa=XSMe4z83rk!0C}(!7YCz7k@s&IM zi_lI>R&b5i5piC*&DNoR$~!-)?1W*=uJpe#gD*lK@4WDW94J&DPJF=puw!5$nNUD2 zCC*q%+Q0)s+xbl(eu-B2R0nT=HuZvoOCrsFij~)BKSsG|i(ZTop`qoV>-`KM*)|Oy z$_?6mPRyqv=eZSSQ2)Zq{3xwfR#ujxa;jrvHFcxkHqdvT)HXP{ijA`AO1PSKP3u*iipX_}2drxRTo&)4QQMBjMw>aN ztS)9lZ<3w8&yI)6-rRdoEF-$qVEdWg*9J~a683mu)T|W$tH^YFM`JAViethTpGni$ zr>HeIv#6JF8!rMYi`!&2-~Uxp*{^C}cmMLkFSquq)S9>VsE<1&+<2HdqkP$j&1VaE zik!nV$I92}3#E+KU61w^& zU0hBz>|$Sg-OIv+ob^0E2xe84tRbdFm5H~nWia_+=EZE`qPxh5AjA(UVS^}uIrT85 z<0xJA^n}vRMKRHO3^2G>F=cEjsUNe_C>ObFI9Otddp>O}XkxZ7F0MR96cZDY?+z9T z%#4>fC(f)D*ogQB!AIgL`m(Y*BHN#4~8yGAHK7LSd@iKwe2&aF#9raZj zTZ^%N<}AWL%#~RDoyF}%fW-&9BnKNGcm1{M=(A;vWN$-T<#-TfMcV)&Exm{*}Ogm-eW)h=kQMu_;N6x zqzp2gESXUH81z^@hw`(_ED}Fnh_fXet&e#gpp?LHEJGkXtI`yBQP1v+{JQ1eeEj|A zgpEEHsc5A^dp2X7xCQy1 zqt!HwS14{4zMm|_bmz7ohS-VbDR5aM=%~|xCU{iWe7?Ke*w}WKJOI_sVmH5f?OpHh z=T{Q|7a;J$PO_K@_x{u@BuTr|kt$_53vL;I;Dif8d$V_Ry^aS~w7UHzJ>EUBhinKy zFAoDV*i2r!=ytIV@IfPxbb*IDaB~I*go(KNfQnzfYy$2@<8^&c<%8qWr6@7MN2(m? z>A5Z6LC_Pb`Pllx-@!31-`Iy6Xq{9+0dZgEn!gJF2zv`MyhiN2r!xk4n7Y!F7D;mpfgs9s0`~Sd8ZO{>b9pOwB%7dX0EZUfSk{lmcAI*FF|tg23C+fI97Ys7Aygq z`B>E?A5pUda+L8^Z+u;}t-(auh^3pe=Ek~mjag(YiQ;6gSD^y3OAO@Om|A#ID(coz zoB*P5W%{;y5}6ssYlcG|2v|6eAmwb4fPvz&X+RfiUtl8O9F1fbwR4N&2IOQ3&fox1 z7jYJm{LRZLphf|9HQx%OPp8fcFy8(y)gXC-4qMRBHYh^=vz5VY&0Ag++ z(2Ct$!TVBhi1CphgFiNx;XVxhugBwEwZMM&^7F5Kk7Z@BGJ-Th3WzzezF4#9K~pFC zrg@ocQeUvjbiUfIDIYmB!N&E43@0keN2MbU~{;ppQiEYY?e^BFcf8Z zThV1H3^O;p-XkXaE?Lks8%mohnL(Si^+EP8YEzQ?EAWdfUgAz)QDPQu3~1m)Pq%F7 zg~|3LoIjc3L;v=L6OD*X@)`J@O`ad5pRbF7bYYX0{#Br|QmNqXd|JrG;ijkTp9EXR zujG)ljsvs3>bIuXPv;q&tGNg`sL_cjZTRB9Q;ct>;CGGZ^VGpA{gp#J7y|D}RFS4)&%M zV~JyNXf8d186W%Bv{>c{@={F)-#qY4Z1#sYPxM$Xo^&*|X55_|w&eIJKP(Ph(^v^4 z*N=;wqs9b_*LgOo-R@^`3Zg_a7D@4b0gm4}Y4sG%+!93@^t%mFIQD*5ddkSoFoCHM z?^5PP&jchBmF zu)FB+@q9{QCDQ*LPd)hDn|n&v_krC^oi~1GCjEot=|-8DK3N3ik&zSw8*Ctvj?T5+ z{Xgm;(O)bcQjKOBEA=j48(sv<*sMp!YRK&U)9gI8zqm`(?O)w5`~sov?{+L^go#16 zErxE7i9OU>r8aqkYoAQea(gfN$a?>yter>wOy1?K`!J^tiEZxR-8TE<63nj@e~IoS zZxm4f=lJt;`L^(--{ECKdhhayC)2BY=5Sh6B)(wS@%!MQzkrz&CdVw}_s3X7z!n8Z zbP`^n&skz;t#18w#62>?j8_agFrE@Tb^WJWr!<&TszY6)knd$OCHW`yh$2!oxx(WC zb#QUlJ#;tj`PNdRXPVdH^F!vgE0K7M5ZWw_+j1vke@N93AKq5qQqW`U+`ZFR&$=r- zl(%m9BKRWl$5!IfGK+ts{ksEyLD9xzvuojG3pgG2@8uc8&T72b(R|cPujKtigT}

fvTzc(MAcajyd-$TalLyxW%d#{O;ugXwDUJ%U$Kn3?Eks{Mq3@VQc8q<8G- zMY4sLXt?10TUk>X0b2`4MbZ&X4YMy4r9#-T4-(t)*PW4~=?0^i7OVLX`Q-JYe5RTw z-DRv$P3F4E(7_a7ry|&wUG%$SLy`H}q@?t-${uU#$S3ih2}~O1Kbq5CDB6K*MZ1@$ zRb{0WFP~8sut{%rNcJRTm2j0_H@<}ANLa5F7W1B>?bnm2H zrE!;xzx2~8OOK+SMWC?1D;u0tM-NbGg?f&axIcypeRxgJj}XYtuOo!pJtLgZ3HQ2P z{gZ6=_q$GxiihBu7vgE|Uc-^16o&D?!L-EKWW226F!<9LV}Z$H_|-)4W=q+P?fqug z9BDCPZseW5ZlHnHfyM{uvjmx%%)uOhHS|+XyM0tAh1IhZ{4>ROVBYQq+rd7CE93K# z6nviM1XWZ0kp9(k6N<>69+eXEHn=qjMS1XuKXGA?DEMvaL)CNwm0p?7ClA1%)q52j zEc3lalf}Knc`Jer<6OxwbaZ*AvlLz>)8lbUc|)*CX+3TF+>kK!t%oG$XIIxZvP>)I zME$lCR-TFXIoXf%+(TaaCY#95@!NQ39rdPX{BqN$@6K1pwJ1%1JjyJ=L^ktvGi4!s zf{0Z5ai(pzG=JZ9TPOXg&-R9G<+8YT+iDTY}W*cHH z#7M1v&JX`+@KfQ-&CT5P#xQI0v>b&oTGtmr=q|E08M zltIzY#89$tW}UwhFJ7L5+){drTYD9x19?xvG|&pa$1+bfli7LfZGFB5mEvP#g3Gvg zvgCsSBTSQe!gBh*f4Mi#CR!=EBE3DbeMHC4D>Xhp#cl_2N`HGWzMb~biSy+r=epAI zP2~K`xe+PEjhgQg?eh3e@VF^v(9!it0|nnL=YUl~*=0pG=)fD-ZKE8DO5v*oZD&^5 zPSxKuLx;On*z8}FT?qy(z}qCL_SpC&b^Re&mqj5hs{i%xN=7Sx!{1-FH9c_)8FPwp zz`0%r?vC|n+5Lgx@UyFDwG30Afx~;4^DVK8SazRLnV74qRk{IQv>zwrPD2#8k89y= z@<{i@>}P-*2?$N-qL$fQEbzM;)E_}0pWz8>8!aw^>eFBTnLRAIeW1VZ3NV7C-@ji- z6y*7<7zLVL;eU#o)ceYg`H9tmY!J?EDTRv+A6rU#yEs_CGq|q>3c{7uu$3Th3AM_m^@!=9vWr0#_HRana+8VQ3ishA zE@9swJqYb_5nSVxVaHV~B^>Ps(5EE$?TmHPH~NHb92At3mA>(`I>cm$nPK`*Ho951 zvkwqL-*E_Y`dPJ(E2Xn9LYTjfBo749*ScZ#Y5TPb<6nd^N2qXcWVgLkD_R(TPN|%3 zlA{e|)(B*IH-r^82A=TtvZUu|0n-m#8Q*=27sM;b{d4@FROo62jnTTzMGWG+}&3`)~?{6 zk|NG-z5nLg!=5V#OSDd9PAvCL{za&ad$|zvFphuj-*dRJNpT<;J8eb(a=7hA52q5CuCRzS6J!zjaK%!gshX*L*w1Cq+Wd)XU zG!StQzpxXcxZ(gns%WmVKQE5?xy8x?#%GZQqCTx*14T?I>_aLq+lX28q(37XPz(5_ zWP~bEB7~a@;Lv%rHR)?mP$YF%%Ov!t!cN%@+xcon`Q6eMF$}WtDnW-mifi3<;Vu&E zqWU~sL~W9`_MreaHj!vZ)YzwYpajr-=>r$PZxtsBGti%*82WCt-PRY8LY<{Cid3Gl z`O)P6JB126N-QIL2xSyuM=Sr3f|j&oL!zNsA6g<;vLR2P3_>&HZ!286&t4Psf;KN& zB8S%Hn!%$qVEya4CQ2JyY8S;HDZ6kON1TLmSTjhdW^Bz&&@})I3C3aS@k@{x;7vilSp;0G@I0b zex9U#>Qol%E$vT0-}0%fsSYX9^je!13^OG&R1rh3Dc1mpt7vtdgB+c3hy!>Q795hd z(lw-+hnUmZAw2IIWJr4WQ5o{u5iMF4P8!Cl31lWmeM%!uQ;h>IoSlvnQ}M15oQl|a zK2{3YnWiGFhK2qVpmfUgm`jX4)q)r8Se>tD~j2O?z?h9yYZ$6gl zspqKy`buZbo~0oTfm53^^}p?Rg=_r_ds)vE{&w7_)DL5GJd^y}DZ5_+*|T^(1)TB! z{jGxpNCAjQujP#r`+kZ5v`MYLDOYQ)hQ9%dX^|Kzpv);T_ z@&zWWwIMgq8VlSm5W4}R9R9$>3O5pP08zjc6b)>b(cBDu6X|zDg~79&BmQsa-!YBG a6U~o%epX7XlE3-C1E@UKR49=%_xm3*3S12U literal 0 HcmV?d00001 diff --git a/front/public/apple-touch-icon.png b/front/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1f786231b1f175d51abed7d08dbe8f4a7bcdcc55 GIT binary patch literal 3448 zcmV-;4TtiHP)+AOT`1}nGn=mk_(9rAe@A%^Z z49Ljn_V)Yy{Qm#`{tytHEG(zu;_?y_oiZ}1H#e)Hq1Ugk-L$md_OrOs((Li^`Tq0t z`}_SK9-=}*ujLXUNlCIxOS4l`w_{_ydV0r^km*VpdZ+3()o@Cpi=BqXHb z00-m?8(LbqTwJ>9K}~me#eROs?ObMrgv*zg)1aW&va;U7!sYt<{Rs(~7Z;xy8K5aC zrsDz-KR>SK8!AvxwN+KP=rKO&HbZ7+zG`Z~b#=sie8-82&F*M&?`?PQa(eQSn6mAH;p6@6?ez5e{`vX;`}-6Wo*W#ZARwYOHLBzY89+d;MnWg|NZ?UBBMDutmFg}{MTXfXRi0%Z-hV?qzP2l+vcA*{7%4xw*OZr>x4#>G;LT)z$6! z%FX)N+U@Q4{ORiQ^7;Mm@cr=d{`U7gJgq%Ft>q3M<{2nWO|<7EGhSZ1U|_rJOIGYq zTY`dufq}{HU}=()lJ9VN?|6Xmh>!AFM?B>+AgL>-YEf{`L0!{QM^;rRXg?=rcfXZ^G+GQ-gzpkB^V< zbbRl6g7AEW@r;x5j+LmW+Vh;Eyu7@UCX$<58p&d%!A*4EqG@A=Wx{Nv^G^Yird^!WJrlZ|IR000UzNkl2#Vr(&GKbeW3%)$4M0fF2nJPR{O-+J z>vRPjGX^Th{DbeD(E&7XC#V^Bmu%27+T>YKKgRdZ%F-gbF$|bR?X}a|LJL*`<9M~~ zv{ukD#-K^m-}EMrE@Fd*;ojR!7HyXT2*SO0EkU%85uk~GZzYBv5t5wwQ+K9r)1pM*&y-30I$vI1KpWGjl9xP8i^frC88TfH!tv zK>GvkIOLMEX77?ngy;oFv7@2J`+b0S5Tb+do1t`5J-~P9(AhvLjvzzN3?YX82pM`a zG4o9WRA`P7A+q)F4Ui3afu!1bE4p#IF_n z5_BP1^pBA!(Ai|s@DvI($B-<#1j*WCo(^?t(4~#ISbT>B9Y+>z9fbnzMfgd~M}bZw z{3Omovfa8*g8IY{PdxhSJtSz{PvR?I_4oW{#*7)4`@a;zKR|*Gz$*T-=dBr2@#|55 zG9>6l_{jhJxc%}UKfd+FU-$GpIida*;5rg?I5zXWPyX?rsc-rz^V`+{@1w~uRbw(g zd?@}TQceBVb4oV1YM?(PFnZjh%^20J-*&(l=r=&=@ly&etP4!8NG%M(xG z)AxkaxH+Qy^b2^$=`SWnj!#AbCE67$x_@$vzJ+q_K}8BSu=R6){!9BL`WKI0Dno=$ z!q?1SwTos$5&B3L8nh42mC~*L-%X%j620;+8Z>Jq)=vF!&)XFG2hq2$=Ab!8yo7no z>k)5ha6xopi!nK7{q5hVsipl7VtMeNp+P6&Os)TSbad2O{DoS1Mc|M&Qyn#d1AVc$ zBPS0@{pe`@?e5cO9+bfKQCu)uF@7ioHK8$z0uzKRcq#H@} z^Rk0An2CO9<=X8pFbx=xDn+p@5-S!1c9-yREF#*}v*{)mq0Bk%B$wmoNPB}ick&MH z*+rhhbZ=d9d_l67`v>)+k)t1%n;kzWuL#A=e^nahteC=(T{l5nCdW5$$V165)>V9{ zE%UK8vgnp_576bfyNPD>@bdEU^E+R()5&7kQ0K&7zc*XijL13pW)j~@cgTk}s=5i_ zdKHK02>PO0JD1FOTU|iM%0;KsubX|6SPksF`a{c3)Tr_}TT_u;ku1%t`s{hBexsct&X=m_2abE7!wt&SaXFidy6io$tXq%~$ zP1hD3m|OH@-s)PEp}oYqSj;bxe-=RVcJ}RP`B|sv!=%*zDp3bbg>4)CaKiFST1l*X zjGs{tP3;V}@Mx}IR1lrUm#T{fn3pSqKF24D{z-i_!0t3DbQn=He9i<7wi2r;ZUEUm zPE|7lv{{Gb;MWvrVN9||8|bNx=C?`>ASMZiNw%}1YGm49uu5rbkm}B!iI!wL^cA(x zwvOkdSE}4-XX0DO{VJnF9sL_<=9FZ<)FU{gm28*{Iyvdac3=9vfIe@|h~(!5uOe`P zM8R!a@Y@IMa(|z2`Nu5hrFXgIyzK;9T0vbeuzb$iDLfEAApL1KcqSv-+>48+5OP~+ z$O4(whGD$E{%#UW)3r*`jqy~2T1f8zY`SFzjj>!p3Dhd3^&atTV80mLD!Gj21&qmj zR3)_?pF?EGdqyd`b+dpa-7^|&X|f(HeIA*-$3X)Il{KuwV3`jJqMA8-Sn{>OLI=}i zX0Dpv3*J#VugA_^dZ$*#+{~m>-JUwrkWBqrI0)<2C1;rs;la_uP$tW4_pRb*ZBd&_ zu2&rq{p{sZb4K@EGX3r2#O^MzlZB_zru!rZl1^%O!%Cs&L@Qaw} zG0%l56S8rm1%(FzL@v>ES?&xTZ0` z4GLw`jC`U&rW^GbtO=UyP`I;#zG8YP;&D!a(M5r(NDOGZ^SeUiF8Vz#J)SpbGODxr z$y-lTbcEDY_*${6qN6!ivGoZvv$6}cs-Ugn#8XHu`xN{&LyHv!;{T!}BlC~unxn;6 zcE0~q@W&MTkCSQ4uI{ z#Ny$a6p&{sxB4xb;Wlxv9y;_YqmH1*4`6lQ76-24OLI(KtevXqsM z*)y#Os?S1*=839+%o4(tm%9nfm@e+W)GpQvYN1(hberM9+$@G@PO&9uE!@kznV@}EfL5b^*#>pd>E)pH7My7JOFV+9~Zd*0000vQPBmB zqN3QbM^O;OilV3#>AiP&GqZcQLZ0Wmlauq#an89r^Z(!X&&{CtLe)*yrXD3cXRbe3l zI(9@#N(yc+TZYYR3t-VN9ko?eh~2##2MrBz($W(3^$l=ZoQK|eA8_SDIj%T3ATlx% zxjA(x&&k1k7Z)KK@b>mb(z_ZI zzI_W%H8q?#aRLb;A=tjD5b31P(E~G3Uss0=(th-?3Z?1k@NL~1_tve$sj*|>{%au$ z3JMS&9*(E}{>UbMM$Dg&pO@$3W<&*?o$?X2bt}$Jn1DMsDi9wOg#1^paO!v&KHR>I z+R92?m@xz4r_1n~jQ!V|HSliH0tfv|poL^SCiA;8XAXjT_QX3f#u*zMj31qeU{h0g z?Jh#fwQHy@DM7TWE5fHt!LYvRC`?SmtKeY#X<-3Rvc$EuwRp5=57O`5!{zhkNIZQS zcb%Q#tEq`qj(IqD?i@r1OOgHP5svoli(^5hm^(8ENtZ4m%-$YUvWb0;D z&S{|#KP}5g|E_6p{xKid7A?Z_{rjX8x=fq+h(;OXfJL#Ep(bC<7i+BuFjo{Jv)lt*^Lx*s~ z(GhoVRbptLbfn(Ai5N1U^V6qeq-i>e-oJ;Jx;j~-23!a$N5+E(XlQ7_)r;jQ%gn^v zvu6>xVFU7V>(H@93Z4Z7Am_;wi2C=(@uQ`PiHSj%HYrHHdKGUHY7n5Si*u7E!SDBC z93MIqx0WwQtcM5cs;dzbRfRX9q3~(d3ZY}hVAr-nWRdtMzP>opyEiIwb5T=PhKD%9Thsb__-D-odL`GaT4gf|(Pt$-7XG26AQGzmJTxS{&}) z9a)*R&{j*v+psX)TfZJ<85!8urVTnYPsVRtFr1fcx_U#GR8*j^n;_xbt@rzg}>WvKgO5 zMD1xR;@l?5#3eDLe_F2jA8IUO*dtH5zG*Y&qBwvPCaOj(eWAoA^GURl1aQ};KUNxJ ztP0(h+dk)8As=x`iGQRKKDS)dYptUs;&;V>Wvcw`-0cW54U=u-{6_TWI8DWX-YNmB zNzV&gj0)8t#Fd6z_n#F4v{d-wiFl76zTRP$NEB}#b6Md_Z&eQ95)P9PtG`5|4%U~* z=h>Id6h`pUYj@*;QQI{KC4t<+yPZkE*JB7PRC|{KSKb&Y;fEYGuyZB>+!pejz8Wo0 zQD_@U_{{mRV{4AvH&ub4Wb~6f&|>%7>tqD`X-XUgv!{3f;#;As7DH#mtyLf>8aq}= z_`3HJ2=$rntY3ck@roix!5Sv!Poy2&-}-`Lvs9l@S%{CAZ|HwKy2+PC#ukaL>amCW z$p+*7D~P|3gQ>B;uEM>QXVdm1I>Lx!H~U5pcKA}AdN&zb%W|4)I+{5fuBlL1F8 z+#2C`9@0d>eA%uc`@W?0U87Iv^C>g<*-Q2>X;5I}1GJU>PD`ochF{|WdeQ-u_`;Ko z1q7dHiqCO&`pOY|=gPjW-2LK5I@L`f0GkyyV4fvct51*w1U>!3>?i3=#EpOV^z~_U zs#A@~WkoKjPHj#MzDRUxK|+F5i>BSV!}MrPO#|MXJPDtcE%Ah$*RvizWI8nXP$?W{ ze^wG5I;2+`)0k9WE}oN%ii&!sFRQETna1Sx zB{wOX>C4QFTBb4Et0$v8I~$RkHo;FIU^>%gL?+XkB}897KX8C)OsY5U-L7OhlWI%j zP9JcI<4{-EfR`^{GHrRv%8KbpswJt8?5vrB%KUuXSh57i1`kGzyF1g4GwiaMZlwB= zYDcCUW2=xE6~%Ppv&U6TGgcKBGhKLY@?@qB3*NlJtraU2^q`N11`?qWR0~r5SMd5Z(|H$X&SYAT*Lh(?hdqs}QqXz#H*d!K3m0J8 zEe&Nv^Zj+R0wE;9QeH;1F0l`E>4F~|a+&_?s*@_!eZ1aFAkX6IapO=(awb&IeJcO_ z3b-^~0%w|=n;&WtZ_%H?=KGzRAguYB!sbGuscR#QZx8&+V1f&|4qX%(1KNBe2Fd4q zjxh9hEs$gUVIxJ&%?Eq0CIsOR&13{aIoMpd74rsDMo%fhKpxjx?d|36I(L|^P#`6Y zmLrfz{Xt)>)pTF#X~h$EPmvK0uk;Yw2Dtcqsix+r#uMiJw0*D6IL6YL=FAD3?{Jx_ z&V$l=Iqij5eY$&WS}66(8g0dRr;fA992{hRzO{_vV@G)iyV<+`uE%?2HCqRf?JB25 z#OE&a^R4xLN&JsSJBM!>`&&rM4ZK@c_aL~N|MdA}4Q6ycBJ=aD$poh$DZPgCPDveX z=VC%&dVgt|rv!KHtsS&Z4j-X}?;Eq{==XBCu@dgGaq+f;a`@NExQokB3QNZ4RAHBi za=37oD&Z@6e1a;zLLL|PQzk62RKQ!cQy>iZ%!0xE`Ur)aJ1G!cK3BqpE5DN`m<>_J zg_GJ#3F8M^i(y&+8#m>$u(sPRBY{DWXZMyH! zd^63Z$3Lq^XAN=QlIE3ZuCk=K4$;xkEQd+=ZMx6VJ(cF0=^jpVw7z?aVIW9F>hs?v_$I@8SLK zAMgF1=RPxg_H)kut+n=Ed&S;s!nHM(9^q2q0s!zxMHvbM`}T*1jS2q3=IyY+4&7Q- zLlyukV)1U^7~nIC3rtB4C>x>P0Uzkim0=nH;K>32en9|m1-|mz1^`zG0PMa20I?JR zc;fWAQAYwCz%)}+f&%vspX`>R1n>=xld^#e*en01DGu050RUyb3RG6tV|G8|y_4>A z#-VhPaE;-v!@eA*LtgxjuvGRw!uYMARFCi{aO_%MHdJ-}M|}EnPqS-2U3>Xr6Vv+zP3?L)o?q&^ zJ{Hh8KV0-`-MSe$1ix&3)pXb@F>q{-txreNt#zN9zagO{7s(Wz!EM(#PfYF@CTLJC zYh^cAA#(u7vJ=|}W1sl8Thk`&V5aanmc-nDb%##Jq0)+tO$n{Xf#mI$_-G&gMpAuf zU8DbkZbzv~EaegOZ}e8Mx4|X+eKeX3-ZF`*tdVs}+vN^7L6#l#nLb*ac37nJjZ&wt z2=)(~TG3=#yk%T!f}WMpw9B2^TM9+gVYI|tuPr5{-96z6QyZ0!aG3%-D1b=N_lA*I z5v2e!JKJz^eoty+^RsMJ5P|YKP@a8vm*;QQ6192?LK|^z(zsNjD19KUv=q0OL)Nx% zOKB=l!`jU@c6z@kGdqhs^rfi=$^yG`M7%4*cUy{vge;xd6siw6jU8KKW8Rz4arr$R zTcCj}o$4@-f0-%7k0?9$)w<}%(Z13#CG^pA2!j2Y_f5W1eA*<-h-_=a>RhlgGBc9qDysG`iC3b=I;4d(GNFlAKJ1`PLPaoY|+ut`2_{M)+5xaYHIeW$@Z4jfVv{P0?22s)}ED# zsXtB7wtsN2Yv0X0Y|O198V&31Oocht)=0)$jCjdajnd5awoI-L4f-w`7eK0`IzB!= zuvdPc79X#}X;@A1X)rj9o{^27=;(!kfr_jw%DwxXkh61TDg-XKbfC=^MItM%A*`h2 zuWogJ=i>+Qy$cwOzE}0^(SH4UXkL61W^AmX*XH(qr>spHfs&#uK(#TcC2cudZR63h zDCKn;PRdFY11Obj$QeTJr@~gS{bx6~NgOIGE1Q+|gc#-{RmsO+TwX3bcM~Lw z*ADH>A&OI`sGD0TALa0@wF&7GQXl@#W(cq_FoJqpJ@(k%-u`obAFh~p;Vo4)tVIE8 zqgI!&u%w7BgS~ZJ?zlNAf+L|N+?o?FSYsz2rb^| zvk=424;I$f*R{2^$F_nD8s(K4Go1OMpzQ?j&JbHsR4h^OFeWC&=PAWHZ)LczA{TF>crYl2ONqi$e9k#zO|bW{;=cIzkLgk%8(wo7 zHzqFq`Q34UIi1Dp^-En|VVlCFj!3MtZBk5tbJgmy-MAbY<7jQ|1 z?tIP8J-AZ0Coj$p76vmVy_B`IioSluBZd#9RB#&AMhy+AXAnIxuLd~%!j_#I*m!uX zZ!V5sH+#fw7eo+9WgR+CDGA^G&ck@a07WmFRI#$!%xWp8qyh=T9FC6VmHe*)v#Xwy zl7Xf>=AAQ{d@3vG1DZBrqr6U(+T~?hw;W!!^mcOAcLWL|o{9_5faPIitGxY>g_HZS z6py2BW94X9Thp|&jMJm!XEhDQ({TBPb9!Rzwzex^_1$gDy6^xB(un4H% z45tZx+H+4%PL9vY8hs#B89<<-v@M=EFq~i$$xB`TArlo9{q(i&w6!;e22WLIDSPkA z2n+!fjArv=!#a|5kU8iu7|**u=H@a|QBfffi2B#RU$OTLB(R1<8P_*Adq-0k*f!I{ zwnb&4h=?O1BG@Q>p0-`|@O&vLVPs_ueNm)YVSDcIoa6aGe}7o)Jzca}b|8O&7!~pwdA7#Rf5%QqY z#->L^;1+6S#lR^R4CP;_>W8`$~e$4`;D zw>|0d{3_`sLHk*=h#fvU^>gr8vYsS^;2mh84u06^-rOd$`mzQpwJm1nj9+wl{GVjD zOS+OMPuWFsf)V=>@vkMLkrD;cKR+*c(s}B8$w+VRCcg~f(*(4j7y{EBVYrVsf+eb2 zNn+=ECz*+x2g&1Wk8M4LywSj{CJXH!IQiS6@iMBP@ORaD8|sELiN`82>>#DUIA<># z!|4%0fya%1@%&2zv+G_$KkShJ?*QLRff4v6y{G>lRggt{7!_w3+oloWaOaA0wh@!u zj{wz)%z1R~r%gzC8C1!Q4md^Uk+*cYU7EaRArG(TJ%5LL4lQ!M+OKD46%0V9{@Bym5 zV}ssy&V2CqSVfvn*%<}f_LJ7Ce?fwB$)Yy;bp7~+sW)m;X696x_5^M_B#6D>y~KI+ zjK_=DDl?eg=iJZi7e1*xKQ@(z;mSa<3%xvcDnz4b<5H>1MzfaCbt6LCU1HaYQ!=Z| zv_S+)Z0U3Bjev@QnF}xC4$;bw%N$y({Xf)I_1JdM-#~*)ii0H@9E2P`P1?B(DWMFOE_yO;J@|;2TI-AF1zCW2VqNzcP0>e|R*3*%uXD6p9c?C4I(y ztt-2^Qd(P!&i~}aI>)Ww73S+38*!$Ammw!x1kXKYxY<|?mUz~W9lLsZB z!A!a!kb|xF7S_{9R5@URrkISl0n@YHTy6B~s@djndg$m@)6HRyc9^8s+0mfsUBpk@ zSNzS87@^2))DNgebwrE4e*G1rBqr$LKCYlCxR26wH732N=xmiCUb#L03i|GwOLV2Sy|Mko}xQ|}HBKre2OyOeYd;5&X_8 zIPoVIOcAyhG5R&qxl^q*%FHM!byiS?KJRdzwOGf<=<#HP;WmAb#Oly*A7d$ng$yvB!m!@wtT;iau|jbPjPxT!O-K!QnFJ_xnW@BRnut&cEc1 zxUaN&9)o_QWFLsl{*wR5x9_gU&7K43B8mtp_&3q}yfOesf9TgPo5C!UX-5;XwbYnl z4!3>Z`RHWY8YcQoHgd+0hM3xb68-+KjnR|2ngSr|OGgWygZZt`3zd8Y$~lGr>nn?! zQE$?uc(cKmW^*`TDC1?~f4`z*yMAFyZ@)m*{PnOm#tX~t89=OjEb`vU2jj({x;n|^ zO}LsDRsfG(hoD2${%eMG9GQ#1#+Kh&yimi_GHunMPFfU7Z}zNoOIm7mW)%TR*PE(~ z1E!>W1J1rBJM~g_Bt|RNtKSDmPb2JQE!P{4REU^TlayX|Vs2huU~jMD?Ck9D;OLHI z#)m!fc~Uj|HQX7q$MR4QCmTvaPWCR%mO*V&f>6*@2n7WNk?!tm$VN7vEU2aBGm~;0 z6jb8Z=4#k>3+n%Rt>ex#2U&*6zAv`R75@Rd#l@CYzA zKi@g$*ft!D_oRL+(@T9YLZjv0VPbJfelGSN<7;R!*FI{vOyg)zWb82f58M9LNp50p zPLBWVtl_I~VAeHYpP8A7q7e^y`SoC}JDl{hs7r6PSl*BHfcu%Y?>$1Qk$5r}R|{(f z@2!hV8S##@3krh2efu`(72;*u(9p2HwdJxIg|ngSxwD{n*-1`KDXS(eKKPJZ<_4WT zu2yhi5)S*9rh#26*-cI9%Imv7-i0s(brMU^)-_;8eDpjdnP@$J?6SX&riLqnj=IC% zeDRwmikq)3rSvhSkR3%vhVj&|UnY++CA}{oTSi8dqR#mlFi_U^BhNvc9ni)76E_%S)b~o&ucu-~B2p z`KmOUaL>1Opre^g)mx;4IPEaFHu2H5M00gTL4doe#4CH}>SjGR70EHw`r#Z*GA%rV3;|X3Vat(5+8^2qGD|HV zCNnkRooOf>Nf!H}Nh&-9yZC%wVYcg+Sjrp;>UQZ?!|AxHVr>6+E1q9iEs>flPASUF zW}aqg&yMSHBx-O*@%Ny?oV-{>#I3d7jOVi_%Wn(FtVc690*#vxU&{M7oOwM@5LUx! z(M#oOHLo}0ImkSYangR-%W|irG`r(WD*4e)v&LG}W=8kfXAJ20>ZrckonklfIeiIh zF(K!Et*oGcQKXf%Su<^tmzVb<7E_N=ZnrWxzqBfZ!=eQ6%#-4g5DSf8IYat@H_*f8 ze*|lNvDPz{mWj#9FcXuJKtd^HW|D{dpjA3TlDk3fRsUl?1K=#?imjmD=@?Z*V^}>? z;?h||isNUkELsH&Zkrg8{`V}<-)LIzoiY;O^hT^9PHTTJ z%10LzG(#MZOc5x2e0&t5&djWunfbM~$^6zM4>wz5_XPz{&oq0b`uc3LvbhM}Rs{XY zN^3nHeHoTTn2cdbWLERZv(`pCGdaPiMI0v)>Q?VD1xDkgkGW)VYgyyK!Q+d>b#e3#s1S6; z&G+?ne98;Oq!b|sG=h5O>TC>+U*bht?wbQRu;tZ;B zyb}GD@R@b*@u+S%Sy&_(b)A-S=R7vXi$yfFTF3OMLeZ8|a42|gxRAji^N*>V!LyUL zghYGQ(@oebF}p9mnh5|!Ixgbs4NpdS3jzLqkVikpvYV)f*}l31owT}=g21g@!6g{r zU|jy!=;675uSkxLJS?ZA=4Rbl zn)UNqt!EH*p+5tOUoD7+B;g^sd^PZiIs`qLceEUW5))H|i&JphiE`+LGlmI=>3{Ck zuCee$D;$?LU>&YD$k?%V^FH=Nr8RyzGW2(4_H?|PfSB4Jd81|D8J9paiSusg!M`u! z?S$rqF+xWIrn;$!n_aBquG(?UcCdQX0o9J_WUYJ;k3w*@@_~a2v*xz%@Oi>!*oa6U zRQ~GoaG+XWx~H!IP7F4CLSI7Tu3Go5?o|qQ`--+ivolGa()OY$f42yAerXGxl8K4B zqCZ#^fdsu{;`eY0uX#IROF~8rvr_MEGUFu))S+i#YTs2@W2?2X6pnuMuHndM{{wX@ zWgsmECYV1Nr04od6xJ%P-hWT)?i9avgKfTq{BCGpMt_6-&yh~{lENpXoFyhK8`g61 zYUvU8Xm;ycZB(bGjBhEvPibSHm3*^}k4kK)dKW__^@TbImi6Ut}$lOAL(*G zhKlh8@TDR5JwzUxZ^nikrbxJZ`hLvfpBAP0^+MP($C&d37=29h)7;sjGjTI}L?z2Pn22-Ebosm}I7*1?ExowSO%!VuLT|P8XTsY{_y0c5oXaLeu_@GV(i^v3aRu)5 zVHr^1-JMQji8z-S#GznH==ewOYM&~~kLsZh;+JI#3b4Hz11Z_GX%&NawX}}}>NFk8 z?>m&L9p0y&`Cf@S=Www&j3#yK0xfPF1qi$S)#wFQ5zoe8ovxd8i^3IWu@hzk7jv>t ztTl1`r`5Mz_nS8_mROtH$f1u^C}}rR&H@?KcE~(Oh$xcx%@A-ZT4K|GKr=1OJ?d zN^1by*obXM2Y0PgVb;_)VZ`_P@rp5>xqy(#Ro(B)E8*39wCUS$_6d2Zaqy3uXGjHo zqy-#lDQ50$33dPhJy+BMlpSOXPbe zOW;5A;&F1YmacrI34)&dmoyDs5C!lG3J3`B3qp7W2PiFEK?vc0L0;H+S^^L`xx`$l zKj4tee+|8asQ^|sc9x(5c#!r^JXUZw8*@ho7amayxTq*UpOBS^1>B6!%v`_4Sc%jDh!{2%V%YoGuC diff --git a/front/public/favicon.svg b/front/public/favicon.svg new file mode 100644 index 0000000000..916eb9316e --- /dev/null +++ b/front/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/front/public/manifest.json b/front/public/manifest.json deleted file mode 100644 index 1f2f141faf..0000000000 --- a/front/public/manifest.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "short_name": "React App", - "name": "Create React App Sample", - "icons": [ - { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} diff --git a/front/public/manifest.webmanifest b/front/public/manifest.webmanifest new file mode 100644 index 0000000000..c31cb93b8c --- /dev/null +++ b/front/public/manifest.webmanifest @@ -0,0 +1,14 @@ +{ + "icons": [ + { + "src": "android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} From 338b2a0114af8ed27aefe4f26c83986a2f7b1267 Mon Sep 17 00:00:00 2001 From: JulianaJM <37509748+JulianaJM@users.noreply.github.com> Date: Tue, 5 Nov 2024 10:28:37 +0100 Subject: [PATCH 04/74] [tra-13234]Ajouter des mentions lors des choix transit et groupement (#3712) --- front/src/form/bsda/stepper/steps/Type.tsx | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/front/src/form/bsda/stepper/steps/Type.tsx b/front/src/form/bsda/stepper/steps/Type.tsx index 73deb05592..42fe1c1f59 100644 --- a/front/src/form/bsda/stepper/steps/Type.tsx +++ b/front/src/form/bsda/stepper/steps/Type.tsx @@ -120,10 +120,21 @@ export function Type({ disabled }: Props) {

{BsdaType.Gathering === type && ( - + <> +

+ Sélectionner des BSDA ayant le même code déchet et le même + excutoire +

+ + )} {BsdaType.Reshipment === type && ( - + <> +

+ Sélectionner 1 seul BSDA à réexpédier +

+ + )}
From 3344d18cca16c64b969196822e5cf310fbda8320 Mon Sep 17 00:00:00 2001 From: GaelFerrand <45355989+GaelFerrand@users.noreply.github.com> Date: Tue, 5 Nov 2024 11:43:11 +0100 Subject: [PATCH 05/74] =?UTF-8?q?[TRA-15371]=20Affichage=20de=20l'ic=C3=B4?= =?UTF-8?q?ne=20d'immatriculation=20dans=20l'onglet=20"A=20Collecter"=20(#?= =?UTF-8?q?3715)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dashboard/Components/BsdCard/BsdCard.tsx | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/front/src/Apps/Dashboard/Components/BsdCard/BsdCard.tsx b/front/src/Apps/Dashboard/Components/BsdCard/BsdCard.tsx index e5b3687edf..c7b26ba86f 100644 --- a/front/src/Apps/Dashboard/Components/BsdCard/BsdCard.tsx +++ b/front/src/Apps/Dashboard/Components/BsdCard/BsdCard.tsx @@ -60,6 +60,28 @@ import { getCurrentTransporterInfos } from "../../bsdMapper"; import { isDefined } from "../../../../common/helper"; import { useCloneBsd } from "../Clone/useCloneBsd"; +const shouldDisplayTransporterNumberPlate = ( + currentTransporterInfos, + isToCollectTab +) => { + if (!currentTransporterInfos) return false; + + const isRoad = + currentTransporterInfos.transporterMode === TransportMode.Road || + // permet de gérer un trou dans la raquette en terme de validation des données + // qui ne rend pas le mode de transport obligatoire à la signature transporteur + // en attente de correction Cf ticket tra-14517 + !currentTransporterInfos.transporterMode; + + if (!isRoad) return false; + + const platesAreDefined = Boolean( + currentTransporterInfos?.transporterNumberPlate?.length + ); + + return platesAreDefined || isToCollectTab; +}; + function BsdCard({ bsd, posInSet = 0, @@ -206,16 +228,10 @@ function BsdCard({ (isCollectedTab && !!currentTransporterInfos?.transporterCustomInfo?.length)); - // display the transporter's number plate if: - // - the mode of transport is ROAD - const displayTransporterNumberPlate = - !!currentTransporterInfos && - (currentTransporterInfos.transporterMode === TransportMode.Road || - // permet de gérer un trou dans la raquette en terme de validation des données - // qui ne rend pas le mode de transport obligatoire à la signature transporteur - // en attente de correction Cf ticket tra-14517 - !currentTransporterInfos.transporterMode) && - !!currentTransporterInfos?.transporterNumberPlate?.length; + const displayTransporterNumberPlate = shouldDisplayTransporterNumberPlate( + currentTransporterInfos, + isToCollectTab + ); const handleValidationClick = ( _: React.MouseEvent From 7c89ee2975d9e7e45d734c1c5c78360c4e377e7b Mon Sep 17 00:00:00 2001 From: Riron Date: Tue, 5 Nov 2024 23:02:00 +0100 Subject: [PATCH 06/74] [tra-14823] - Import SSD (#3632) * wip import * Try nx update * Enhance frontend modal * Add ignored lines infos * Dont generate package.json to avoid errors * Add company switcher * Fix line selection * Fix metadata headers * Add onKeyDown * Various fixes & incoming waste schema * Validation fixes * Fix header link * Fix signed url * Enhance schema & migration --- .eslintrc.json | 7 +- .github/workflows/e2e.yml | 28 +- .github/workflows/integration-tests.yml | 12 +- .gitignore | 1 + .prettierignore | 3 +- apps/api/project.json | 2 +- apps/cron/project.json | 2 +- apps/doc/docusaurus.config.js | 2 +- apps/notifier/project.json | 2 +- .../project.json | 2 +- apps/queues-bulk-indexation/project.json | 2 +- apps/queues-gerico/project.json | 2 +- apps/queues-indexation/project.json | 2 +- apps/queues-runner/project.json | 2 +- apps/queues-runner/src/main.ts | 5 +- apps/queues-webhooks/project.json | 2 +- apps/ui/project.json | 2 +- apps/ui/src/main.ts | 2 +- back/src/__tests__/factories.ts | 2 +- back/src/bsds/indexation/reindexBsdsUtils.ts | 2 +- .../bsds/resolvers/mutations/reindexBsds.ts | 2 +- back/src/bsffs/resolvers/InitialBsff.ts | 2 +- back/src/common/validation/recipify.ts | 6 +- .../src/common/validation/zod/transformers.ts | 2 +- back/src/companies/geo/getCodeCommune.ts | 2 +- back/src/companies/recipify.ts | 2 +- .../createAnonymousCompanyFromPDF.helpers.ts | 4 +- .../resolvers/queries/companyExhaustive.ts | 4 +- .../resolvers/queries/companyDigestPdf.ts | 2 +- back/src/forms/database.ts | 1 + .../forms/resolvers/mutations/createForm.ts | 24 +- back/src/forms/resolvers/queries/stats.ts | 9 +- back/src/index.ts | 6 +- back/src/permissions/permissions.ts | 5 +- back/src/queue/bull-board.ts | 4 +- .../__tests__/indexFavorites.integration.ts | 9 +- .../processRegistryImport.integration.ts | 325 + back/src/queue/jobs/index.ts | 1 + back/src/queue/jobs/processRegistryImport.ts | 135 + back/src/queue/producers/registryImport.ts | 25 + back/src/registry/resolvers/Mutation.ts | 8 + back/src/registry/resolvers/Query.ts | 10 +- .../resolvers/RegistryImportAssociation.ts | 25 + back/src/registry/resolvers/index.ts | 6 +- .../resolvers/mutations/addToSsdRegistry.ts | 46 + .../resolvers/mutations/importFile.ts | 58 + .../queries/registryDownloadSignedUrl.ts | 46 + .../resolvers/queries/registryImport.ts | 33 + .../resolvers/queries/registryImports.ts | 61 + .../queries/registryUploadSignedUrl.ts | 32 + .../registry/typeDefs/registry.enums.graphql | 26 + .../registry/typeDefs/registry.inputs.graphql | 34 + .../typeDefs/registry.mutations.graphql | 8 + .../typeDefs/registry.objects.graphql | 46 + .../typeDefs/registry.queries.graphql | 61 + .../resolvers/queries/registryDelegations.ts | 14 +- .../utils/registryDelegations.utils.ts | 41 +- .../private/registryDelegation.inputs.graphql | 9 + .../validation/__tests__/index.test.ts | 2 +- .../registryDelegation/validation/schema.ts | 12 +- back/src/reset.d.ts | 2 +- .../prisma/sendVerificationCodeLetters.ts | 2 +- back/src/users/bulk-creation/index.ts | 2 +- back/src/users/bulk-creation/types.ts | 1 + back/src/users/bulk-creation/validations.ts | 2 +- .../queries/__tests__/me.integration.ts | 3 +- .../__tests__/myCompanies.integration.ts | 3 +- back/src/users/typeDefs/user.enums.graphql | 2 + docker-compose.yml | 14 + front/.eslintrc.json | 5 +- front/.storybook/main.ts | 12 +- front/.storybook/preview.ts | 1 + front/project.json | 7 +- .../common/Components/SideBar/sidebar.scss | 3 +- .../Apps/common/Components/layout/Header.tsx | 49 +- .../Components/layout/LayoutContainer.tsx | 20 + .../common/Components/search/WasteTree.tsx | 4 +- .../Components/search/WasteTreeModal.tsx | 2 +- front/src/Apps/routes.ts | 7 +- .../BulkprofilesUpdateAdmin.tsx | 2 +- front/src/common/helper.ts | 2 +- .../SignEmissionFormModalContent.tsx | 2 +- .../SignTransportFormModalContent.tsx | 2 +- .../src/dashboard/registry/CompanyImports.tsx | 157 + front/src/dashboard/registry/ImportModal.tsx | 372 + front/src/dashboard/registry/MyImports.tsx | 201 + .../registry/RegistryCompanySwitcher.tsx | 198 + front/src/dashboard/registry/RegistryMenu.tsx | 56 + front/src/dashboard/registry/shared.tsx | 98 + libs/back/env/src/index.ts | 6 +- libs/back/object-creator/project.json | 2 +- libs/back/partial-backup/project.json | 2 +- libs/back/prisma/src/index.ts | 2 +- .../migration.sql | 93 + .../migration.sql | 108 + libs/back/prisma/src/schema.prisma | 220 +- libs/back/registry/.eslintrc.json | 30 + libs/back/registry/README.md | 1 + libs/back/registry/jest.config.ts | 11 + libs/back/registry/project.json | 20 + libs/back/registry/src/config.ts | 12 + libs/back/registry/src/database.ts | 87 + libs/back/registry/src/import.ts | 140 + .../registry/src/incomingWaste/constants.ts | 90 + .../registry/src/incomingWaste/database.ts | 64 + .../src/incomingWaste/validation/index.ts | 37 + .../incomingWaste/validation/refinement.ts | 174 + .../src/incomingWaste/validation/schema.ts | 231 + .../src/incomingWaste/validation/transform.ts | 33 + libs/back/registry/src/index.ts | 5 + libs/back/registry/src/options.ts | 56 + libs/back/registry/src/s3.ts | 137 + libs/back/registry/src/shared/helpers.ts | 21 + libs/back/registry/src/shared/refinement.ts | 73 + libs/back/registry/src/shared/schemas.ts | 216 + libs/back/registry/src/shared/transform.ts | 27 + libs/back/registry/src/shared/ttlCache.ts | 39 + libs/back/registry/src/ssd/constants.ts | 29 + libs/back/registry/src/ssd/database.ts | 58 + .../back/registry/src/ssd/validation/index.ts | 19 + .../registry/src/ssd/validation/refinement.ts | 151 + .../registry/src/ssd/validation/schema.ts | 204 + .../registry/src/ssd/validation/transform.ts | 34 + libs/back/registry/src/transformers.ts | 102 + libs/back/registry/src/zodErrors.ts | 39 + libs/back/registry/tsconfig.json | 16 + libs/back/registry/tsconfig.lib.json | 11 + libs/back/registry/tsconfig.spec.json | 15 + ...0240802142645389_bsda_draft_restriction.ts | 4 +- ...241009174516425_bsvhu_draft_restriction.ts | 4 +- libs/back/tracer/src/pkg.ts | 2 +- libs/shared/constants/src/BALE.ts | 124 + .../src/PROCESSING_AND_REUSE_OPERATIONS.ts | 5 +- .../constants/src/PROCESSING_OPERATIONS.ts | 20 +- libs/shared/constants/src/WASTES.ts | 27 +- libs/shared/constants/src/index.ts | 1 + nx.json | 7 +- package-lock.json | 23506 ++++++++-------- package.json | 62 +- tsconfig.base.json | 1 + 140 files changed, 16503 insertions(+), 12338 deletions(-) create mode 100644 back/src/queue/jobs/__tests__/processRegistryImport.integration.ts create mode 100644 back/src/queue/jobs/processRegistryImport.ts create mode 100644 back/src/queue/producers/registryImport.ts create mode 100644 back/src/registry/resolvers/Mutation.ts create mode 100644 back/src/registry/resolvers/RegistryImportAssociation.ts create mode 100644 back/src/registry/resolvers/mutations/addToSsdRegistry.ts create mode 100644 back/src/registry/resolvers/mutations/importFile.ts create mode 100644 back/src/registry/resolvers/queries/registryDownloadSignedUrl.ts create mode 100644 back/src/registry/resolvers/queries/registryImport.ts create mode 100644 back/src/registry/resolvers/queries/registryImports.ts create mode 100644 back/src/registry/resolvers/queries/registryUploadSignedUrl.ts create mode 100644 back/src/registry/typeDefs/registry.mutations.graphql create mode 100644 front/src/dashboard/registry/CompanyImports.tsx create mode 100644 front/src/dashboard/registry/ImportModal.tsx create mode 100644 front/src/dashboard/registry/MyImports.tsx create mode 100644 front/src/dashboard/registry/RegistryCompanySwitcher.tsx create mode 100644 front/src/dashboard/registry/RegistryMenu.tsx create mode 100644 front/src/dashboard/registry/shared.tsx create mode 100644 libs/back/prisma/src/migrations/20241023150420_add_registry_ssd/migration.sql create mode 100644 libs/back/prisma/src/migrations/20241105204323_add_registry_incoming_waste/migration.sql create mode 100644 libs/back/registry/.eslintrc.json create mode 100644 libs/back/registry/README.md create mode 100644 libs/back/registry/jest.config.ts create mode 100644 libs/back/registry/project.json create mode 100644 libs/back/registry/src/config.ts create mode 100644 libs/back/registry/src/database.ts create mode 100644 libs/back/registry/src/import.ts create mode 100644 libs/back/registry/src/incomingWaste/constants.ts create mode 100644 libs/back/registry/src/incomingWaste/database.ts create mode 100644 libs/back/registry/src/incomingWaste/validation/index.ts create mode 100644 libs/back/registry/src/incomingWaste/validation/refinement.ts create mode 100644 libs/back/registry/src/incomingWaste/validation/schema.ts create mode 100644 libs/back/registry/src/incomingWaste/validation/transform.ts create mode 100644 libs/back/registry/src/index.ts create mode 100644 libs/back/registry/src/options.ts create mode 100644 libs/back/registry/src/s3.ts create mode 100644 libs/back/registry/src/shared/helpers.ts create mode 100644 libs/back/registry/src/shared/refinement.ts create mode 100644 libs/back/registry/src/shared/schemas.ts create mode 100644 libs/back/registry/src/shared/transform.ts create mode 100644 libs/back/registry/src/shared/ttlCache.ts create mode 100644 libs/back/registry/src/ssd/constants.ts create mode 100644 libs/back/registry/src/ssd/database.ts create mode 100644 libs/back/registry/src/ssd/validation/index.ts create mode 100644 libs/back/registry/src/ssd/validation/refinement.ts create mode 100644 libs/back/registry/src/ssd/validation/schema.ts create mode 100644 libs/back/registry/src/ssd/validation/transform.ts create mode 100644 libs/back/registry/src/transformers.ts create mode 100644 libs/back/registry/src/zodErrors.ts create mode 100644 libs/back/registry/tsconfig.json create mode 100644 libs/back/registry/tsconfig.lib.json create mode 100644 libs/back/registry/tsconfig.spec.json create mode 100644 libs/shared/constants/src/BALE.ts diff --git a/.eslintrc.json b/.eslintrc.json index 4147bfee55..c0e5d07528 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -35,6 +35,9 @@ "args": "after-used", "varsIgnorePattern": "^_", "argsIgnorePattern": "^_", + "caughtErrors": "all", + "caughtErrorsIgnorePattern": "^_", + "destructuredArrayIgnorePattern": "^_", "ignoreRestSiblings": true } ] @@ -43,7 +46,9 @@ { "files": ["*.js", "*.jsx"], "extends": ["plugin:@nx/javascript"], - "rules": {} + "rules": { + "no-extra-semi": "off" + } }, { "files": [ diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 3fd919dad4..9d2e8f1ff2 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -47,7 +47,7 @@ jobs: npx nx run notifier:serve >> /tmp/td-notifier.log & sleep 1s npx nx run front:serve >> /tmp/td-front.log & - sleep 1s + sleep 20s # Wait - name: Wait until the API starts @@ -79,13 +79,13 @@ jobs: # Show logs # - name: Show logs - # run: | - # cat /tmp/td-api.log - # cat /tmp/td-queues-indexation.log - # cat /tmp/td-queues-webhooks.log - # cat /tmp/td-queues-runner.log - # cat /tmp/td-notifier.log - # cat /tmp/td-front.log + # run: | + # cat /tmp/td-api.log + # cat /tmp/td-queues-indexation.log + # cat /tmp/td-queues-webhooks.log + # cat /tmp/td-queues-runner.log + # cat /tmp/td-notifier.log + # cat /tmp/td-front.log # Playwright - name: Install Playwright Browsers @@ -157,11 +157,13 @@ env: TRELLO_ALERTS_LIST_ID: unset # S3 - S3_ENDPOINT: unset - S3_REGION: unset - S3_ACCESS_KEY_ID: unset - S3_SECRET_ACCESS_KEY: unset + S3_ENDPOINT: http://localhost:9000 + S3_REGION: fr-par S3_BUCKET: unset + S3_ACCESS_KEY_ID: trackdechets + S3_SECRET_ACCESS_KEY: password + S3_REGISTRY_ERRORS_BUCKET: registry-errors-integration + S3_REGISTRY_IMPORTS_BUCKET: registry-imports-integration S3_BSD_TEMPLATES_ACCESS_KEY_ID: unset S3_BSD_TEMPLATES_SECRET_ACCESS_KEY: unset @@ -276,4 +278,4 @@ env: GERICO_API_URL: http://gerico.test/api GERICO_API_KEY: xyz GERICO_WEBHOOK_SLUG: secret-slug - GERICO_WEBHOOK_TOKEN: abcdef \ No newline at end of file + GERICO_WEBHOOK_TOKEN: abcdef diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index b459231b23..91a9cd63b2 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -27,6 +27,11 @@ jobs: npx nx run back:codegen npx nx run @td/prisma:generate TERM=xterm bash ./scripts/deploy-db.sh + - name: Create MinIO buckets + run: | + docker exec trackdechets-minio-1 mc alias set myminio http://localhost:9000 trackdechets password + docker exec trackdechets-minio-1 mc mb myminio/"$S3_REGISTRY_ERRORS_BUCKET" + docker exec trackdechets-minio-1 mc mb myminio/"$S3_REGISTRY_IMPORTS_BUCKET" - name: Start queues run: | npx nx run-many -t serve --projects=tag:backend:queues --parallel=6 --configuration=integration & @@ -108,4 +113,9 @@ env: WEBHOOK_TOKEN_ENCRYPTION_KEY: abcdefgh12345678abcdefgh12345678 GERICO_WEBHOOK_SLUG: secret-slug-lorem GERICO_WEBHOOK_TOKEN: wxcfdzr - \ No newline at end of file + S3_ENDPOINT: http://localhost:9000 + S3_REGION: fr-par + S3_ACCESS_KEY_ID: trackdechets + S3_SECRET_ACCESS_KEY: password + S3_REGISTRY_ERRORS_BUCKET: registry-errors-integration + S3_REGISTRY_IMPORTS_BUCKET: registry-imports-integration diff --git a/.gitignore b/.gitignore index 37ae01ea32..1ed4c1bd1f 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ docker-compose.override.yml /dist /out-tsc .nx/cache +.nx/workspace-data generated .DS_Store diff --git a/.prettierignore b/.prettierignore index f0e7155c37..0704014bec 100644 --- a/.prettierignore +++ b/.prettierignore @@ -8,4 +8,5 @@ front/public/dsfr/ generated/ .terraform/ /.nx/cache -.docusaurus/ \ No newline at end of file +.docusaurus/ +/.nx/workspace-data \ No newline at end of file diff --git a/apps/api/project.json b/apps/api/project.json index 36b10565b0..70182c2205 100644 --- a/apps/api/project.json +++ b/apps/api/project.json @@ -44,7 +44,7 @@ "output": "./libs/back/prisma/src" } ], - "generatePackageJson": true, + "generatePackageJson": false, "esbuildOptions": { "sourcemap": true, "outExtension": { diff --git a/apps/cron/project.json b/apps/cron/project.json index 3162deeba9..26984d6ec1 100644 --- a/apps/cron/project.json +++ b/apps/cron/project.json @@ -44,7 +44,7 @@ "output": "./libs/back/prisma/src" } ], - "generatePackageJson": true, + "generatePackageJson": false, "esbuildOptions": { "sourcemap": true, "outExtension": { diff --git a/apps/doc/docusaurus.config.js b/apps/doc/docusaurus.config.js index 5fd08c1a9d..42ea57327c 100644 --- a/apps/doc/docusaurus.config.js +++ b/apps/doc/docusaurus.config.js @@ -177,7 +177,7 @@ module.exports = { "docusaurus-graphql-plugin", { id: "registry", - schema: "../../back/src/{scalars,common,registry}/typeDefs/*.graphql", + schema: "../../back/src/{scalars,common,users,companies,registry}/typeDefs/*.graphql", routeBasePath: "/reference/api-reference/registre" } ], diff --git a/apps/notifier/project.json b/apps/notifier/project.json index 54e25b6fcb..ff9a24a927 100644 --- a/apps/notifier/project.json +++ b/apps/notifier/project.json @@ -44,7 +44,7 @@ "output": "./libs/back/prisma/src" } ], - "generatePackageJson": true, + "generatePackageJson": false, "esbuildOptions": { "sourcemap": true, "outExtension": { diff --git a/apps/queues-bulk-indexation-master/project.json b/apps/queues-bulk-indexation-master/project.json index de388006c2..602cd9b574 100644 --- a/apps/queues-bulk-indexation-master/project.json +++ b/apps/queues-bulk-indexation-master/project.json @@ -44,7 +44,7 @@ "output": "./libs/back/prisma/src" } ], - "generatePackageJson": true, + "generatePackageJson": false, "esbuildOptions": { "sourcemap": true, "outExtension": { diff --git a/apps/queues-bulk-indexation/project.json b/apps/queues-bulk-indexation/project.json index 6c94d2cde7..76efe4e136 100644 --- a/apps/queues-bulk-indexation/project.json +++ b/apps/queues-bulk-indexation/project.json @@ -44,7 +44,7 @@ "output": "./libs/back/prisma/src" } ], - "generatePackageJson": true, + "generatePackageJson": false, "esbuildOptions": { "sourcemap": true, "outExtension": { diff --git a/apps/queues-gerico/project.json b/apps/queues-gerico/project.json index 64680970fe..b413c6825a 100644 --- a/apps/queues-gerico/project.json +++ b/apps/queues-gerico/project.json @@ -44,7 +44,7 @@ "output": "./libs/back/prisma/src" } ], - "generatePackageJson": true, + "generatePackageJson": false, "esbuildOptions": { "sourcemap": true, "outExtension": { diff --git a/apps/queues-indexation/project.json b/apps/queues-indexation/project.json index 2fe8790fe9..55ae7dac2b 100644 --- a/apps/queues-indexation/project.json +++ b/apps/queues-indexation/project.json @@ -44,7 +44,7 @@ "output": "./libs/back/prisma/src" } ], - "generatePackageJson": true, + "generatePackageJson": false, "esbuildOptions": { "sourcemap": true, "outExtension": { diff --git a/apps/queues-runner/project.json b/apps/queues-runner/project.json index f68a963ef7..adb0aa38a3 100644 --- a/apps/queues-runner/project.json +++ b/apps/queues-runner/project.json @@ -44,7 +44,7 @@ "output": "./libs/back/prisma/src" } ], - "generatePackageJson": true, + "generatePackageJson": false, "esbuildOptions": { "sourcemap": true, "outExtension": { diff --git a/apps/queues-runner/src/main.ts b/apps/queues-runner/src/main.ts index 365ee355c6..751aa719eb 100644 --- a/apps/queues-runner/src/main.ts +++ b/apps/queues-runner/src/main.ts @@ -12,7 +12,9 @@ import { administrativeTransferQueue, processAdministrativeTransferJob, updateAppendix2Queue, - updateAppendix2Job + updateAppendix2Job, + registryImportQueue, + processRegistryImportJob } from "back"; import { schema } from "@td/env"; @@ -35,6 +37,7 @@ function startConsumers() { operationHooksQueue.process(operationHookJob); administrativeTransferQueue.process(processAdministrativeTransferJob); updateAppendix2Queue.process(updateAppendix2Job); + registryImportQueue.process(processRegistryImportJob); } startConsumers(); diff --git a/apps/queues-webhooks/project.json b/apps/queues-webhooks/project.json index c9723a4d69..83d33bde03 100644 --- a/apps/queues-webhooks/project.json +++ b/apps/queues-webhooks/project.json @@ -44,7 +44,7 @@ "output": "./libs/back/prisma/src" } ], - "generatePackageJson": true, + "generatePackageJson": false, "esbuildOptions": { "sourcemap": true, "outExtension": { diff --git a/apps/ui/project.json b/apps/ui/project.json index 0724bec864..288391bb31 100644 --- a/apps/ui/project.json +++ b/apps/ui/project.json @@ -22,7 +22,7 @@ "main": "apps/ui/src/main.ts", "tsConfig": "apps/ui/tsconfig.app.json", "assets": ["apps/ui/src/assets"], - "generatePackageJson": true, + "generatePackageJson": false, "esbuildOptions": { "sourcemap": true, "outExtension": { diff --git a/apps/ui/src/main.ts b/apps/ui/src/main.ts index cee2856098..52487fce9b 100644 --- a/apps/ui/src/main.ts +++ b/apps/ui/src/main.ts @@ -87,7 +87,7 @@ app.post("/sentry", async function (req, res) { // Relay response from Sentry servers to front end sentryResponse.headers.forEach(h => res.setHeader(h[0], h[1])); res.status(sentryResponse.status).send(sentryResponse.body); - } catch (err) { + } catch (_) { return res.status(400).json({ status: "invalid request" }); } }); diff --git a/back/src/__tests__/factories.ts b/back/src/__tests__/factories.ts index 348b153e08..0aeae614c8 100644 --- a/back/src/__tests__/factories.ts +++ b/back/src/__tests__/factories.ts @@ -436,7 +436,7 @@ export const upsertBaseSiret = async siret => { contactPhone: `+${siret}` } }); - } catch (err) { + } catch (_) { // Must have been already created (race condition). Just ignore } } diff --git a/back/src/bsds/indexation/reindexBsdsUtils.ts b/back/src/bsds/indexation/reindexBsdsUtils.ts index 2789b7f3e0..78a7a00e8e 100644 --- a/back/src/bsds/indexation/reindexBsdsUtils.ts +++ b/back/src/bsds/indexation/reindexBsdsUtils.ts @@ -64,7 +64,7 @@ export const toBsdId = (chunk: string) => { const suffix = extractSuffix(prefix, rest2); return `${prefix}-${date}-${suffix}`; - } catch (e) { + } catch (_) { throw new UserInputError( `"${chunk}" n'est pas un identifiant de bordereau valide` ); diff --git a/back/src/bsds/resolvers/mutations/reindexBsds.ts b/back/src/bsds/resolvers/mutations/reindexBsds.ts index 855bb41ce9..6a21d2d36b 100644 --- a/back/src/bsds/resolvers/mutations/reindexBsds.ts +++ b/back/src/bsds/resolvers/mutations/reindexBsds.ts @@ -21,7 +21,7 @@ const reindexBsdsResolver: MutationResolvers["reindexBsds"] = async ( bsdIds.map(async bsdId => { try { await reindex(bsdId, success => success); - } catch (e) { + } catch (_) { throw new Error(bsdId); } }) diff --git a/back/src/bsffs/resolvers/InitialBsff.ts b/back/src/bsffs/resolvers/InitialBsff.ts index d941435fa5..a7935a5a57 100644 --- a/back/src/bsffs/resolvers/InitialBsff.ts +++ b/back/src/bsffs/resolvers/InitialBsff.ts @@ -15,7 +15,7 @@ export const InitialBsff: BsffResolvers = { }); try { await checkCanRead(user!, bsff!); - } catch (err) { + } catch (_) { throw new ForbiddenError( `Vous ne pouvez pas accéder au champ "emitter" du bordereau initial ${id}` ); diff --git a/back/src/common/validation/recipify.ts b/back/src/common/validation/recipify.ts index 4543412dbd..33d70a79d1 100644 --- a/back/src/common/validation/recipify.ts +++ b/back/src/common/validation/recipify.ts @@ -41,7 +41,7 @@ export const buildRecipify = ( } }) .transporterReceipt(); - } catch (error) { + } catch (_) { // do nothing } } else if (role === CompanyRole.Broker) { @@ -53,7 +53,7 @@ export const buildRecipify = ( } }) .brokerReceipt(); - } catch (error) { + } catch (_) { // do nothing } } else if (role === CompanyRole.Trader) { @@ -65,7 +65,7 @@ export const buildRecipify = ( } }) .traderReceipt(); - } catch (error) { + } catch (_) { // do nothing } } diff --git a/back/src/common/validation/zod/transformers.ts b/back/src/common/validation/zod/transformers.ts index ddf977a645..121036c83f 100644 --- a/back/src/common/validation/zod/transformers.ts +++ b/back/src/common/validation/zod/transformers.ts @@ -91,7 +91,7 @@ export async function recipifyBsdTransporter( transporterReceipt?.validityLimit ?? null, transporterRecepisseDepartment: transporterReceipt?.department ?? null }; - } catch (error) { + } catch (_) { // do nothing } } diff --git a/back/src/companies/geo/getCodeCommune.ts b/back/src/companies/geo/getCodeCommune.ts index 7692e02550..18cc8292a1 100644 --- a/back/src/companies/geo/getCodeCommune.ts +++ b/back/src/companies/geo/getCodeCommune.ts @@ -67,7 +67,7 @@ export async function getCodeCommune(address: string) { } return null; - } catch (e) { + } catch (_) { logger.error( `Error while trying to retrieve codeCommune for address: "${address}"` ); diff --git a/back/src/companies/recipify.ts b/back/src/companies/recipify.ts index 0bf6075b19..24955943ea 100644 --- a/back/src/companies/recipify.ts +++ b/back/src/companies/recipify.ts @@ -39,7 +39,7 @@ export async function findCompanyFailFast(orgId: string) { try { return Promise.race([findCompany(where), raceWith]); - } catch (e) { + } catch (_) { return null; } } diff --git a/back/src/companies/resolvers/mutations/createAnonymousCompanyFromPDF.helpers.ts b/back/src/companies/resolvers/mutations/createAnonymousCompanyFromPDF.helpers.ts index 768a5de380..002efd1180 100644 --- a/back/src/companies/resolvers/mutations/createAnonymousCompanyFromPDF.helpers.ts +++ b/back/src/companies/resolvers/mutations/createAnonymousCompanyFromPDF.helpers.ts @@ -304,7 +304,7 @@ export const parseBase64 = async (pdf: string): Promise => { }); return data; - } catch (e) { + } catch (_) { throw new UserInputError( "Le fichier téléchargé est illisible ou n'est pas un certificat valide" ); @@ -336,7 +336,7 @@ export const validateAndExtractSireneDataFromPDFInBase64 = async ( // Get data data = extractData(text); - } catch (e) { + } catch (_) { throw new UserInputError( "Le fichier téléchargé est illisible ou n'est pas un certificat valide" ); diff --git a/back/src/companies/resolvers/queries/companyExhaustive.ts b/back/src/companies/resolvers/queries/companyExhaustive.ts index fe23d7ca42..ef9f419ba2 100644 --- a/back/src/companies/resolvers/queries/companyExhaustive.ts +++ b/back/src/companies/resolvers/queries/companyExhaustive.ts @@ -102,14 +102,14 @@ const companyExhaustiveResolvers: QueryResolvers["companyExhaustive"] = async ( let esCompany; try { esCompany = await searchCompanyTD(siret); - } catch (e) { + } catch (_) { // } let sireneCompany; try { sireneCompany = await searchCompanySirene(siret); - } catch (e) { + } catch (_) { // } diff --git a/back/src/companydigest/resolvers/queries/companyDigestPdf.ts b/back/src/companydigest/resolvers/queries/companyDigestPdf.ts index 9108062bb5..f81b6df754 100644 --- a/back/src/companydigest/resolvers/queries/companyDigestPdf.ts +++ b/back/src/companydigest/resolvers/queries/companyDigestPdf.ts @@ -41,7 +41,7 @@ export const companyDigestPdfDownloadHandler: DownloadHandler {} } } @@ -23,13 +23,15 @@ export { BsdUpdateQueueItem, updatesQueue } from "./queue/producers/bsdUpdate"; export { operationHooksQueue } from "./queue/producers/operationHook"; export { administrativeTransferQueue } from "./queue/producers/administrativeTransfer"; export { updateAppendix2Queue } from "./queue/producers/updateAppendix2"; +export { registryImportQueue } from "./queue/producers/registryImport"; export { indexBsdJob, operationHookJob, updateAppendix2Job, sendMailJob, postGericoJob, - processAdministrativeTransferJob + processAdministrativeTransferJob, + processRegistryImportJob } from "./queue/jobs"; export { diff --git a/back/src/permissions/permissions.ts b/back/src/permissions/permissions.ts index 5ef8e63646..73584fd33d 100644 --- a/back/src/permissions/permissions.ts +++ b/back/src/permissions/permissions.ts @@ -28,6 +28,7 @@ export enum Permission { BsdCanSignOperation = "BsdCanSign:Operation", BsdCanRevise = "BsdCanRevise", RegistryCanRead = "RegistryCanRead", + RegistryCanImport = "RegistryCanImport", CompanyCanRead = "CompanyCanRead", CompanyCanUpdate = "CompanyCanUpdate", CompanyCanVerify = "CompanyCanVerify", @@ -52,6 +53,7 @@ export function toGraphQLPermission(permission: Permission): UserPermission { [Permission.BsdCanSignOperation]: "BSD_CAN_SIGN_OPERATION", [Permission.BsdCanRevise]: "BSD_CAN_REVISE", [Permission.RegistryCanRead]: "REGISTRY_CAN_READ", + [Permission.RegistryCanImport]: "REGISTRY_CAN_IMPORT", [Permission.CompanyCanRead]: "COMPANY_CAN_READ", [Permission.CompanyCanUpdate]: "COMPANY_CAN_UPDATE", [Permission.CompanyCanVerify]: "COMPANY_CAN_VERIFY", @@ -99,7 +101,8 @@ const memberPermissions = [ Permission.BsdCanSignAcceptation, Permission.BsdCanSignOperation, Permission.BsdCanDelete, - Permission.BsdCanRevise + Permission.BsdCanRevise, + Permission.RegistryCanImport ]; const adminPermissions = [ diff --git a/back/src/queue/bull-board.ts b/back/src/queue/bull-board.ts index 9759cbbd50..ed34ecfdc0 100644 --- a/back/src/queue/bull-board.ts +++ b/back/src/queue/bull-board.ts @@ -20,6 +20,7 @@ import { mailQueue } from "./producers/mail"; import { sirenifyQueue } from "./producers/sirenify"; import { administrativeTransferQueue } from "./producers/administrativeTransfer"; import { updateAppendix2Queue } from "./producers/updateAppendix2"; +import { registryImportQueue } from "./producers/registryImport"; export const serverAdapter = new ExpressAdapter(); export const bullBoardPath = `/queue/monitor/${process.env.QUEUE_MONITOR_TOKEN}`; @@ -40,7 +41,8 @@ createBullBoard({ new BullAdapter(sirenifyQueue), new BullAdapter(gericoQueue), new BullAdapter(administrativeTransferQueue), - new BullAdapter(updateAppendix2Queue) + new BullAdapter(updateAppendix2Queue), + new BullAdapter(registryImportQueue) ], serverAdapter: serverAdapter }); diff --git a/back/src/queue/jobs/__tests__/indexFavorites.integration.ts b/back/src/queue/jobs/__tests__/indexFavorites.integration.ts index 506175272a..7f3edf4eb4 100644 --- a/back/src/queue/jobs/__tests__/indexFavorites.integration.ts +++ b/back/src/queue/jobs/__tests__/indexFavorites.integration.ts @@ -783,7 +783,8 @@ describe("Index favorites job", () => { contactPhone: "00 00 00 00 00", contact: "John Snow", codePaysEtrangerEtablissement: "FR", - etatAdministratif: "A" + etatAdministratif: "A", + isDormant: false }; (searchCompany as jest.Mock).mockResolvedValueOnce(destination); @@ -885,7 +886,8 @@ describe("Index favorites job", () => { contactPhone: "00 00 00 00 00", contact: "John Snow", etatAdministratif: "A", - codePaysEtrangerEtablissement: "FR" + codePaysEtrangerEtablissement: "FR", + isDormant: false }; (searchCompany as jest.Mock).mockResolvedValueOnce(traderSirene); @@ -964,7 +966,8 @@ describe("Index favorites job", () => { contactPhone: "00 00 00 00 00", contact: "John Snow", etatAdministratif: "A", - codePaysEtrangerEtablissement: "FR" + codePaysEtrangerEtablissement: "FR", + isDormant: false }; (searchCompany as jest.Mock).mockResolvedValueOnce(brokerSirene); diff --git a/back/src/queue/jobs/__tests__/processRegistryImport.integration.ts b/back/src/queue/jobs/__tests__/processRegistryImport.integration.ts new file mode 100644 index 0000000000..89a17affe0 --- /dev/null +++ b/back/src/queue/jobs/__tests__/processRegistryImport.integration.ts @@ -0,0 +1,325 @@ +import { prisma } from "@td/prisma"; +import { + getFileMetadata, + getUploadWithWritableStream, + SSD_HEADERS +} from "@td/registry"; +import { Job } from "bull"; +import { resetDatabase } from "../../../../integration-tests/helper"; +import { + userFactory, + userWithCompanyFactory +} from "../../../__tests__/factories"; +import { + processRegistryImportJob, + RegistryImportJobArgs +} from "../processRegistryImport"; + +const getCorrectLine = (siret: string) => { + return { + reason: "", + publicId: 1, + reportAsSiret: "", + reportForSiret: siret, + useDate: "2024-02-01", + dispatchDate: "", + wasteCode: "06 07 01*", + wasteDescription: "Description déchet", + wasteCodeBale: "", + secondaryWasteCodes: "", + secondaryWasteDescriptions: "", + product: "Produit", + weightValue: 1.4, + weightIsEstimate: "REEL", + volume: 1.2, + processingDate: "2024-01-01", + processingEndDate: "", + destinationType: "ENTREPRISE_FR", + destinationOrgId: "78467169500103", + destinationName: "Nom destination", + destinationAddress: "Adresse destination", + destinationCity: "Ville destination", + destinationPostalCode: "75001", + destinationCountryCode: "FR", + operationCode: "R 5", + qualificationCode: "Recyclage", + administrativeActReference: "TODO arrêté" + }; +}; + +describe("Process registry import job", () => { + afterEach(async () => { + await resetDatabase(); + }); + + describe("processRegistryImportJob", () => { + it("should fail if the file key isnt valid", async () => { + expect.assertions(1); + + try { + await processRegistryImportJob({ + data: { importId: "1", importType: "SSD", s3FileKey: "invalid" } + } as Job); + } catch (err) { + expect(err.message).toBe('Unknown file "invalid", import "1".'); + } + }); + + it("should fail if the file doesnt have the right MIME type", async () => { + expect.assertions(1); + const fileKey = "test-file"; + + const { s3Stream, upload } = getUploadWithWritableStream( + process.env.S3_REGISTRY_IMPORTS_BUCKET, + fileKey + ); + + s3Stream.end("test file text"); + await upload.done(); + + try { + await processRegistryImportJob({ + data: { importId: "1", importType: "SSD", s3FileKey: fileKey } + } as Job); + } catch (err) { + expect(err.message).toBe( + `Unknown file type for file "${fileKey}", import "1". Received content type "application/octet-stream".` + ); + } + }); + + it("should fail the import when the file has the right headers but no data", async () => { + const fileKey = "no-data.csv"; + const user = await userFactory({}); + + const { s3Stream, upload } = getUploadWithWritableStream( + process.env.S3_REGISTRY_IMPORTS_BUCKET, + fileKey, + "text/csv" + ); + + s3Stream.write(Object.values(SSD_HEADERS).join(";") + "\n"); + s3Stream.end(); + + await upload.done(); + + const registryImport = await prisma.registryImport.create({ + data: { + s3FileKey: fileKey, + originalFileName: "no-data.csv", + type: "SSD", + status: "PENDING", + createdById: user.id + } + }); + + await processRegistryImportJob({ + data: { + importId: registryImport.id, + importType: registryImport.type, + s3FileKey: registryImport.s3FileKey + } + } as Job); + + const result = await prisma.registryImport.findUniqueOrThrow({ + where: { id: registryImport.id } + }); + + expect(result.status).toBe("FAILED"); + expect(result.numberOfInsertions).toBe(0); + expect(result.numberOfCancellations).toBe(0); + expect(result.numberOfEdits).toBe(0); + expect(result.numberOfErrors).toBe(0); + }); + + it("should return correct stats when the SSD file only has insertions", async () => { + const fileKey = "one-insertion.csv"; + const { company, user } = await userWithCompanyFactory(); + + const { s3Stream, upload } = getUploadWithWritableStream( + process.env.S3_REGISTRY_IMPORTS_BUCKET, + fileKey, + "text/csv" + ); + + s3Stream.write(Object.values(SSD_HEADERS).join(";") + "\n"); + s3Stream.end( + Object.values(getCorrectLine(company.orgId)).join(";") + "\n" + ); + + await upload.done(); + + const registryImport = await prisma.registryImport.create({ + data: { + s3FileKey: fileKey, + originalFileName: "one-insertion.csv", + type: "SSD", + status: "PENDING", + createdById: user.id + } + }); + + await processRegistryImportJob({ + data: { + importId: registryImport.id, + importType: registryImport.type, + s3FileKey: registryImport.s3FileKey + } + } as Job); + + const result = await prisma.registryImport.findUniqueOrThrow({ + where: { id: registryImport.id } + }); + + expect(result.status).toBe("SUCCESSFUL"); + expect(result.numberOfInsertions).toBe(1); + expect(result.numberOfCancellations).toBe(0); + expect(result.numberOfEdits).toBe(0); + expect(result.numberOfErrors).toBe(0); + }); + + it("should return correct stats when the SSD file only has a mix of several actions", async () => { + const fileKey = "mixed.csv"; + const { company, user } = await userWithCompanyFactory(); + + const { s3Stream, upload } = getUploadWithWritableStream( + process.env.S3_REGISTRY_IMPORTS_BUCKET, + fileKey, + "text/csv" + ); + + s3Stream.write(Object.values(SSD_HEADERS).join(";") + "\n"); + s3Stream.write( + Object.values(getCorrectLine(company.orgId)).join(";") + "\n" + ); // Correct line + s3Stream.end(";".repeat(Object.values(SSD_HEADERS).length - 1)); // Error line + + await upload.done(); + + const registryImport = await prisma.registryImport.create({ + data: { + s3FileKey: fileKey, + originalFileName: "mixed.csv", + type: "SSD", + status: "PENDING", + createdById: user.id + } + }); + + await processRegistryImportJob({ + data: { + importId: registryImport.id, + importType: registryImport.type, + s3FileKey: registryImport.s3FileKey + } + } as Job); + + const result = await prisma.registryImport.findUniqueOrThrow({ + where: { id: registryImport.id } + }); + + expect(result.status).toBe("PARTIALLY_SUCCESSFUL"); + expect(result.numberOfInsertions).toBe(1); + expect(result.numberOfCancellations).toBe(0); + expect(result.numberOfEdits).toBe(0); + expect(result.numberOfErrors).toBe(1); + }); + + it("should write an error file with detailed errors when the SSD file contains data errors", async () => { + const fileKey = "check-errors.csv"; + const { company, user } = await userWithCompanyFactory(); + + const { s3Stream, upload } = getUploadWithWritableStream( + process.env.S3_REGISTRY_IMPORTS_BUCKET, + fileKey, + "text/csv" + ); + + s3Stream.write(Object.values(SSD_HEADERS).join(";") + "\n"); + s3Stream.write( + Object.values(getCorrectLine(company.orgId)).join(";") + "\n" + ); // Correct line + s3Stream.end(";".repeat(Object.values(SSD_HEADERS).length - 1)); // Error line + + await upload.done(); + + const registryImport = await prisma.registryImport.create({ + data: { + s3FileKey: fileKey, + originalFileName: "check-errors.csv", + type: "SSD", + status: "PENDING", + createdById: user.id + } + }); + + await processRegistryImportJob({ + data: { + importId: registryImport.id, + importType: registryImport.type, + s3FileKey: registryImport.s3FileKey + } + } as Job); + + const result = await prisma.registryImport.findUniqueOrThrow({ + where: { id: registryImport.id } + }); + + expect(result.status).toBe("PARTIALLY_SUCCESSFUL"); + + const errorFileMetadata = await getFileMetadata( + process.env.S3_REGISTRY_ERRORS_BUCKET, + `${registryImport.id}.csv` + ); + + expect(errorFileMetadata).toBeDefined(); + }); + + it("should work if a line has missing some columns", async () => { + const fileKey = "missing-column.csv"; + const { company, user } = await userWithCompanyFactory(); + + const { s3Stream, upload } = getUploadWithWritableStream( + process.env.S3_REGISTRY_IMPORTS_BUCKET, + fileKey, + "text/csv" + ); + + s3Stream.write(Object.values(SSD_HEADERS).join(";") + "\n"); + s3Stream.write( + Object.values(getCorrectLine(company.orgId)).join(";") + "\n" + ); + s3Stream.end(";;;;;\n"); + + await upload.done(); + + const registryImport = await prisma.registryImport.create({ + data: { + s3FileKey: fileKey, + originalFileName: "missing-column.csv", + type: "SSD", + status: "PENDING", + createdById: user.id + } + }); + + await processRegistryImportJob({ + data: { + importId: registryImport.id, + importType: registryImport.type, + s3FileKey: registryImport.s3FileKey + } + } as Job); + + const result = await prisma.registryImport.findUniqueOrThrow({ + where: { id: registryImport.id } + }); + + expect(result.status).toBe("PARTIALLY_SUCCESSFUL"); + expect(result.numberOfInsertions).toBe(1); + expect(result.numberOfCancellations).toBe(0); + expect(result.numberOfEdits).toBe(0); + expect(result.numberOfErrors).toBe(1); + }); + }); +}); diff --git a/back/src/queue/jobs/index.ts b/back/src/queue/jobs/index.ts index 6ae6e606c6..9ecad2ba79 100644 --- a/back/src/queue/jobs/index.ts +++ b/back/src/queue/jobs/index.ts @@ -6,3 +6,4 @@ export { sirenifyBsdJob } from "./sirenifyBsd"; export { postGericoJob } from "./gerico"; export { processAdministrativeTransferJob } from "./administrativeTransfer"; export { updateAppendix2Job } from "./updateAppendix2"; +export { processRegistryImportJob } from "./processRegistryImport"; diff --git a/back/src/queue/jobs/processRegistryImport.ts b/back/src/queue/jobs/processRegistryImport.ts new file mode 100644 index 0000000000..d42f24f9b2 --- /dev/null +++ b/back/src/queue/jobs/processRegistryImport.ts @@ -0,0 +1,135 @@ +import { logger } from "@td/logger"; +import { prisma } from "@td/prisma"; +import { + getFileMetadata, + getFileAsStream, + getUploadWithWritableStream, + ImportType, + processStream, + setFileAsNotTemporary +} from "@td/registry"; +import { Job } from "bull"; + +import { getUserCompanies } from "../../users/database"; + +export type RegistryImportJobArgs = { + importId: string; + importType: ImportType; + s3FileKey: string; +}; + +const allowedCsvMimeTypes = ["text/csv"]; + +const allowedExcelMimeTypes = [ + "application/vnd.ms-excel", + "application/msexcel", + "application/x-msexcel", + "application/x-ms-excel", + "application/x-excel", + "application/x-dos_ms_excel", + "application/xls", + "application/x-xls", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" +]; + +export async function processRegistryImportJob( + job: Job +) { + const { importId, importType, s3FileKey } = job.data; + + const metadata = await getFileMetadata( + process.env.S3_REGISTRY_IMPORTS_BUCKET!, + s3FileKey + ); + if (!metadata) { + throw new Error(`Unknown file "${s3FileKey}", import "${importId}".`); + } + + const fileType = getFileType(metadata.ContentType); + if (!fileType) { + throw new Error( + `Unknown file type for file "${s3FileKey}", import "${importId}". Received content type "${metadata.ContentType}".` + ); + } + + await setFileAsNotTemporary( + process.env.S3_REGISTRY_IMPORTS_BUCKET!, + s3FileKey + ); + + const inputStream = await getFileAsStream( + process.env.S3_REGISTRY_IMPORTS_BUCKET!, + s3FileKey + ); + + if (!inputStream) { + throw new Error( + `File "${s3FileKey}" not found in S3 for import "${importId}"` + ); + } + + const registryImport = await prisma.registryImport.findUniqueOrThrow({ + where: { id: importId } + }); + const creatorCompanies = await getUserCompanies(registryImport.createdById); + const allowedSirets = creatorCompanies.map(company => company.orgId); + + const givenDelegations = await prisma.registryDelegation.findMany({ + where: { + delegateId: { in: allowedSirets }, + revokedBy: null, + cancelledBy: null, + startDate: { lte: new Date() }, + OR: [{ endDate: null }, { endDate: { gt: new Date() } }] + } + }); + const delegateToDelegatorsMap = givenDelegations.reduce((map, delegation) => { + const currentValue = map.get(delegation.delegateId) ?? []; + currentValue.push(delegation.delegatorId); + + map.set(delegation.delegateId, currentValue); + return map; + }, new Map()); + + const { s3Stream: outputErrorStream, upload } = getUploadWithWritableStream( + process.env.S3_REGISTRY_ERRORS_BUCKET!, + `${importId}.csv` + ); + + const stats = await processStream({ + importId, + importType, + fileType, + inputStream, + outputErrorStream, + createdById: registryImport.createdById, + allowedSirets, + delegateToDelegatorsMap + }); + + if (stats.errors > 0) { + const result = await upload.done(); + logger.info(`Done uploading error file for import ${importId} to S3`, { + key: result.Key, + location: result.Location + }); + } + + logger.info(`Finished processing import ${importId}`, { importId, stats }); +} + +function getFileType(mimeType: string | undefined) { + if (!mimeType) { + return undefined; + } + + if (allowedCsvMimeTypes.includes(mimeType)) { + return "CSV"; + } + + if (allowedExcelMimeTypes.includes(mimeType)) { + return "XLSX"; + } + + return undefined; +} diff --git a/back/src/queue/producers/registryImport.ts b/back/src/queue/producers/registryImport.ts new file mode 100644 index 0000000000..4b0f32968b --- /dev/null +++ b/back/src/queue/producers/registryImport.ts @@ -0,0 +1,25 @@ +import { logger } from "@td/logger"; +import Queue, { Job, JobOptions } from "bull"; +import { RegistryImportJobArgs } from "../jobs/processRegistryImport"; + +const { REDIS_URL, NODE_ENV } = process.env; + +export const REGISTRY_IMPORT_QUEUE_NAME = `queue_registry_import_${NODE_ENV}`; + +export const registryImportQueue = new Queue( + REGISTRY_IMPORT_QUEUE_NAME, + REDIS_URL!, + { + defaultJobOptions: { + removeOnComplete: 10_000 + } + } +); + +export function enqueueRegistryImportToProcessJob( + args: RegistryImportJobArgs, + options?: JobOptions +): Promise> { + logger.info(`Enqueuing registry import ${args.importId}`); + return registryImportQueue.add(args, options); +} diff --git a/back/src/registry/resolvers/Mutation.ts b/back/src/registry/resolvers/Mutation.ts new file mode 100644 index 0000000000..594f313e74 --- /dev/null +++ b/back/src/registry/resolvers/Mutation.ts @@ -0,0 +1,8 @@ +import { MutationResolvers } from "../../generated/graphql/types"; +import { addToSsdRegistry } from "./mutations/addToSsdRegistry"; +import { importFile } from "./mutations/importFile"; + +export const Mutation: MutationResolvers = { + importFile: importFile as any, + addToSsdRegistry +}; diff --git a/back/src/registry/resolvers/Query.ts b/back/src/registry/resolvers/Query.ts index a3a8efcb8c..31bd4c4d44 100644 --- a/back/src/registry/resolvers/Query.ts +++ b/back/src/registry/resolvers/Query.ts @@ -6,6 +6,10 @@ import managedWastes from "./queries/managedWastes"; import allWastes from "./queries/allWastes"; import wastesRegistryCsv from "./queries/wastesRegistryCsv"; import wastesRegistryXls from "./queries/wastesRegistryXls"; +import { registryUploadSignedUrl } from "./queries/registryUploadSignedUrl"; +import { registryDownloadSignedUrl } from "./queries/registryDownloadSignedUrl"; +import { registryImports } from "./queries/registryImports"; +import { registryImport } from "./queries/registryImport"; export const Query: QueryResolvers = { incomingWastes, @@ -14,5 +18,9 @@ export const Query: QueryResolvers = { managedWastes, allWastes, wastesRegistryCsv, - wastesRegistryXls + wastesRegistryXls, + registryUploadSignedUrl, + registryDownloadSignedUrl, + registryImports: registryImports as any, + registryImport: registryImport as any }; diff --git a/back/src/registry/resolvers/RegistryImportAssociation.ts b/back/src/registry/resolvers/RegistryImportAssociation.ts new file mode 100644 index 0000000000..167d27bd6d --- /dev/null +++ b/back/src/registry/resolvers/RegistryImportAssociation.ts @@ -0,0 +1,25 @@ +import { prisma } from "@td/prisma"; +import { RegistryImportAssociationResolvers } from "../../generated/graphql/types"; + +export const RegistryImportAssociation: RegistryImportAssociationResolvers = { + reportedFor: async parent => { + const company = await prisma.company.findUniqueOrThrow({ + where: { siret: parent.reportedFor as string } + }); + + return { + siret: company.orgId, + name: company.givenName ?? company.name + }; + }, + reportedAs: async parent => { + const company = await prisma.company.findUniqueOrThrow({ + where: { siret: parent.reportedAs as string } + }); + + return { + siret: company.orgId, + name: company.givenName ?? company.name + }; + } +}; diff --git a/back/src/registry/resolvers/index.ts b/back/src/registry/resolvers/index.ts index fa2bf86994..44760ea75c 100644 --- a/back/src/registry/resolvers/index.ts +++ b/back/src/registry/resolvers/index.ts @@ -1,5 +1,9 @@ import { Query } from "./Query"; +import { Mutation } from "./Mutation"; +import { RegistryImportAssociation } from "./RegistryImportAssociation"; export default { - Query + Query, + Mutation, + RegistryImportAssociation }; diff --git a/back/src/registry/resolvers/mutations/addToSsdRegistry.ts b/back/src/registry/resolvers/mutations/addToSsdRegistry.ts new file mode 100644 index 0000000000..66b2b6a6f7 --- /dev/null +++ b/back/src/registry/resolvers/mutations/addToSsdRegistry.ts @@ -0,0 +1,46 @@ +import { checkIsAuthenticated } from "../../../common/permissions"; +import { MutationAddToSsdRegistryArgs } from "../../../generated/graphql/types"; +import { Permission, checkUserPermissions } from "../../../permissions"; +import { GraphQLContext } from "../../../types"; +import { getUserCompanies } from "../../../users/database"; +import { UserInputError } from "../../../common/errors"; +import { importOptions } from "@td/registry"; + +const LINES_LIMIT = 1_000; + +export async function addToSsdRegistry( + _, + { lines }: MutationAddToSsdRegistryArgs, + context: GraphQLContext +) { + const user = checkIsAuthenticated(context); + const userCompanies = await getUserCompanies(user.id); + await checkUserPermissions( + user, + userCompanies.map(company => company.orgId), + Permission.RegistryCanImport, + `Vous n'êtes pas autorisé à modifier des données du registre` + ); + + if (lines.length > LINES_LIMIT) { + throw new UserInputError( + `Cannot import more than ${LINES_LIMIT} lines at once` + ); + } + + const { safeParseAsync, saveLine } = importOptions.SSD; + + for (const line of lines) { + const result = await safeParseAsync(line); + + if (result.success) { + await saveLine({ line: result.data, importId: null }); + } else { + throw new UserInputError( + `Invalid line: ${JSON.stringify(line)}: ${result.error.format()}` + ); + } + } + + return true; +} diff --git a/back/src/registry/resolvers/mutations/importFile.ts b/back/src/registry/resolvers/mutations/importFile.ts new file mode 100644 index 0000000000..60be45fbfd --- /dev/null +++ b/back/src/registry/resolvers/mutations/importFile.ts @@ -0,0 +1,58 @@ +import { prisma } from "@td/prisma"; +import { getFileMetadata } from "@td/registry"; +import { UserInputError } from "../../../common/errors"; +import { checkIsAuthenticated } from "../../../common/permissions"; +import { MutationImportFileArgs } from "../../../generated/graphql/types"; +import { Permission, checkUserPermissions } from "../../../permissions"; +import { enqueueRegistryImportToProcessJob } from "../../../queue/producers/registryImport"; +import { GraphQLContext } from "../../../types"; +import { getUserCompanies } from "../../../users/database"; + +export async function importFile( + _, + { s3FileKey, importType }: MutationImportFileArgs, + context: GraphQLContext +) { + const user = checkIsAuthenticated(context); + const userCompanies = await getUserCompanies(user.id); + await checkUserPermissions( + user, + userCompanies.map(company => company.orgId), + Permission.RegistryCanImport, + `Vous n'êtes pas autorisé à importer des données dans le registre` + ); + + const importFileMetadata = await getFileMetadata( + process.env.S3_REGISTRY_IMPORTS_BUCKET!, + s3FileKey + ); + + if (!importFileMetadata) { + throw new UserInputError(`Fichier "${s3FileKey}" non trouvé.`); + } + + const originalFileName = importFileMetadata.Metadata?.filename; + + if (!originalFileName) { + throw new UserInputError( + `Nom de fichier manquant pour l'import "${s3FileKey}"` + ); + } + + const registryImport = await prisma.registryImport.create({ + data: { + type: importType, + s3FileKey, + createdById: user.id, + originalFileName + } + }); + + await enqueueRegistryImportToProcessJob({ + importId: registryImport.id, + s3FileKey, + importType + }); + + return registryImport; +} diff --git a/back/src/registry/resolvers/queries/registryDownloadSignedUrl.ts b/back/src/registry/resolvers/queries/registryDownloadSignedUrl.ts new file mode 100644 index 0000000000..cabaca1ebe --- /dev/null +++ b/back/src/registry/resolvers/queries/registryDownloadSignedUrl.ts @@ -0,0 +1,46 @@ +import { prisma } from "@td/prisma"; +import { getSignedUrlForDownload } from "@td/registry"; +import { checkIsAuthenticated } from "../../../common/permissions"; +import { QueryRegistryDownloadSignedUrlArgs } from "../../../generated/graphql/types"; +import { Permission, checkUserPermissions } from "../../../permissions"; +import { GraphQLContext } from "../../../types"; + +export async function registryDownloadSignedUrl( + _, + { importId, target }: QueryRegistryDownloadSignedUrlArgs, + context: GraphQLContext +) { + const user = checkIsAuthenticated(context); + + const registryImport = await prisma.registryImport.findUniqueOrThrow({ + where: { id: importId }, + include: { associations: true } + }); + + // If an import failed, it has no associations. Only its owner can see the error file + if (registryImport.createdById !== user.id) { + const sirets = registryImport.associations + .map(a => [a.reportedFor, a.reportedAs]) + .flat(); + await checkUserPermissions( + user, + sirets, + Permission.RegistryCanRead, + `Vous n'êtes pas autorisé à lire les données de ce registre` + ); + } + + const key = + target === "ERROR_FILE" ? `${importId}.csv` : registryImport.s3FileKey; + const bucketName = + target === "ERROR_FILE" + ? process.env.S3_REGISTRY_ERRORS_BUCKET! + : process.env.S3_REGISTRY_IMPORTS_BUCKET!; + + const signedUrl = await getSignedUrlForDownload({ + bucketName, + key + }); + + return { fileKey: key, signedUrl }; +} diff --git a/back/src/registry/resolvers/queries/registryImport.ts b/back/src/registry/resolvers/queries/registryImport.ts new file mode 100644 index 0000000000..6cd238dcbb --- /dev/null +++ b/back/src/registry/resolvers/queries/registryImport.ts @@ -0,0 +1,33 @@ +import { prisma } from "@td/prisma"; +import { UserInputError } from "../../../common/errors"; +import { checkIsAuthenticated } from "../../../common/permissions"; +import { QueryRegistryImportArgs } from "../../../generated/graphql/types"; +import { Permission, checkUserPermissions } from "../../../permissions"; +import { GraphQLContext } from "../../../types"; +import { getUserCompanies } from "../../../users/database"; + +export async function registryImport( + _, + { id }: QueryRegistryImportArgs, + context: GraphQLContext +) { + const user = checkIsAuthenticated(context); + const userCompanies = await getUserCompanies(user.id); + await checkUserPermissions( + user, + userCompanies.map(company => company.orgId), + Permission.RegistryCanImport, + `Vous n'êtes pas autorisé à importer des données dans le registre` + ); + + const registryImport = await prisma.registryImport.findUnique({ + where: { id, createdById: user.id }, + include: { createdBy: true, associations: true } + }); + + if (!registryImport) { + throw new UserInputError(`Import de registre "${id}" non trouvé`); + } + + return registryImport; +} diff --git a/back/src/registry/resolvers/queries/registryImports.ts b/back/src/registry/resolvers/queries/registryImports.ts new file mode 100644 index 0000000000..9ddaab02ae --- /dev/null +++ b/back/src/registry/resolvers/queries/registryImports.ts @@ -0,0 +1,61 @@ +import { prisma } from "@td/prisma"; +import { checkIsAuthenticated } from "../../../common/permissions"; +import { QueryRegistryImportsArgs } from "../../../generated/graphql/types"; +import { GraphQLContext } from "../../../types"; +import { getUserCompanies } from "../../../users/database"; +import { getConnection } from "../../../common/pagination"; +import { Permission, checkUserPermissions } from "../../../permissions"; +import { Prisma } from "@prisma/client"; + +export async function registryImports( + _, + { siret, ownImportsOnly, ...gqlPaginationArgs }: QueryRegistryImportsArgs, + context: GraphQLContext +) { + const user = checkIsAuthenticated(context); + + const where: Prisma.RegistryImportWhereInput = {}; + + if (siret) { + const userCompanies = await getUserCompanies(user.id); + const canReportForSirets = userCompanies.map(c => c.orgId); + const isOwnReport = canReportForSirets.includes(siret); + + const siretsThatHaveDelegationOnTarget: string[] = []; // TODO delegations where target siret = input + + await checkUserPermissions( + user, + [siret, ...siretsThatHaveDelegationOnTarget], + Permission.RegistryCanRead, + `Vous n'êtes pas autorisé à lire les données de ce registre` + ); + + where.associations = { + some: { + reportedFor: siret, + ...(!isOwnReport && { + reportedAs: { in: siretsThatHaveDelegationOnTarget } + }) + } + }; + } + + if (ownImportsOnly) { + where.createdById = user.id; + } + + const totalCount = await prisma.registryImport.count({ where }); + + return getConnection({ + totalCount, + findMany: prismaPaginationArgs => + prisma.registryImport.findMany({ + where, + ...prismaPaginationArgs, + orderBy: { id: "desc" }, + include: { createdBy: true, associations: true } + }), + formatNode: v => v, + ...gqlPaginationArgs + }); +} diff --git a/back/src/registry/resolvers/queries/registryUploadSignedUrl.ts b/back/src/registry/resolvers/queries/registryUploadSignedUrl.ts new file mode 100644 index 0000000000..f08acc9c91 --- /dev/null +++ b/back/src/registry/resolvers/queries/registryUploadSignedUrl.ts @@ -0,0 +1,32 @@ +import { getSignedUrlForUpload } from "@td/registry"; +import { checkIsAuthenticated } from "../../../common/permissions"; +import { QueryRegistryUploadSignedUrlArgs } from "../../../generated/graphql/types"; +import { Permission, checkUserPermissions } from "../../../permissions"; +import { GraphQLContext } from "../../../types"; +import { getUserCompanies } from "../../../users/database"; + +export async function registryUploadSignedUrl( + _, + { fileName }: QueryRegistryUploadSignedUrlArgs, + context: GraphQLContext +) { + const user = checkIsAuthenticated(context); + const userCompanies = await getUserCompanies(user.id); + await checkUserPermissions( + user, + userCompanies.map(company => company.orgId), + Permission.RegistryCanImport, + `Vous n'êtes pas autorisé à importer des données dans le registre` + ); + + const fileKey = [Date.now(), user.id, fileName].join("_"); + + const signedUrl = await getSignedUrlForUpload({ + bucketName: process.env.S3_REGISTRY_IMPORTS_BUCKET!, + key: fileKey, + metadata: { filename: fileName }, + tags: { temp: "true", userId: user.id } + }); + + return { fileKey, signedUrl }; +} diff --git a/back/src/registry/typeDefs/registry.enums.graphql b/back/src/registry/typeDefs/registry.enums.graphql index 935b0f4a17..b362efce43 100644 --- a/back/src/registry/typeDefs/registry.enums.graphql +++ b/back/src/registry/typeDefs/registry.enums.graphql @@ -74,3 +74,29 @@ enum BsdSubType { "Synthèse" SYNTHESIS } + +enum RegistryImportType { + "Sortie de statut de déchet" + SSD +} + +enum RegistryImportStatus { + PENDING + STARTED + SUCCESSFUL + PARTIALLY_SUCCESSFUL + FAILED + CANCELED +} + +enum RegistryDownloadTarget { + ERROR_FILE + IMPORT_FILE +} + +enum RegistryLineReason { + "Spécifie que la ligne doit être modifiée dans le registre" + EDIT + "Spécifie que la ligne doit être supprimée du registre" + CANCEL +} diff --git a/back/src/registry/typeDefs/registry.inputs.graphql b/back/src/registry/typeDefs/registry.inputs.graphql index 217a9eb39a..3fd28c36db 100644 --- a/back/src/registry/typeDefs/registry.inputs.graphql +++ b/back/src/registry/typeDefs/registry.inputs.graphql @@ -29,3 +29,37 @@ input BsdTypeFilter { _in: [BsdType!] _eq: BsdType } + +input SsdLineInput { + reason: RegistryLineReason + publicId: ID! + reportForSiret: String! + reportForName: String! + reportForAddress: String! + reportForCity: String! + reportForPostalCode: String! + reportAsSiret: String + weightValue: Float! + weightIsEstimate: Boolean! + volume: Float + wasteCode: String! + wasteCodeBale: String + wasteDescription: String! + secondaryWasteCodes: [String!] + secondaryWasteDescriptions: [String!] + dispatchDate: DateTime + useDate: DateTime + processingDate: DateTime! + processingEndDate: DateTime + operationCode: String! + operationMode: OperationMode! + product: String! + administrativeActReference: String! + destinationType: String! + destinationOrgId: String + destinationName: String + destinationAddress: String + destinationCity: String + destinationPostalCode: String + destinationCountryCode: String +} diff --git a/back/src/registry/typeDefs/registry.mutations.graphql b/back/src/registry/typeDefs/registry.mutations.graphql new file mode 100644 index 0000000000..5e889bcff7 --- /dev/null +++ b/back/src/registry/typeDefs/registry.mutations.graphql @@ -0,0 +1,8 @@ +type Mutation { + importFile( + importType: RegistryImportType! + s3FileKey: String! + ): RegistryImport! + + addToSsdRegistry(lines: [SsdLineInput!]!): Boolean! +} diff --git a/back/src/registry/typeDefs/registry.objects.graphql b/back/src/registry/typeDefs/registry.objects.graphql index b8ecffdca9..5bafdb35fa 100644 --- a/back/src/registry/typeDefs/registry.objects.graphql +++ b/back/src/registry/typeDefs/registry.objects.graphql @@ -1911,3 +1911,49 @@ type AllWasteConnection { pageInfo: PageInfo! edges: [AllWasteEdge!]! } + +type RegistryImportConnection { + totalCount: Int! + pageInfo: PageInfo! + edges: [RegistryImportEdge!]! +} + +type RegistryImportEdge { + cursor: String! + node: RegistryImport! +} + +type RegistryImport { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + status: RegistryImportStatus! + type: RegistryImportType! + s3FileKey: String! + originalFileName: String! + numberOfErrors: Int! + numberOfInsertions: Int! + numberOfEdits: Int! + numberOfCancellations: Int! + numberOfSkipped: Int! + createdBy: User! + associations: [RegistryImportAssociation!]! +} + +type RegistryImportAssociation { + reportedFor: ResgistryImportCompany! + reportedAs: ResgistryImportCompany! +} + +type ResgistryImportCompany { + "Nom de l'établissement" + name: String + + "SIRET de l'établissement" + siret: String +} + +type SignedUrlResponse { + fileKey: String! + signedUrl: String! +} diff --git a/back/src/registry/typeDefs/registry.queries.graphql b/back/src/registry/typeDefs/registry.queries.graphql index 9687705833..8ff9afb463 100644 --- a/back/src/registry/typeDefs/registry.queries.graphql +++ b/back/src/registry/typeDefs/registry.queries.graphql @@ -128,4 +128,65 @@ type Query { "Filtres additionnels sur les dates d'expédition / réception, le code déchet, l'opération de traitement, etc " where: WasteRegistryWhere ): FileDownload! + + "Renvoie un lien permettant de téléverser un registre au format CSV ou Excel" + registryUploadSignedUrl(fileName: String!): SignedUrlResponse! + + "Renvoie un lien permettant de témécharger un fichier du registre" + registryDownloadSignedUrl( + importId: String! + target: RegistryDownloadTarget! + ): SignedUrlResponse! + + "Liste des imports de registre" + registryImports( + """ + (Optionnel) PAGINATION + Permet en conjonction avec `first` de paginer "en avant" + (des bordereaux les plus récents aux bordereaux les plus anciens) + Curseur après lequel les bordereaux doivent être retournés + Attend un identifiant (propriété `id`) de BSD + Défaut à vide, pour retourner les bordereaux les plus récents + Le BSD précisé dans le curseur ne fait pas partie du résultat + """ + after: ID + + """ + (Optionnel) PAGINATION + Permet en conjonction avec `cursorAfter` de paginer "en avant" + (des bordereaux les plus récents aux bordereaux les plus anciens) + Nombre de bordereaux retournés après le `cursorAfter` + Défaut à 50, maximum à 500 + """ + first: Int + + """ + (Optionnel) PAGINATION + Permet en conjonction avec `last` de paginer "en arrière" + (des bordereaux les plus anciens aux bordereaux les plus récents) + Curseur avant lequel les bordereaux doivent être retournés + Attend un identifiant (propriété `id`) de BSD + Défaut à vide, pour retourner les bordereaux les plus anciens + Le BSD précisé dans le curseur ne fait pas partie du résultat + """ + before: ID + + """ + (Optionnel) PAGINATION + Nombre de bordereaux retournés avant le `cursorBefore` + Défaut à 50, maximum à 500 + """ + last: Int + + "SIRET de l'établissement dont je veux visualiser les imports" + siret: String + + "Permet de limiter aux imports que j'ai réalisés" + ownImportsOnly: Boolean + ): RegistryImportConnection! + + """ + Permet de consulter uniquement les imports que l'on a réalisé + """ + registryImport(id: ID!): RegistryImport! } diff --git a/back/src/registryDelegation/resolvers/queries/registryDelegations.ts b/back/src/registryDelegation/resolvers/queries/registryDelegations.ts index 947c095310..e2faec0924 100644 --- a/back/src/registryDelegation/resolvers/queries/registryDelegations.ts +++ b/back/src/registryDelegation/resolvers/queries/registryDelegations.ts @@ -1,3 +1,4 @@ +import { getUserCompanies } from "../../../users/database"; import { applyAuthStrategies, AuthType } from "../../../auth"; import { checkIsAuthenticated } from "../../../common/permissions"; import { QueryResolvers } from "../../../generated/graphql/types"; @@ -18,7 +19,8 @@ const registryDelegationsResolver: QueryResolvers["registryDelegations"] = // Sync validation of args const paginationArgs = parseQueryRegistryDelegationsArgs(args); - const { delegateOrgId, delegatorOrgId } = paginationArgs.where; + const { delegateOrgId, delegatorOrgId, givenToMe, activeOnly, search } = + paginationArgs.where; // Find targeted company const { delegate, delegator } = await findDelegateOrDelegatorOrThrow( @@ -30,10 +32,18 @@ const registryDelegationsResolver: QueryResolvers["registryDelegations"] = if (delegate) await checkBelongsTo(user, delegate); if (delegator) await checkBelongsTo(user, delegator); + const delegates = delegate ? [delegate] : []; + if (givenToMe) { + const userCompanies = await getUserCompanies(user.id); + delegates.push(...userCompanies); + } + // Get paginated delegations const paginatedDelegations = await getPaginatedDelegations(user, { - delegate, + delegates, delegator, + activeOnly, + search, skip: paginationArgs.skip, first: paginationArgs.first }); diff --git a/back/src/registryDelegation/resolvers/queries/utils/registryDelegations.utils.ts b/back/src/registryDelegation/resolvers/queries/utils/registryDelegations.utils.ts index e67967483a..5085edfcd2 100644 --- a/back/src/registryDelegation/resolvers/queries/utils/registryDelegations.utils.ts +++ b/back/src/registryDelegation/resolvers/queries/utils/registryDelegations.utils.ts @@ -1,4 +1,4 @@ -import { Company } from "@prisma/client"; +import { Company, Prisma } from "@prisma/client"; import { getConnection, getPrismaPaginationArgs @@ -7,17 +7,19 @@ import { getRegistryDelegationRepository } from "../../../repository"; import { UserInputError } from "../../../../common/errors"; interface Args { - delegate?: Company; + delegates: Company[]; delegator?: Company; + activeOnly?: boolean | null; + search?: string | null; skip?: number | null | undefined; first?: number | null | undefined; } export const getPaginatedDelegations = async ( user: Express.User, - { delegate, delegator, skip, first }: Args + { delegates, delegator, activeOnly, search, skip, first }: Args ) => { - if (!delegate && !delegator) { + if (delegates.length === 0 && !delegator) { throw new UserInputError( "Vous devez préciser un délégant ou un délégataire" ); @@ -25,9 +27,34 @@ export const getPaginatedDelegations = async ( const delegationRepository = getRegistryDelegationRepository(user); - const fixedWhere = { - delegateId: delegate?.id, - delegatorId: delegator?.id + const fixedWhere: Prisma.RegistryDelegationWhereInput = { + delegateId: delegates.length + ? { in: delegates.map(delegate => delegate.id) } + : undefined, + ...(activeOnly && { + revokedBy: null, + cancelledBy: null, + startDate: { lte: new Date() }, + OR: [{ endDate: null }, { endDate: { gt: new Date() } }] + }), + ...(search + ? { + delegator: { + ...(delegator && { id: delegator?.id }), + OR: [ + { + name: { contains: search!, mode: "insensitive" } + }, + { + givenName: { contains: search!, mode: "insensitive" } + }, + { + siret: { contains: search!, mode: "insensitive" } + } + ] + } + } + : { delegatorId: delegator?.id }) }; const totalCount = await delegationRepository.count(fixedWhere); diff --git a/back/src/registryDelegation/typeDefs/private/registryDelegation.inputs.graphql b/back/src/registryDelegation/typeDefs/private/registryDelegation.inputs.graphql index bb9e8b8509..fad236f426 100644 --- a/back/src/registryDelegation/typeDefs/private/registryDelegation.inputs.graphql +++ b/back/src/registryDelegation/typeDefs/private/registryDelegation.inputs.graphql @@ -36,4 +36,13 @@ input RegistryDelegationWhere { """ delegatorOrgId: ID delegateOrgId: ID + + "Permet de récupérer uniquement les délégations actives. Si vide, renvoie toutes les délégations" + activeOnly: Boolean + + "Permet de récupérer les délégations données aux entreprises auxqelles j'appartiens" + givenToMe: Boolean + + "Permet de filtrer sur les noms des entreprises délégantes" + search: String } diff --git a/back/src/registryDelegation/validation/__tests__/index.test.ts b/back/src/registryDelegation/validation/__tests__/index.test.ts index ba16272eea..b421beb049 100644 --- a/back/src/registryDelegation/validation/__tests__/index.test.ts +++ b/back/src/registryDelegation/validation/__tests__/index.test.ts @@ -265,7 +265,7 @@ describe("index", () => { expect(error.errors[0]).toMatchObject({ path: ["where"], message: - "Vous devez renseigner un des deux champs (delegatorOrgId ou delegateOrgId)." + "Vous devez renseigner un des champs delegatorOrgId, delegateOrgId ou givenToMe." }); } }); diff --git a/back/src/registryDelegation/validation/schema.ts b/back/src/registryDelegation/validation/schema.ts index ae55a234d3..0bee00a1e3 100644 --- a/back/src/registryDelegation/validation/schema.ts +++ b/back/src/registryDelegation/validation/schema.ts @@ -63,11 +63,17 @@ export const queryRegistryDelegationsArgsSchema = z.object({ where: z .object({ delegatorOrgId: siretSchema().nullish(), - delegateOrgId: siretSchema().nullish() + delegateOrgId: siretSchema().nullish(), + givenToMe: z.boolean().nullish(), + activeOnly: z.boolean().nullish(), + search: z.string().max(20).nullish() }) .refine( - data => Boolean(data.delegatorOrgId) || Boolean(data.delegateOrgId), - "Vous devez renseigner un des deux champs (delegatorOrgId ou delegateOrgId)." + data => + Boolean(data.delegatorOrgId) || + Boolean(data.delegateOrgId) || + data.givenToMe, + "Vous devez renseigner un des champs delegatorOrgId, delegateOrgId ou givenToMe." ) .refine( data => !(Boolean(data.delegatorOrgId) && Boolean(data.delegateOrgId)), diff --git a/back/src/reset.d.ts b/back/src/reset.d.ts index cb504d6b63..774e798b23 100644 --- a/back/src/reset.d.ts +++ b/back/src/reset.d.ts @@ -4,7 +4,7 @@ import type { EnvVariables } from "@td/env"; declare global { // eslint-disable-next-line @typescript-eslint/no-namespace namespace NodeJS { - // eslint-disable-next-line @typescript-eslint/no-empty-interface + // eslint-disable-next-line @typescript-eslint/no-empty-interface, @typescript-eslint/no-empty-object-type interface ProcessEnv extends z.infer {} } } diff --git a/back/src/scripts/prisma/sendVerificationCodeLetters.ts b/back/src/scripts/prisma/sendVerificationCodeLetters.ts index e17502f9bb..0281b738cf 100644 --- a/back/src/scripts/prisma/sendVerificationCodeLetters.ts +++ b/back/src/scripts/prisma/sendVerificationCodeLetters.ts @@ -25,7 +25,7 @@ export default async function sendVerificationCodeLetters() { where: { id: company.id } }); console.log(`Successfully sent letter to company ${company.siret}`); - } catch (err) { + } catch (_) { console.log( `Error sending verification code letter to company ${company.siret}` ); diff --git a/back/src/users/bulk-creation/index.ts b/back/src/users/bulk-creation/index.ts index 3f940e77fe..ae3e9d1792 100644 --- a/back/src/users/bulk-creation/index.ts +++ b/back/src/users/bulk-creation/index.ts @@ -280,7 +280,7 @@ export async function bulkCreate(opts: Opts): Promise { try { await sendMail(mail); - } catch (err) { + } catch (_) { console.error("Error while sending invitation email"); } } diff --git a/back/src/users/bulk-creation/types.ts b/back/src/users/bulk-creation/types.ts index b57de4835c..29cde2609b 100644 --- a/back/src/users/bulk-creation/types.ts +++ b/back/src/users/bulk-creation/types.ts @@ -3,6 +3,7 @@ import { companyValidationSchema, roleValidationSchema } from "./validations"; export type CompanyRow = InferType; +// eslint-disable-next-line @typescript-eslint/no-unused-vars const r = roleValidationSchema([]); export type RoleRow = InferType; diff --git a/back/src/users/bulk-creation/validations.ts b/back/src/users/bulk-creation/validations.ts index a0dc4e916a..3dff20b84e 100644 --- a/back/src/users/bulk-creation/validations.ts +++ b/back/src/users/bulk-creation/validations.ts @@ -31,7 +31,7 @@ export const companyValidationSchema = yup.object({ return false; } return true; - } catch (err) { + } catch (_) { return false; } } diff --git a/back/src/users/resolvers/queries/__tests__/me.integration.ts b/back/src/users/resolvers/queries/__tests__/me.integration.ts index 25eeaebe61..757759d567 100644 --- a/back/src/users/resolvers/queries/__tests__/me.integration.ts +++ b/back/src/users/resolvers/queries/__tests__/me.integration.ts @@ -53,7 +53,8 @@ describe("query me", () => { "BSD_CAN_SIGN_ACCEPTATION", "BSD_CAN_SIGN_OPERATION", "BSD_CAN_DELETE", - "BSD_CAN_REVISE" + "BSD_CAN_REVISE", + "REGISTRY_CAN_IMPORT" ]); }); }); diff --git a/back/src/users/resolvers/queries/__tests__/myCompanies.integration.ts b/back/src/users/resolvers/queries/__tests__/myCompanies.integration.ts index 25039c34e2..b886a8a4ea 100644 --- a/back/src/users/resolvers/queries/__tests__/myCompanies.integration.ts +++ b/back/src/users/resolvers/queries/__tests__/myCompanies.integration.ts @@ -461,7 +461,8 @@ describe("query { myCompanies }", () => { "BSD_CAN_SIGN_ACCEPTATION", "BSD_CAN_SIGN_OPERATION", "BSD_CAN_DELETE", - "BSD_CAN_REVISE" + "BSD_CAN_REVISE", + "REGISTRY_CAN_IMPORT" ]); }); diff --git a/back/src/users/typeDefs/user.enums.graphql b/back/src/users/typeDefs/user.enums.graphql index 89f2a3e3b5..4cf89d35b3 100644 --- a/back/src/users/typeDefs/user.enums.graphql +++ b/back/src/users/typeDefs/user.enums.graphql @@ -72,6 +72,8 @@ enum UserPermission { BSD_CAN_REVISE "Exporter le registre" REGISTRY_CAN_READ + "Importer des données dans le registre" + REGISTRY_CAN_IMPORT "Lire les informations de l'établissement" COMPANY_CAN_READ "Modifier les informations de l'établissement" diff --git a/docker-compose.yml b/docker-compose.yml index 03f6aded58..3572b0c989 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -33,6 +33,19 @@ services: ports: - 27017:27017 + minio: + image: minio/minio + restart: "${DOCKER_RESTART_POLICY:-unless-stopped}" + environment: + MINIO_ROOT_USER: trackdechets + MINIO_ROOT_PASSWORD: password + ports: + - "9000:9000" + - "8900:8900" + volumes: + - minio:/data/minio + command: minio server /data/minio --console-address ":8900" + nginx: image: nginx:1.19.6 restart: "${DOCKER_RESTART_POLICY:-unless-stopped}" @@ -55,3 +68,4 @@ volumes: postgres: elasticsearch: mongo: + minio: diff --git a/front/.eslintrc.json b/front/.eslintrc.json index 47d931d4ea..a27a725e64 100644 --- a/front/.eslintrc.json +++ b/front/.eslintrc.json @@ -12,7 +12,10 @@ "@typescript-eslint/ban-ts-comment": "off", "@typescript-eslint/ban-types": "off", "@typescript-eslint/no-non-null-asserted-optional-chain": "off", - "@typescript-eslint/no-empty-function": "off" + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/no-empty-object-type": "off", + "@typescript-eslint/no-unsafe-function-type": "off", + "@typescript-eslint/no-wrapper-object-types": "off" } }, { diff --git a/front/.storybook/main.ts b/front/.storybook/main.ts index 1bb8c15e1a..f4a10a623d 100644 --- a/front/.storybook/main.ts +++ b/front/.storybook/main.ts @@ -2,14 +2,17 @@ import type { StorybookConfig } from "@storybook/react-vite"; const config: StorybookConfig = { stories: ["../src/**/*.@(mdx|stories.@(js|jsx|ts|tsx))"], + addons: [ "@storybook/addon-links", "@storybook/addon-essentials", "@storybook/addon-interactions", "@storybook/addon-a11y", "storybook-addon-apollo-client", - "@storybook/addon-mdx-gfm" + "@storybook/addon-mdx-gfm", + "@chromatic-com/storybook" ], + framework: { name: "@storybook/react-vite", options: { @@ -18,8 +21,11 @@ const config: StorybookConfig = { } } }, - docs: { - autodocs: true + + docs: {}, + + typescript: { + reactDocgen: "react-docgen-typescript" } }; diff --git a/front/.storybook/preview.ts b/front/.storybook/preview.ts index c76d100a46..9887f19bc0 100644 --- a/front/.storybook/preview.ts +++ b/front/.storybook/preview.ts @@ -15,3 +15,4 @@ export const parameters = { MockedProvider } }; +export const tags = ["autodocs"]; diff --git a/front/project.json b/front/project.json index e9d3281e7d..3c00685dd6 100644 --- a/front/project.json +++ b/front/project.json @@ -3,6 +3,7 @@ "$schema": "../node_modules/nx/schemas/project-schema.json", "sourceRoot": "front/src", "projectType": "application", + "tags": [], "targets": { "dsfr": { "executor": "nx:run-commands", @@ -66,7 +67,8 @@ "production": { "buildTarget": "front:build:production" } - } + }, + "dependsOn": ["build"] }, "test": { "executor": "@nx/jest:jest", @@ -123,6 +125,5 @@ } } } - }, - "tags": [] + } } diff --git a/front/src/Apps/common/Components/SideBar/sidebar.scss b/front/src/Apps/common/Components/SideBar/sidebar.scss index 4d8d3da829..cfbb0a550c 100644 --- a/front/src/Apps/common/Components/SideBar/sidebar.scss +++ b/front/src/Apps/common/Components/SideBar/sidebar.scss @@ -8,6 +8,7 @@ border-right: solid 1px $grey-light; position: sticky; top: 56px; + flex-shrink: 0; &__item { display: -webkit-box; @@ -15,7 +16,7 @@ -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; - word-break: break-all; + word-break: break-word; line-height: 30px; border-left: 3px solid transparent; padding-left: 1rem; diff --git a/front/src/Apps/common/Components/layout/Header.tsx b/front/src/Apps/common/Components/layout/Header.tsx index d1433b42fe..d48374c036 100644 --- a/front/src/Apps/common/Components/layout/Header.tsx +++ b/front/src/Apps/common/Components/layout/Header.tsx @@ -48,6 +48,7 @@ export const GET_ME = gql` securityCode companyTypes userPermissions + featureFlags } } } @@ -69,7 +70,7 @@ const MenuLink = ({ entry }) => { ); }; -function DashboardSubNav({ currentCompany }) { +function DashboardSubNav({ currentCompany, canViewNewRegistry }) { const { permissions, role } = usePermissions(); const location = useLocation(); @@ -308,6 +309,17 @@ function DashboardSubNav({ currentCompany }) { /> )} + {showRegistryTab && canViewNewRegistry && ( +
  • + +
  • + )} ); } @@ -317,7 +329,7 @@ function DashboardSubNav({ currentCompany }) { * Navigation subset to be included in the moble slidning panel nav * Contains main navigation items from the desktop top level nav (Dashboard, Account etc.) */ -function MobileSubNav({ currentCompany }) { +function MobileSubNav({ currentCompany, canViewNewRegistry }) { const location = useLocation(); const matchAccount = matchPath( @@ -334,7 +346,12 @@ function MobileSubNav({ currentCompany }) { if (!currentCompany) { dashboardSubNav = null; } else { - dashboardSubNav = ; + dashboardSubNav = ( + + ); } return ( @@ -444,7 +461,8 @@ const getDesktopMenuEntries = ( isAuthenticated, isAdmin, showRegistry, - currentSiret + currentSiret, + canViewNewRegistry ) => { const admin = [ { @@ -459,7 +477,16 @@ const getDesktopMenuEntries = ( caption: "Mes registres", href: routes.registry, navlink: true - } + }, + ...(canViewNewRegistry + ? [ + { + caption: "Mes registres (v2)", + href: routes.registry_new.myImports, + navlink: true + } + ] + : []) ]; const connected = [ { @@ -570,11 +597,16 @@ export default function Header({ company => company.orgId === currentSiret ); + const canViewNewRegistry = companies?.some(company => + company.featureFlags?.includes("REGISTRY_V2") + ); + const menuEntries = getDesktopMenuEntries( isAuthenticated, isAdmin, showRegistry, - currentSiret + currentSiret, + canViewNewRegistry ); return !isAuthenticated ? ( @@ -874,7 +906,10 @@ export default function Header({
    - +
    {/* Company switcher on top of the page */} diff --git a/front/src/Apps/common/Components/layout/LayoutContainer.tsx b/front/src/Apps/common/Components/layout/LayoutContainer.tsx index b546714291..dd7b59065e 100644 --- a/front/src/Apps/common/Components/layout/LayoutContainer.tsx +++ b/front/src/Apps/common/Components/layout/LayoutContainer.tsx @@ -14,6 +14,8 @@ import { getDefaultOrgId } from "../CompanySwitcher/CompanySwitcher"; import { usePermissions } from "../../../../common/contexts/PermissionsContext"; import Exports from "../../../../dashboard/exports/Registry"; import { Oauth2Dialog, OidcDialog } from "../../../../oauth/AuthDialog"; +import { MyImports } from "../../../../dashboard/registry/MyImports"; +import { CompanyImports } from "../../../../dashboard/registry/CompanyImports"; const Admin = lazy(() => import("../../../../admin/Admin")); const DashboardRoutes = lazy( @@ -291,6 +293,24 @@ export default function LayoutContainer() { } /> + + + + } + /> + + + + + } + /> + { +const loop = (data: readonly WasteNode[]) => { return data.map(item => { if (item.children) { return ( @@ -17,7 +17,7 @@ const loop = (data: WasteNode[]) => { }; type Props = { - wasteTree?: WasteNode[]; + wasteTree?: readonly WasteNode[]; checkable?: boolean; onSelect?: (selectedKeys: any) => void; }; diff --git a/front/src/Apps/common/Components/search/WasteTreeModal.tsx b/front/src/Apps/common/Components/search/WasteTreeModal.tsx index 42172e2043..434952fb27 100644 --- a/front/src/Apps/common/Components/search/WasteTreeModal.tsx +++ b/front/src/Apps/common/Components/search/WasteTreeModal.tsx @@ -5,7 +5,7 @@ import TdModal from "../Modal/Modal"; import { BSDD_WASTES_TREE, WasteNode } from "@td/constants"; import Button from "@codegouvfr/react-dsfr/Button"; type Props = { - wasteTree?: WasteNode[]; + wasteTree?: readonly WasteNode[]; open: boolean; onClose?: () => void; onSelect?: (value: any) => void; diff --git a/front/src/Apps/routes.ts b/front/src/Apps/routes.ts index 4c49e1e268..a9b55cdf72 100644 --- a/front/src/Apps/routes.ts +++ b/front/src/Apps/routes.ts @@ -130,7 +130,12 @@ const routes = { join: "/companies/join", orientation: "/companies/create" }, - registry: "/registre" + registry: "/registre", + registry_new: { + myImports: "/registre-v2/own", + companyImports: "/registre-v2/list", + export: "/registre-v2/export" + } }; export const titles = { diff --git a/front/src/admin/bulkProfilesUpdate/BulkprofilesUpdateAdmin.tsx b/front/src/admin/bulkProfilesUpdate/BulkprofilesUpdateAdmin.tsx index 417c5b46ab..4a8b249f2f 100644 --- a/front/src/admin/bulkProfilesUpdate/BulkprofilesUpdateAdmin.tsx +++ b/front/src/admin/bulkProfilesUpdate/BulkprofilesUpdateAdmin.tsx @@ -26,7 +26,7 @@ const validationSchema = z.object({ .transform((val, ctx) => { try { return JSON.parse(val); - } catch (error) { + } catch (_) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: "Le json est invalide" diff --git a/front/src/common/helper.ts b/front/src/common/helper.ts index 3b096222c2..b48964b47a 100644 --- a/front/src/common/helper.ts +++ b/front/src/common/helper.ts @@ -91,7 +91,7 @@ export const getNestedNode = (obj: Object, path: string): any => { const paths = path.split("."); try { return traverse({ obj, paths }); - } catch (e) { + } catch (_) { return null; } }; diff --git a/front/src/dashboard/components/BSDList/BSDD/WorkflowAction/SignEmissionFormModalContent.tsx b/front/src/dashboard/components/BSDList/BSDD/WorkflowAction/SignEmissionFormModalContent.tsx index 69ec26058a..5b6ca90f2e 100644 --- a/front/src/dashboard/components/BSDList/BSDD/WorkflowAction/SignEmissionFormModalContent.tsx +++ b/front/src/dashboard/components/BSDList/BSDD/WorkflowAction/SignEmissionFormModalContent.tsx @@ -152,7 +152,7 @@ function SignEmissionFormModalContent({ } }); onClose(); - } catch (err) { + } catch (_) { // Ignore error } }; diff --git a/front/src/dashboard/components/BSDList/BSDD/WorkflowAction/SignTransportFormModalContent.tsx b/front/src/dashboard/components/BSDList/BSDD/WorkflowAction/SignTransportFormModalContent.tsx index 6d90208b18..73e21f97ea 100644 --- a/front/src/dashboard/components/BSDList/BSDD/WorkflowAction/SignTransportFormModalContent.tsx +++ b/front/src/dashboard/components/BSDList/BSDD/WorkflowAction/SignTransportFormModalContent.tsx @@ -187,7 +187,7 @@ export default function SignTransportFormModalContent({ } }); onClose(); - } catch (err) { + } catch (_) { // Ignore error } }} diff --git a/front/src/dashboard/registry/CompanyImports.tsx b/front/src/dashboard/registry/CompanyImports.tsx new file mode 100644 index 0000000000..4d094f8a5a --- /dev/null +++ b/front/src/dashboard/registry/CompanyImports.tsx @@ -0,0 +1,157 @@ +import { useLazyQuery, useQuery } from "@apollo/client"; +import Button from "@codegouvfr/react-dsfr/Button"; +import { Download } from "@codegouvfr/react-dsfr/Download"; +import Table from "@codegouvfr/react-dsfr/Table"; +import { + Query, + QueryRegistryDownloadSignedUrlArgs, + RegistryDownloadTarget +} from "@td/codegen-ui"; +import React, { useState } from "react"; + +import Alert from "@codegouvfr/react-dsfr/Alert"; +import { format } from "date-fns"; +import { InlineLoader } from "../../Apps/common/Components/Loader/Loaders"; +import { MEDIA_QUERIES } from "../../common/config"; +import { useMedia } from "../../common/use-media"; +import { RegistryCompanySwitcher } from "./RegistryCompanySwitcher"; +import RegistryMenu from "./RegistryMenu"; +import { + badges, + downloadFromSignedUrl, + GET_REGISTRY_IMPORTS, + REGISTRY_DOWNLOAD_SIGNED_URL +} from "./shared"; + +const HEADERS = [ + "Date", + "Import", + "Déclaration", + "Déclaré par", + "Fichier importé", + "Rapport d'erreur" +]; + +export function CompanyImports() { + const [siret, setSiret] = useState(); + const isMobile = useMedia(`(max-width: ${MEDIA_QUERIES.handHeld})`); + + const { loading, error, data } = useQuery>( + GET_REGISTRY_IMPORTS, + { variables: { siret, first: 25 }, skip: !siret } + ); + + const [getDownloadLink] = useLazyQuery< + Pick, + Partial + >(REGISTRY_DOWNLOAD_SIGNED_URL); + + async function downloadErrorFile(importId: string) { + const link = await getDownloadLink({ + variables: { importId, target: RegistryDownloadTarget.ErrorFile } + }); + await downloadFromSignedUrl(link.data?.registryDownloadSignedUrl.signedUrl); + } + async function downloadImportFile(importId: string) { + const link = await getDownloadLink({ + variables: { importId, target: RegistryDownloadTarget.ImportFile } + }); + await downloadFromSignedUrl(link.data?.registryDownloadSignedUrl.signedUrl); + } + + const tableData = + data?.registryImports.edges.map(importData => [ + format(new Date(importData.node.createdAt), "dd/MM/yyyy HH'h'mm"), +
    + {badges[importData.node.status]} +
    {importData.node.type}
    +
    , +
      + {importData.node.numberOfErrors > 0 && ( +
    • + {importData.node.numberOfErrors} en erreur +
    • + )} + {importData.node.numberOfInsertions > 0 && ( +
    • {importData.node.numberOfInsertions} ajoutée(s)
    • + )} + {importData.node.numberOfEdits > 0 && ( +
    • {importData.node.numberOfEdits} modifiée(s)
    • + )} + {importData.node.numberOfCancellations > 0 && ( +
    • {importData.node.numberOfCancellations} annulée(s)
    • + )} + {importData.node.numberOfSkipped > 0 && ( +
    • {importData.node.numberOfSkipped} ignorée(s)
    • + )} +
    , + importData.node.createdBy.name, +
    + { + e.preventDefault(); + downloadImportFile(importData.node.id); + } + }} + /> +
    , +
    + {importData.node.numberOfErrors > 0 && ( +
    + ]) ?? []; + + return ( +
    + {!isMobile && } +
    +
    +
    + setSiret(v)} /> +
    + {loading && } + {error && ( + + )} + {data && tableData.length === 0 && ( +

    + Aucun import n'a encore été réalisé pour cette entreprise +

    + )} + {data && tableData.length > 0 && ( +
    + + + )} + + + + ); +} diff --git a/front/src/dashboard/registry/ImportModal.tsx b/front/src/dashboard/registry/ImportModal.tsx new file mode 100644 index 0000000000..dd6e20e748 --- /dev/null +++ b/front/src/dashboard/registry/ImportModal.tsx @@ -0,0 +1,372 @@ +import { gql, useMutation, useQuery } from "@apollo/client"; +import Alert from "@codegouvfr/react-dsfr/Alert"; +import Select from "@codegouvfr/react-dsfr/Select"; +import Stepper from "@codegouvfr/react-dsfr/Stepper"; +import { Upload } from "@codegouvfr/react-dsfr/Upload"; +import { + Mutation, + MutationImportFileArgs, + Query, + QueryRegistryImportArgs, + QueryRegistryUploadSignedUrlArgs, + RegistryImportStatus, + RegistryImportType +} from "@td/codegen-ui"; +import React, { useState } from "react"; +import { useForm, UseFormGetValues, UseFormRegister } from "react-hook-form"; +import { InlineLoader } from "../../Apps/common/Components/Loader/Loaders"; +import { Modal } from "../../common/components"; + +type Props = { isOpen: boolean; onClose: () => void }; + +type Inputs = { + type: RegistryImportType; + files: FileList; +}; + +type StepProps = { + getValues: UseFormGetValues; + register: UseFormRegister; + goToNextStep: () => void; + registryImportId: string | undefined; + setRegistryImportId: (string) => void; +}; + +const steps = [ + { title: "Téléchargement du fichier", component: Step1 }, + { title: "Vérification", component: Step2 }, + { title: "Importation", component: Step3 } +]; + +const REGISTRY_UPLOAD_SIGNED_URL = gql` + query RegistryUploadSignedUrl($fileName: String!) { + registryUploadSignedUrl(fileName: $fileName) { + fileKey + signedUrl + } + } +`; + +const IMPORT_FILE = gql` + mutation importFile($importType: RegistryImportType!, $s3FileKey: String!) { + importFile(importType: $importType, s3FileKey: $s3FileKey) { + id + } + } +`; + +const REGISTRY_IMPORT = gql` + query RegistryImport($id: ID!) { + registryImport(id: $id) { + status + numberOfErrors + numberOfInsertions + numberOfEdits + numberOfCancellations + numberOfSkipped + } + } +`; + +export function ImportModal({ isOpen, onClose }: Props) { + const [currentStepIdx, setCurrentStepIdx] = useState(0); + const [registryImportId, setRegistryImportId] = useState< + string | undefined + >(); + const { + register, + getValues, + formState: { isValid } + } = useForm(); + + const closeAndReset = () => { + setCurrentStepIdx(0); + onClose(); + }; + + const StepComponent = steps[currentStepIdx].component; + + return ( + +
    + +
    + +
    + { + if (currentStepIdx < steps.length - 1) { + setCurrentStepIdx(currentStepIdx + 1); + } + }} + registryImportId={registryImportId} + setRegistryImportId={setRegistryImportId} + /> +
    + +
    + {currentStepIdx < steps.length - 1 ? ( + <> + + + + ) : ( + + )} +
    +
    + ); +} + +function Step1({ register }: StepProps) { + return ( +
    +
    + + Vous trouverez de l'aide sur le format de fichier et des exemples + dans la documentation +

    + } + severity="info" + /> +
    + + + + +
    + ); +} + +function Step2({ getValues, goToNextStep, setRegistryImportId }: StepProps) { + const [s3UploadError, setS3UploadError] = useState(null); + + const { files, type } = getValues(); + const file = files[0]; + + const [importFile, { error: importFileError }] = useMutation< + Pick, + MutationImportFileArgs + >(IMPORT_FILE, { onCompleted: goToNextStep }); + + const { error: signedUrlError } = useQuery< + Pick, + Partial + >(REGISTRY_UPLOAD_SIGNED_URL, { + variables: { fileName: file.name }, + fetchPolicy: "no-cache", + onCompleted: async ({ registryUploadSignedUrl }) => { + const uploadResponse = await fetch(registryUploadSignedUrl.signedUrl, { + method: "PUT", + headers: { + "Content-Type": file.type, + "x-amz-meta-filename": file.name + }, + body: file + }); + + if (uploadResponse.ok) { + const registryImport = await importFile({ + variables: { + importType: type, + s3FileKey: registryUploadSignedUrl.fileKey + } + }); + + setRegistryImportId(registryImport?.data?.importFile?.id); + } else { + setS3UploadError(uploadResponse.statusText); + } + } + }); + + return ( +
    + +
    + +
    + {signedUrlError && ( + + )} + {importFileError && ( + + )} + {s3UploadError && ( + + )} +
    + ); +} + +function Step3({ registryImportId }) { + const { data, stopPolling } = useQuery< + Pick, + Partial + >(REGISTRY_IMPORT, { + variables: { id: registryImportId }, + pollInterval: 5000 + }); + + const isStillRunning = + !data?.registryImport?.status || + [RegistryImportStatus.Pending, RegistryImportStatus.Started].includes( + data.registryImport.status + ); + + const isFailed = + data?.registryImport?.status && + [RegistryImportStatus.Canceled, RegistryImportStatus.Failed].includes( + data.registryImport.status + ); + const isSuccessful = + data?.registryImport?.status === RegistryImportStatus.Successful; + const isPartiallySuccessful = + data?.registryImport?.status === RegistryImportStatus.PartiallySuccessful; + + if (!isStillRunning) { + stopPolling(); + } + + const stats = [ + `${data?.registryImport?.numberOfErrors} déclarations en erreur non prises en compte`, + `${data?.registryImport?.numberOfInsertions} nouvelles déclarations`, + `${data?.registryImport?.numberOfEdits} déclarations corrigées`, + `${data?.registryImport?.numberOfCancellations} déclations annulées`, + `${data?.registryImport?.numberOfSkipped} déclations ignorées` + ].filter(v => !v.startsWith("0")); + + return ( +
    + {isStillRunning && ( + <> + +

    L'import est en cours...

    +

    + Vous pouvez consulter l'avancement de l'import en restant sur + cette fenêtre ou la quitter et suivre son avancement dans la + liste des imports. +

    +
      + {stats.map((stat, idx) => ( +
    • {stat}
    • + ))} +
    + + } + /> +
    + +
    + + )} + + {isSuccessful && ( + + {stats.map((stat, idx) => ( +
  • {stat}
  • + ))} + + } + /> + )} + + {isPartiallySuccessful && ( + + {stats.map((stat, idx) => ( +
  • {stat}
  • + ))} + + } + /> + )} + + {isFailed && ( + + {stats.map((stat, idx) => ( +
  • {stat}
  • + ))} + + } + /> + )} +
    + ); +} diff --git a/front/src/dashboard/registry/MyImports.tsx b/front/src/dashboard/registry/MyImports.tsx new file mode 100644 index 0000000000..bfd30cd867 --- /dev/null +++ b/front/src/dashboard/registry/MyImports.tsx @@ -0,0 +1,201 @@ +import { useLazyQuery, useQuery } from "@apollo/client"; +import Button from "@codegouvfr/react-dsfr/Button"; +import { Download } from "@codegouvfr/react-dsfr/Download"; +import Table from "@codegouvfr/react-dsfr/Table"; +import { + Query, + QueryRegistryDownloadSignedUrlArgs, + RegistryDownloadTarget +} from "@td/codegen-ui"; +import React, { useState } from "react"; + +import Alert from "@codegouvfr/react-dsfr/Alert"; +import { format } from "date-fns"; +import { InlineLoader } from "../../Apps/common/Components/Loader/Loaders"; +import { MEDIA_QUERIES } from "../../common/config"; +import { useMedia } from "../../common/use-media"; +import { ImportModal } from "./ImportModal"; +import RegistryMenu from "./RegistryMenu"; +import { + badges, + downloadFromSignedUrl, + GET_REGISTRY_IMPORTS, + REGISTRY_DOWNLOAD_SIGNED_URL +} from "./shared"; + +const HEADERS = [ + "Importé le", + "Registre", + "Déclarations", + "Etablissements concernés", + "Fichier importé", + "Rapport d'erreur" +]; + +export function MyImports() { + const isMobile = useMedia(`(max-width: ${MEDIA_QUERIES.handHeld})`); + const [isImportModalOpen, setIsImportModalOpen] = useState(false); + + const { loading, error, data, refetch } = useQuery< + Pick + >(GET_REGISTRY_IMPORTS, { variables: { ownImportsOnly: true, first: 25 } }); + + const [getDownloadLink] = useLazyQuery< + Pick, + Partial + >(REGISTRY_DOWNLOAD_SIGNED_URL, { fetchPolicy: "no-cache" }); + + async function downloadErrorFile(importId: string) { + const link = await getDownloadLink({ + variables: { importId, target: RegistryDownloadTarget.ErrorFile } + }); + await downloadFromSignedUrl(link.data?.registryDownloadSignedUrl.signedUrl); + } + async function downloadImportFile(importId: string) { + const link = await getDownloadLink({ + variables: { importId, target: RegistryDownloadTarget.ImportFile } + }); + await downloadFromSignedUrl(link.data?.registryDownloadSignedUrl.signedUrl); + } + + const tableData = + data?.registryImports.edges.map(importData => [ +
    +
    + {format(new Date(importData.node.createdAt), "dd/MM/yyyy HH'h'mm")} +
    + {badges[importData.node.status]} +
    , + importData.node.type, +
      + {importData.node.numberOfErrors > 0 && ( +
    • + {importData.node.numberOfErrors} en erreur +
    • + )} + {importData.node.numberOfInsertions > 0 && ( +
    • {importData.node.numberOfInsertions} ajoutée(s)
    • + )} + {importData.node.numberOfEdits > 0 && ( +
    • {importData.node.numberOfEdits} modifiée(s)
    • + )} + {importData.node.numberOfCancellations > 0 && ( +
    • {importData.node.numberOfCancellations} annulée(s)
    • + )} + {importData.node.numberOfSkipped > 0 && ( +
    • {importData.node.numberOfSkipped} ignorées(s)
    • + )} +
    , + importData.node.associations + .map( + association => + `${association.reportedFor.name} - ${association.reportedFor.siret}` + ) + .slice(0, 3) + .concat( + importData.node.associations.length > 3 + ? [`Et ${importData.node.associations.length - 3} autres`] + : [] + ) + .join("\n"), +
    + { + e.preventDefault(); + downloadImportFile(importData.node.id); + } + }} + /> +
    , +
    + {importData.node.numberOfErrors > 0 && ( +
    + ]) ?? []; + + return ( +
    + {!isMobile && } +
    +
    +
    +
    + +
    +
    + +
    +
    + {loading && } + {error && ( + + )} + {data && tableData.length === 0 && ( +
    +

    + Vous n'avez pas encore fait d'import +

    +

    + Utilisez le bouton "Importer" ci-dessus pour réaliser un import +

    +
    + )} + {data && tableData.length > 0 && ( +
    +
    + + )} + + + + { + setIsImportModalOpen(false); + refetch(); + }} + /> + + ); +} diff --git a/front/src/dashboard/registry/RegistryCompanySwitcher.tsx b/front/src/dashboard/registry/RegistryCompanySwitcher.tsx new file mode 100644 index 0000000000..1cc9356892 --- /dev/null +++ b/front/src/dashboard/registry/RegistryCompanySwitcher.tsx @@ -0,0 +1,198 @@ +import React, { useState, useMemo } from "react"; +import { useQuery, gql } from "@apollo/client"; +import { Query, QueryRegistryDelegationsArgs } from "@td/codegen-ui"; +import { debounce } from "../../common/helper"; +import { + MIN_MY_COMPANIES_SEARCH, + MAX_MY_COMPANIES_SEARCH +} from "@td/constants"; +import useOnClickOutsideRefTarget from "../../Apps/common/hooks/useOnClickOutsideRefTarget"; +import { Badge } from "@codegouvfr/react-dsfr/Badge"; +import { Input } from "@codegouvfr/react-dsfr/Input"; +import { REGISTRY_DELEGATIONS } from "../../Apps/common/queries/registryDelegation/queries"; + +type Props = { + onCompanySelect: (orgId: string) => void; +}; + +const MY_COMPANIES = gql` + query MyCompanies($first: Int, $after: ID, $search: String) { + myCompanies(first: $first, after: $after, search: $search) { + totalCount + pageInfo { + hasNextPage + endCursor + } + edges { + cursor + node { + id + name + orgId + siret + givenName + securityCode + } + } + } + } +`; + +export function RegistryCompanySwitcher({ onCompanySelect }: Props) { + const [isOpen, setIsOpen] = useState(false); + const [selectedItem, setSelectedItem] = useState(""); + + const { targetRef } = useOnClickOutsideRefTarget({ + onClickOutside: () => setIsOpen(false) + }); + + const { data: myCompaniesData, refetch: refetchMyCompanies } = useQuery< + Pick + >(MY_COMPANIES, { + variables: { first: 10 }, + onCompleted: data => { + if (!selectedItem) { + const firstNode = data.myCompanies.edges.find(({ node }) => node.siret); + + if (firstNode) { + setSelectedItem(`${firstNode.node.name} ${firstNode.node.siret}`); + onCompanySelect(firstNode.node.orgId); + } + } + } + }); + + const { data: delegationsData, refetch: refetchDelegations } = useQuery< + Pick, + QueryRegistryDelegationsArgs + >(REGISTRY_DELEGATIONS, { + variables: { + where: { + activeOnly: true, + givenToMe: true + }, + first: 10 + } + }); + + const debouncedSearch = useMemo( + () => + debounce(clue => { + refetchMyCompanies({ search: clue, first: 10 }); + refetchDelegations({ + where: { + activeOnly: true, + givenToMe: true, + search: clue + }, + first: 10 + }); + }, 1000), + [refetchMyCompanies, refetchDelegations] + ); + + const displayedCount = + (myCompaniesData?.myCompanies.edges.length || 0) + + (delegationsData?.registryDelegations.edges.length || 0); + const totalCount = + (myCompaniesData?.myCompanies.totalCount || 0) + + (delegationsData?.registryDelegations.totalCount || 0); + + return ( +
    } + > +
    setIsOpen(!isOpen)} + onKeyDown={e => { + if (e.key === "Enter") { + setIsOpen(!isOpen); + } + }} + > + {selectedItem} + +
    +
    +

    + {displayedCount} sur {totalCount} établissements +

    + { + const clue = e.currentTarget.value; + if ( + clue.length >= MIN_MY_COMPANIES_SEARCH && + clue.length <= MAX_MY_COMPANIES_SEARCH + ) { + debouncedSearch(e.currentTarget.value); + } + } + }} + label="" + /> + {myCompaniesData?.myCompanies.edges + .filter(edge => edge.node.siret) + .map(({ node }) => ( +
    { + onCompanySelect(node.orgId); + setSelectedItem(`${node.name} ${node.siret}`); + setIsOpen(false); + }} + onKeyDown={e => { + if (e.key === "Enter") { + onCompanySelect(node.orgId); + setSelectedItem(`${node.name} ${node.siret}`); + setIsOpen(false); + } + }} + key={node.orgId} + > + {node.name} {node.siret} +
    + ))} + {delegationsData?.registryDelegations.edges + .map(edge => edge.node.delegator) + .map(delegator => ( +
    { + onCompanySelect(delegator.orgId); + setSelectedItem(`${delegator.name} ${delegator.siret}`); + setIsOpen(false); + }} + onKeyDown={e => { + if (e.key === "Enter") { + onCompanySelect(delegator.orgId); + setSelectedItem(`${delegator.name} ${delegator.siret}`); + setIsOpen(false); + } + }} + key={delegator.orgId} + > +
    + {delegator.name} {delegator.orgId} +
    + + Délégation + +
    + ))} +
    +
    + ); +} diff --git a/front/src/dashboard/registry/RegistryMenu.tsx b/front/src/dashboard/registry/RegistryMenu.tsx new file mode 100644 index 0000000000..d48d7939f8 --- /dev/null +++ b/front/src/dashboard/registry/RegistryMenu.tsx @@ -0,0 +1,56 @@ +import React from "react"; +import SideBar from "../../Apps/common/Components/SideBar/SideBar"; +import { NavLink } from "react-router-dom"; +import routes from "../../Apps/routes"; +import { Accordion } from "@codegouvfr/react-dsfr/Accordion"; + +export const RegistryMenuContent = () => ( + +
      +
    • + + isActive + ? "sidebarv2__item sidebarv2__item--indented sidebarv2__item--active" + : "sidebarv2__item sidebarv2__item--indented" + } + > + Mes imports + +
    • +
    • + + isActive + ? "sidebarv2__item sidebarv2__item--indented sidebarv2__item--active" + : "sidebarv2__item sidebarv2__item--indented" + } + > + Imports par établissement + +
    • +
    • + + isActive + ? "sidebarv2__item sidebarv2__item--indented sidebarv2__item--active" + : "sidebarv2__item sidebarv2__item--indented" + } + > + Exports + +
    • +
    +
    +); + +export default function RegistryMenu() { + return ( + + + + ); +} diff --git a/front/src/dashboard/registry/shared.tsx b/front/src/dashboard/registry/shared.tsx new file mode 100644 index 0000000000..2c2643b15c --- /dev/null +++ b/front/src/dashboard/registry/shared.tsx @@ -0,0 +1,98 @@ +import Badge from "@codegouvfr/react-dsfr/Badge"; +import gql from "graphql-tag"; +import React from "react"; + +export const GET_REGISTRY_IMPORTS = gql` + query GetRegistryImports( + $siret: String + $ownImportsOnly: Boolean + $first: Int + ) { + registryImports( + siret: $siret + ownImportsOnly: $ownImportsOnly + first: $first + ) { + edges { + node { + id + createdAt + status + type + s3FileKey + originalFileName + numberOfErrors + numberOfInsertions + numberOfEdits + numberOfCancellations + numberOfSkipped + createdBy { + name + } + associations { + reportedFor { + siret + name + } + } + } + } + } + } +`; + +export const badges = { + PENDING: ( + + En attente + + ), + STARTED: ( + + En cours + + ), + SUCCESSFUL: ( + + Complet + + ), + PARTIALLY_SUCCESSFUL: ( + + Partiel + + ), + FAILED: ( + + Refus + + ), + CANCELED: ( + + Annulé + + ) +}; + +export const REGISTRY_DOWNLOAD_SIGNED_URL = gql` + query RegistryDownloadSignedUrl( + $importId: String! + $target: RegistryDownloadTarget! + ) { + registryDownloadSignedUrl(importId: $importId, target: $target) { + fileKey + signedUrl + } + } +`; + +export async function downloadFromSignedUrl(signedUrl: string | undefined) { + if (!signedUrl) { + return; + } + const link = document.createElement("a"); + link.href = signedUrl; + document.body.appendChild(link); + link.click(); + link.remove(); +} diff --git a/libs/back/env/src/index.ts b/libs/back/env/src/index.ts index 8bf3e21dba..ad78c5c393 100644 --- a/libs/back/env/src/index.ts +++ b/libs/back/env/src/index.ts @@ -124,6 +124,10 @@ export const schema = z.object({ S3_SECRET_ACCESS_KEY: z.string(), S3_BUCKET: z.string(), // ------- + // S3 for registry + S3_REGISTRY_ERRORS_BUCKET: z.string(), + S3_REGISTRY_IMPORTS_BUCKET: z.string(), + // ------- // S3 for empty bsds templates S3_BSD_TEMPLATES_ACCESS_KEY_ID: z.string().optional(), S3_BSD_TEMPLATES_SECRET_ACCESS_KEY: z.string().optional(), @@ -173,7 +177,7 @@ export type EnvVariables = z.infer; declare global { // eslint-disable-next-line @typescript-eslint/no-namespace namespace NodeJS { - // eslint-disable-next-line @typescript-eslint/no-empty-interface + // eslint-disable-next-line @typescript-eslint/no-empty-interface, @typescript-eslint/no-empty-object-type interface ProcessEnv extends z.infer {} } } diff --git a/libs/back/object-creator/project.json b/libs/back/object-creator/project.json index 48f86d059a..fc09407ef6 100644 --- a/libs/back/object-creator/project.json +++ b/libs/back/object-creator/project.json @@ -16,7 +16,7 @@ "main": "libs/back/object-creator/src/main.ts", "tsConfig": "libs/back/object-creator/tsconfig.app.json", "assets": ["libs/back/object-creator/src/assets"], - "generatePackageJson": true, + "generatePackageJson": false, "esbuildOptions": { "sourcemap": true, "outExtension": { diff --git a/libs/back/partial-backup/project.json b/libs/back/partial-backup/project.json index acbcb03ad3..51568c5676 100644 --- a/libs/back/partial-backup/project.json +++ b/libs/back/partial-backup/project.json @@ -16,7 +16,7 @@ "main": "libs/back/partial-backup/src/main.ts", "tsConfig": "libs/back/partial-backup/tsconfig.app.json", "assets": ["libs/back/partial-backup/src/assets"], - "generatePackageJson": true, + "generatePackageJson": false, "esbuildOptions": { "sourcemap": true, "outExtension": { diff --git a/libs/back/prisma/src/index.ts b/libs/back/prisma/src/index.ts index c40d6babb2..97088238fc 100644 --- a/libs/back/prisma/src/index.ts +++ b/libs/back/prisma/src/index.ts @@ -26,7 +26,7 @@ function getDbUrlWithSchema(rawDatabaseUrl: string) { dbUrl.searchParams.set("schema", "default$default"); return unescape(dbUrl.href); // unescape needed because of the `$` - } catch (err) { + } catch (_) { return ""; } } diff --git a/libs/back/prisma/src/migrations/20241023150420_add_registry_ssd/migration.sql b/libs/back/prisma/src/migrations/20241023150420_add_registry_ssd/migration.sql new file mode 100644 index 0000000000..eeba1d9eba --- /dev/null +++ b/libs/back/prisma/src/migrations/20241023150420_add_registry_ssd/migration.sql @@ -0,0 +1,93 @@ +-- CreateEnum +CREATE TYPE "RegistryImportStatus" AS ENUM ('PENDING', 'STARTED', 'SUCCESSFUL', 'PARTIALLY_SUCCESSFUL', 'FAILED', 'CANCELED'); + +-- CreateEnum +CREATE TYPE "RegistryImportType" AS ENUM ('SSD'); + +-- CreateTable +CREATE TABLE "RegistryImport" ( + "id" TEXT NOT NULL, + "createdAt" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMPTZ(6) NOT NULL, + "status" "RegistryImportStatus" NOT NULL DEFAULT 'PENDING', + "type" "RegistryImportType" NOT NULL, + "s3FileKey" TEXT NOT NULL, + "originalFileName" TEXT NOT NULL, + "numberOfErrors" INTEGER NOT NULL DEFAULT 0, + "numberOfInsertions" INTEGER NOT NULL DEFAULT 0, + "numberOfEdits" INTEGER NOT NULL DEFAULT 0, + "numberOfCancellations" INTEGER NOT NULL DEFAULT 0, + "numberOfSkipped" INTEGER NOT NULL DEFAULT 0, + "createdById" TEXT NOT NULL, + + CONSTRAINT "RegistryImport_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "RegistryImportAssociation" ( + "importId" TEXT NOT NULL, + "reportedFor" TEXT NOT NULL, + "reportedAs" TEXT NOT NULL, + + CONSTRAINT "RegistryImportAssociation_pkey" PRIMARY KEY ("importId","reportedFor","reportedAs") +); + +-- CreateTable +CREATE TABLE "RegistrySsd" ( + "id" TEXT NOT NULL, + "createdAt" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "importId" TEXT, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "isCancelled" BOOLEAN NOT NULL DEFAULT false, + "createdById" TEXT NOT NULL, + "publicId" TEXT NOT NULL, + "reportForSiret" TEXT NOT NULL, + "reportForName" TEXT NOT NULL, + "reportForAddress" TEXT NOT NULL, + "reportForCity" TEXT NOT NULL, + "reportForPostalCode" TEXT NOT NULL, + "reportAsSiret" TEXT, + "weightValue" DOUBLE PRECISION NOT NULL, + "weightIsEstimate" BOOLEAN NOT NULL, + "volume" DOUBLE PRECISION, + "wasteCode" TEXT NOT NULL, + "wasteCodeBale" TEXT, + "wasteDescription" TEXT NOT NULL, + "secondaryWasteCodes" TEXT[] DEFAULT ARRAY[]::TEXT[], + "secondaryWasteDescriptions" TEXT[] DEFAULT ARRAY[]::TEXT[], + "dispatchDate" TIMESTAMPTZ(6), + "useDate" TIMESTAMPTZ(6), + "processingDate" TIMESTAMPTZ(6) NOT NULL, + "processingEndDate" TIMESTAMPTZ(6), + "operationCode" TEXT NOT NULL, + "operationMode" "OperationMode" NOT NULL, + "product" TEXT NOT NULL, + "administrativeActReference" TEXT NOT NULL, + "destinationType" TEXT NOT NULL, + "destinationOrgId" TEXT, + "destinationName" TEXT, + "destinationAddress" TEXT, + "destinationCity" TEXT, + "destinationPostalCode" TEXT, + "destinationCountryCode" TEXT, + + CONSTRAINT "RegistrySsd_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE INDEX "_RegistryImportCreatedByIdIdx" ON "RegistryImport"("createdById"); + +-- CreateIndex +CREATE INDEX "_RegistrySsdImportIdIdx" ON "RegistrySsd"("importId"); + +-- CreateIndex +CREATE INDEX "_RegistrySsdPublicIdIdx" ON "RegistrySsd"("publicId"); + +-- AddForeignKey +ALTER TABLE "RegistryImport" ADD CONSTRAINT "RegistryImport_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "RegistryImportAssociation" ADD CONSTRAINT "RegistryImportAssociation_importId_fkey" FOREIGN KEY ("importId") REFERENCES "RegistryImport"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "RegistrySsd" ADD CONSTRAINT "RegistrySsd_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/libs/back/prisma/src/migrations/20241105204323_add_registry_incoming_waste/migration.sql b/libs/back/prisma/src/migrations/20241105204323_add_registry_incoming_waste/migration.sql new file mode 100644 index 0000000000..65f97f53c2 --- /dev/null +++ b/libs/back/prisma/src/migrations/20241105204323_add_registry_incoming_waste/migration.sql @@ -0,0 +1,108 @@ +-- AlterEnum +ALTER TYPE "RegistryImportType" ADD VALUE 'INCOMING_WASTE'; + +-- CreateTable +CREATE TABLE "RegistryIncomingWaste" ( + "id" TEXT NOT NULL, + "createdAt" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "importId" TEXT, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "isCancelled" BOOLEAN NOT NULL DEFAULT false, + "createdById" TEXT NOT NULL, + "publicId" TEXT NOT NULL, + "reportForSiret" TEXT NOT NULL, + "reportForName" TEXT NOT NULL, + "reportForAddress" TEXT NOT NULL, + "reportForCity" TEXT NOT NULL, + "reportForPostalCode" TEXT NOT NULL, + "reportAsSiret" TEXT, + "wasteCode" TEXT NOT NULL, + "wastePop" BOOLEAN NOT NULL, + "wasteIsDangerous" BOOLEAN, + "receptionDate" TIMESTAMP(3) NOT NULL, + "weighingHour" TEXT, + "wasteDescription" TEXT NOT NULL, + "wasteCodeBale" TEXT, + "weightValue" DOUBLE PRECISION NOT NULL, + "weightIsEstimate" BOOLEAN NOT NULL, + "volume" DOUBLE PRECISION, + "producerType" TEXT NOT NULL, + "producerOrgId" TEXT, + "producerName" TEXT, + "producerAddress" TEXT, + "producerPostalCode" TEXT, + "producerCity" TEXT, + "producerCountryCode" TEXT, + "municipalitiesInseeCodes" TEXT[], + "municipalitiesNames" TEXT[], + "senderType" TEXT NOT NULL, + "senderOrgId" TEXT, + "senderName" TEXT, + "senderTakeOverFullAddress" TEXT, + "senderAddress" TEXT, + "senderPostalCode" TEXT, + "senderCity" TEXT, + "senderCountryCode" TEXT, + "brokerSiret" TEXT, + "brokerName" TEXT, + "brokerReceiptNumber" TEXT, + "traderSiret" TEXT, + "traderName" TEXT, + "traderReceiptNumber" TEXT, + "ecoOrganismeSiret" TEXT, + "ecoOrganismeName" TEXT, + "operationCode" TEXT NOT NULL, + "documentNumber" TEXT, + "notificationNumber" TEXT, + "notificationDocumentInputNumber" TEXT, + "transporter1TransportMode" "TransportMode" NOT NULL, + "transporter1Type" TEXT NOT NULL, + "transporter1OrgId" TEXT, + "transporter1ReceiptNumber" TEXT, + "transporter1Name" TEXT, + "transporter1Address" TEXT, + "transporter1PostalCode" TEXT, + "transporter1City" TEXT, + "transporter1CountryCode" TEXT, + "transporter2TransportMode" "TransportMode", + "transporter2Type" TEXT, + "transporter2OrgId" TEXT, + "transporter2ReceiptNumber" TEXT, + "transporter2Name" TEXT, + "transporter2Address" TEXT, + "transporter2PostalCode" TEXT, + "transporter2City" TEXT, + "transporter2CountryCode" TEXT, + "transporter3TransportMode" "TransportMode", + "transporter3Type" TEXT, + "transporter3OrgId" TEXT, + "transporter3ReceiptNumber" TEXT, + "transporter3Name" TEXT, + "transporter3Address" TEXT, + "transporter3PostalCode" TEXT, + "transporter3City" TEXT, + "transporter3CountryCode" TEXT, + "transporter4TransportMode" "TransportMode", + "transporter4Type" TEXT, + "transporter4OrgId" TEXT, + "transporter4ReceiptNumber" TEXT, + "transporter4Name" TEXT, + "transporter4Address" TEXT, + "transporter4PostalCode" TEXT, + "transporter4City" TEXT, + "transporter4CountryCode" TEXT, + "transporter5TransportMode" "TransportMode", + "transporter5Type" TEXT, + "transporter5OrgId" TEXT, + "transporter5ReceiptNumber" TEXT, + "transporter5Name" TEXT, + "transporter5Address" TEXT, + "transporter5PostalCode" TEXT, + "transporter5City" TEXT, + "transporter5CountryCode" TEXT, + + CONSTRAINT "RegistryIncomingWaste_pkey" PRIMARY KEY ("id") +); + +-- AddForeignKey +ALTER TABLE "RegistryIncomingWaste" ADD CONSTRAINT "RegistryIncomingWaste_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/libs/back/prisma/src/schema.prisma b/libs/back/prisma/src/schema.prisma index a0f82e80dd..be80eb70aa 100644 --- a/libs/back/prisma/src/schema.prisma +++ b/libs/back/prisma/src/schema.prisma @@ -313,7 +313,7 @@ model Company { webhookSettingsLimit Int @default(1) delegatorRegistryDelegations RegistryDelegation[] @relation("RegistryDelegationDelegator") - delegateRegistryDelegations RegistryDelegation[] @relation("RegistryDelegationDelegate") + delegateRegistryDelegations RegistryDelegation[] @relation("RegistryDelegationDelegate") @@index([name], map: "_CompanyNameIdx") @@index([givenName], map: "_CompanyGivenNameIdx") @@ -923,13 +923,16 @@ model User { StatusLog StatusLog[] UserResetPasswordHash UserResetPasswordHash[] - bsdasriEmissionSignatures Bsdasri[] @relation("BsdasriEmissionSignature") - bsdasriTransportSignatures Bsdasri[] @relation("BsdasriTransportSignature") - bsdasriReceptionSignatures Bsdasri[] @relation("BsdasriReceptionSignature") - bsdasriOperationignatures Bsdasri[] @relation("BsdasriOperationSignature") + bsdasriEmissionSignatures Bsdasri[] @relation("BsdasriEmissionSignature") + bsdasriTransportSignatures Bsdasri[] @relation("BsdasriTransportSignature") + bsdasriReceptionSignatures Bsdasri[] @relation("BsdasriReceptionSignature") + bsdasriOperationignatures Bsdasri[] @relation("BsdasriOperationSignature") Form Form[] UserActivationHash UserActivationHash[] CompanyDigest CompanyDigest[] + registryImports RegistryImport[] + registrySsds RegistrySsd[] + registryIncomingWastes RegistryIncomingWaste[] } enum GovernmentPermission { @@ -1135,12 +1138,12 @@ model RegistryDelegation { updatedAt DateTime @updatedAt @db.Timestamptz(6) // Entreprise délégataire - delegateId String @db.VarChar(30) - delegate Company @relation("RegistryDelegationDelegate", fields: [delegateId], references: [id]) + delegateId String @db.VarChar(30) + delegate Company @relation("RegistryDelegationDelegate", fields: [delegateId], references: [id]) // Entreprise délégante - delegatorId String @db.VarChar(30) - delegator Company @relation("RegistryDelegationDelegator", fields: [delegatorId], references: [id]) + delegatorId String @db.VarChar(30) + delegator Company @relation("RegistryDelegationDelegator", fields: [delegatorId], references: [id]) // Dates de validité startDate DateTime @db.Timestamptz(6) @@ -1148,7 +1151,7 @@ model RegistryDelegation { comment String? @db.VarChar(500) - revokedBy String? @db.VarChar(30) + revokedBy String? @db.VarChar(30) cancelledBy String? @db.VarChar(30) @@index([delegateId], map: "_RegistryDelegationDelegateIdIdx") @@ -2218,3 +2221,200 @@ enum EmptyReturnADR { EMPTY_VEHICLE EMPTY_CITERNE } + +model RegistryImport { + id String @id @default(cuid()) + createdAt DateTime @default(now()) @db.Timestamptz(6) + updatedAt DateTime @updatedAt @db.Timestamptz(6) + status RegistryImportStatus @default(PENDING) + type RegistryImportType + s3FileKey String + originalFileName String + + numberOfErrors Int @default(0) + numberOfInsertions Int @default(0) + numberOfEdits Int @default(0) + numberOfCancellations Int @default(0) + numberOfSkipped Int @default(0) + + createdById String + createdBy User @relation(fields: [createdById], references: [id]) + + associations RegistryImportAssociation[] + + @@index([createdById], map: "_RegistryImportCreatedByIdIdx") +} + +model RegistryImportAssociation { + importId String + reportedFor String + reportedAs String + + import RegistryImport @relation(fields: [importId], references: [id], onDelete: Cascade) + + @@id([importId, reportedFor, reportedAs]) +} + +enum RegistryImportStatus { + PENDING + STARTED + SUCCESSFUL + PARTIALLY_SUCCESSFUL + FAILED + CANCELED +} + +enum RegistryImportType { + SSD + INCOMING_WASTE +} + +model RegistrySsd { + id String @id @default(cuid()) + createdAt DateTime @default(now()) @db.Timestamptz(6) + importId String? + + isActive Boolean @default(true) + isCancelled Boolean @default(false) + + createdById String + createdBy User @relation(fields: [createdById], references: [id]) + + publicId String + reportForSiret String + reportForName String + reportForAddress String + reportForCity String + reportForPostalCode String + reportAsSiret String? + weightValue Float + weightIsEstimate Boolean + volume Float? + wasteCode String + wasteCodeBale String? + wasteDescription String + secondaryWasteCodes String[] @default([]) + secondaryWasteDescriptions String[] @default([]) + dispatchDate DateTime? @db.Timestamptz(6) + useDate DateTime? @db.Timestamptz(6) + processingDate DateTime @db.Timestamptz(6) + processingEndDate DateTime? @db.Timestamptz(6) + operationCode String + operationMode OperationMode + product String + administrativeActReference String + destinationType String + destinationOrgId String? + destinationName String? + destinationAddress String? + destinationCity String? + destinationPostalCode String? + destinationCountryCode String? + + @@index([importId], map: "_RegistrySsdImportIdIdx") + @@index([publicId], map: "_RegistrySsdPublicIdIdx") +} + +model RegistryIncomingWaste { + id String @id @default(cuid()) + createdAt DateTime @default(now()) @db.Timestamptz(6) + importId String? + + isActive Boolean @default(true) + isCancelled Boolean @default(false) + + createdById String + createdBy User @relation(fields: [createdById], references: [id]) + + publicId String + reportForSiret String + reportForName String + reportForAddress String + reportForCity String + reportForPostalCode String + reportAsSiret String? + wasteCode String + wastePop Boolean + wasteIsDangerous Boolean? + receptionDate DateTime + weighingHour String? + wasteDescription String + wasteCodeBale String? + weightValue Float + weightIsEstimate Boolean + volume Float? + producerType String + producerOrgId String? + producerName String? + producerAddress String? + producerPostalCode String? + producerCity String? + producerCountryCode String? + municipalitiesInseeCodes String[] + municipalitiesNames String[] + senderType String + senderOrgId String? + senderName String? + senderTakeOverFullAddress String? + senderAddress String? + senderPostalCode String? + senderCity String? + senderCountryCode String? + brokerSiret String? + brokerName String? + brokerReceiptNumber String? + traderSiret String? + traderName String? + traderReceiptNumber String? + ecoOrganismeSiret String? + ecoOrganismeName String? + operationCode String + documentNumber String? + notificationNumber String? + notificationDocumentInputNumber String? + transporter1TransportMode TransportMode + transporter1Type String + transporter1OrgId String? + transporter1ReceiptNumber String? + transporter1Name String? + transporter1Address String? + transporter1PostalCode String? + transporter1City String? + transporter1CountryCode String? + transporter2TransportMode TransportMode? + transporter2Type String? + transporter2OrgId String? + transporter2ReceiptNumber String? + transporter2Name String? + transporter2Address String? + transporter2PostalCode String? + transporter2City String? + transporter2CountryCode String? + transporter3TransportMode TransportMode? + transporter3Type String? + transporter3OrgId String? + transporter3ReceiptNumber String? + transporter3Name String? + transporter3Address String? + transporter3PostalCode String? + transporter3City String? + transporter3CountryCode String? + transporter4TransportMode TransportMode? + transporter4Type String? + transporter4OrgId String? + transporter4ReceiptNumber String? + transporter4Name String? + transporter4Address String? + transporter4PostalCode String? + transporter4City String? + transporter4CountryCode String? + transporter5TransportMode TransportMode? + transporter5Type String? + transporter5OrgId String? + transporter5ReceiptNumber String? + transporter5Name String? + transporter5Address String? + transporter5PostalCode String? + transporter5City String? + transporter5CountryCode String? +} diff --git a/libs/back/registry/.eslintrc.json b/libs/back/registry/.eslintrc.json new file mode 100644 index 0000000000..d1bba2fd04 --- /dev/null +++ b/libs/back/registry/.eslintrc.json @@ -0,0 +1,30 @@ +{ + "extends": ["../../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.json"], + "parser": "jsonc-eslint-parser", + "rules": { + "@nx/dependency-checks": [ + "error", + { + "ignoredFiles": ["{projectRoot}/esbuild.config.{js,ts,mjs,mts}"] + } + ] + } + } + ] +} diff --git a/libs/back/registry/README.md b/libs/back/registry/README.md new file mode 100644 index 0000000000..648dca9790 --- /dev/null +++ b/libs/back/registry/README.md @@ -0,0 +1 @@ +Code de getion des registres. diff --git a/libs/back/registry/jest.config.ts b/libs/back/registry/jest.config.ts new file mode 100644 index 0000000000..67e9671bf4 --- /dev/null +++ b/libs/back/registry/jest.config.ts @@ -0,0 +1,11 @@ +/* eslint-disable */ +export default { + displayName: "@td/registry", + preset: "../../../jest.preset.js", + testEnvironment: "node", + transform: { + "^.+\\.[tj]s$": ["ts-jest", { tsconfig: "/tsconfig.spec.json" }] + }, + moduleFileExtensions: ["ts", "js", "html"], + coverageDirectory: "../../../coverage/libs/back/registry" +}; diff --git a/libs/back/registry/project.json b/libs/back/registry/project.json new file mode 100644 index 0000000000..1c75c04305 --- /dev/null +++ b/libs/back/registry/project.json @@ -0,0 +1,20 @@ +{ + "name": "@td/registry", + "$schema": "../../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "libs/back/registry/src", + "projectType": "library", + "targets": { + "lint": { + "executor": "@nx/eslint:lint", + "outputs": ["{options.outputFile}"] + }, + "test": { + "executor": "@nx/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "libs/back/registry/jest.config.ts" + } + } + }, + "tags": [] +} diff --git a/libs/back/registry/src/config.ts b/libs/back/registry/src/config.ts new file mode 100644 index 0000000000..e73269e7f1 --- /dev/null +++ b/libs/back/registry/src/config.ts @@ -0,0 +1,12 @@ +import { z } from "zod"; + +export const envConfig = z + .object({ + S3_ENDPOINT: z.string(), + S3_REGION: z.string(), + S3_ACCESS_KEY_ID: z.string(), + S3_SECRET_ACCESS_KEY: z.string(), + S3_REGISTRY_ERRORS_BUCKET: z.string(), + S3_REGISTRY_IMPORTS_BUCKET: z.string() + }) + .parse(process.env); diff --git a/libs/back/registry/src/database.ts b/libs/back/registry/src/database.ts new file mode 100644 index 0000000000..f5e1e0f4a5 --- /dev/null +++ b/libs/back/registry/src/database.ts @@ -0,0 +1,87 @@ +import { prisma } from "@td/prisma"; + +type ImportStats = { + errors: number; + insertions: number; + edits: number; + cancellations: number; + skipped: number; +}; + +export async function startImport(importId: string) { + const registryImport = await prisma.registryImport.update({ + where: { id: importId }, + data: { status: "STARTED" } + }); + + return registryImport; +} + +export async function endImport({ + importId, + stats, + sirets +}: { + importId: string; + stats: ImportStats; + sirets: { for: string; as: string }[]; +}) { + const status = getStatus(stats); + + const importResult = await prisma.registryImport.update({ + where: { id: importId }, + data: { + status, + numberOfCancellations: stats.cancellations, + numberOfSkipped: stats.skipped, + numberOfEdits: stats.edits, + numberOfErrors: stats.errors, + numberOfInsertions: stats.insertions, + associations: { + createMany: { + data: sirets.map(siret => ({ + reportedFor: siret.for, + reportedAs: siret.as + })) + } + } + } + }); + + return importResult; +} + +export function updateImportStats({ + importId, + stats +}: { + importId: string; + stats: ImportStats; +}) { + return prisma.registryImport.update({ + where: { id: importId }, + data: { + numberOfCancellations: stats.cancellations, + numberOfSkipped: stats.skipped, + numberOfEdits: stats.edits, + numberOfErrors: stats.errors, + numberOfInsertions: stats.insertions + } + }); +} + +function getStatus(stats: ImportStats) { + if ( + stats.cancellations + stats.edits + stats.insertions + stats.skipped === + 0 + ) { + // No data was processed. Mark the import as failed + return "FAILED"; + } + + if (stats.errors > 0) { + return "PARTIALLY_SUCCESSFUL"; + } + + return "SUCCESSFUL"; +} diff --git a/libs/back/registry/src/import.ts b/libs/back/registry/src/import.ts new file mode 100644 index 0000000000..be33f03164 --- /dev/null +++ b/libs/back/registry/src/import.ts @@ -0,0 +1,140 @@ +import { format } from "@fast-csv/format"; +import { logger } from "@td/logger"; +import { Readable, Writable } from "node:stream"; +import { SafeParseReturnType } from "zod"; + +import { endImport, startImport, updateImportStats } from "./database"; +import { + CSV_DELIMITER, + importOptions, + ImportType, + ParsedLine, + UNAUTHORIZED_ERROR +} from "./options"; +import { getTransformCsvStream, getTransformXlsxStream } from "./transformers"; + +export async function processStream({ + importId, + importType, + inputStream, + outputErrorStream, + fileType, + createdById, + allowedSirets, + delegateToDelegatorsMap +}: { + importId: string; + importType: ImportType; + inputStream: Readable; + outputErrorStream: Writable; + fileType: "CSV" | "XLSX"; + createdById: string; + allowedSirets: string[]; + delegateToDelegatorsMap: Map; +}) { + logger.info( + `Processing import ${importId}. File type ${fileType}, import ${importType}`, + { importId, importType, inputStream, fileType } + ); + const options = importOptions[importType]; + const stats = { + errors: 0, + insertions: 0, + edits: 0, + cancellations: 0, + skipped: 0 + }; + + const errorStream = format({ + delimiter: CSV_DELIMITER, + headers: ["Erreur", ...Object.values(options.headers)], + writeHeaders: true + }); + errorStream.pipe(outputErrorStream); + + const transformStream = + fileType === "CSV" + ? getTransformCsvStream(options) + : getTransformXlsxStream(options); + + // Timestamp of the last stats update. Used to avoid updating the stats too often. + let lastStatsUpdate = 0; + + try { + await startImport(importId); + + const dataStream: AsyncIterable<{ + rawLine: Record; + result: SafeParseReturnType; + }> = inputStream.pipe(transformStream).on("error", error => { + stats.errors++; + if (errorStream.writable) { + errorStream.write([["errors", error.message]]); + } + }); + + for await (const { rawLine, result } of dataStream) { + if (!result.success) { + stats.errors++; + + const errors = result.error.issues + .map(issue => { + const columnName = options.headers[issue.path[0]] ?? issue.path[0]; + return `${columnName} : ${issue.message}`; + }) + .join("\n"); + + // As we are renaming headers we need to provide an hash array + errorStream.write([["errors", errors], ...Object.entries(rawLine)]); + continue; + } + + // Check rights + if ( + !allowedSirets.includes(result.data.reportForSiret) && + result.data.reportAsSiret && + !delegateToDelegatorsMap + .get(result.data.reportAsSiret) + ?.includes(result.data.reportForSiret) + ) { + stats.errors++; + + errorStream.write([ + ["errors", UNAUTHORIZED_ERROR], + ...Object.entries(rawLine) + ]); + continue; + } + + if (result.data.reason === "MODIFIER") { + stats.edits++; + } else if (result.data.reason === "ANNULER") { + stats.cancellations++; + } else if (result.data.reason === "IGNORER") { + stats.skipped++; + continue; + } else { + stats.insertions++; + } + + const line = { ...result.data, createdById }; + + await options.saveLine({ line, importId }); + + const now = Date.now(); + if (now - lastStatsUpdate > 5 * 1000) { + lastStatsUpdate = now; + updateImportStats({ importId, stats }); + } + } + } catch (err) { + logger.error(`Error processing import ${importId}`, { importId, err }); + } finally { + errorStream.end(); + + const sirets = await options.getImportSiretsAssociations(importId); + await endImport({ importId, stats, sirets }); + } + + return stats; +} diff --git a/libs/back/registry/src/incomingWaste/constants.ts b/libs/back/registry/src/incomingWaste/constants.ts new file mode 100644 index 0000000000..52a84899bc --- /dev/null +++ b/libs/back/registry/src/incomingWaste/constants.ts @@ -0,0 +1,90 @@ +export const INCOMING_WASTE_HEADERS = { + reason: "Motif", + publicId: " Numéro unique", + reportAsSiret: "SIRET du déclarant", + reportForSiret: " SIRET du destinataire", + wasteCode: "Code déchet", + wastePop: "POP", + wasteIsDangerous: "Dangereux", + receptionDate: "Date de réception", + weighingHour: "Heure de pesée", + wasteDescription: "Dénomination du déchet", + wasteCodeBale: "Code déchet Bâle", + weightValue: "Poids en tonnes", + weightIsEstimate: "Type de poids", + volume: "Volume en M3", + producerType: "Type de producteur", + producerOrgId: "Numéro d'identification du producteur", + producerName: "Raison sociale du producteur", + producerAddress: "Adresse du producteur", + producerPostalCode: "Code postal du producteur", + producerCity: "Commune du producteur", + producerCountryCode: "Pays du producteur", + municipalitiesInseeCodes: "Code(s) INSEE de(s) commune(s)", + municipalitiesNames: "Commune(s)", + senderType: "Type d'expéditeur", + senderOrgId: "Numéro d'identification de l'expéditeur", + senderName: "Raison sociale de l'expéditeur", + senderTakeOverFullAddress: "Adresse de prise en charge de l'expéditeur", + senderAddress: "Adresse de l'expéditeur", + senderPostalCode: "Code postal de l'expéditeur", + senderCity: "Commune de l'expéditeur", + senderCountryCode: "Pays de l'expéditeur", + brokerSiret: "SIRET du courtier", + brokerName: "Raison sociale du courtier", + brokerReceiptNumber: "Numéro de récépissé du courtier", + traderSiret: "SIRET du négociant", + traderName: "Raison sociale du négociant", + traderReceiptNumber: "Numéro de récépissé du négociant", + ecoOrganismeSiret: "SIRET de l'éco-organisme", + ecoOrganismeName: "Raison sociale de l'éco-organisme", + operationCode: "Code d'opération réalisé", + documentNumber: "Numéro de document", + notificationNumber: "Numéro de notification", + notificationDocumentInputNumber: "Numéro de saisie du document", + transporter1TransportMode: "Mode de transport du transporteur n°1", + transporter1Type: "Type de transporteur n°1", + transporter1OrgId: "Numéro d'identification du transporteur n°1", + transporter1ReceiptNumber: "Numéro de récépissé du transporteur n°1", + transporter1Name: "Raison sociale du transporteur n°1", + transporter1Address: "Adresse du transporteur n°1", + transporter1PostalCode: "Code postal du transporteur n°1", + transporter1City: "Commune du transporteur n°1", + transporter1CountryCode: "Pays du transporteur n°1", + transporter2TransportMode: "Mode de transport du transporteur n°2", + transporter2Type: "Type de transporteur n°2", + transporter2OrgId: "Numéro d'identification du transporteur n°2", + transporter2ReceiptNumber: "Numéro de récépissé du transporteur n°2", + transporter2Name: "Raison sociale du transporteur n°2", + transporter2Address: "Adresse du transporteur n°2", + transporter2PostalCode: "Code postal du transporteur n°2", + transporter2City: "Commune du transporteur n°2", + transporter2CountryCode: "Pays du transporteur n°2", + transporter3TransportMode: "Mode de transport du transporteur n°3", + transporter3Type: "Type de transporteur n°3", + transporter3OrgId: "Numéro d'identification du transporteur n°3", + transporter3ReceiptNumber: "Numéro de récépissé du transporteur n°3", + transporter3Name: "Raison sociale du transporteur n°3", + transporter3Address: "Adresse du transporteur n°3", + transporter3PostalCode: "Code postal du transporteur n°3", + transporter3City: "Commune du transporteur n°3", + transporter3CountryCode: "Pays du transporteur n°3", + transporter4TransportMode: "Mode de transport du transporteur n°4", + transporter4Type: "Type de transporteur n°4", + transporter4OrgId: "Numéro d'identification du transporteur n°4", + transporter4ReceiptNumber: "Numéro de récépissé du transporteur n°4", + transporter4Name: "Raison sociale du transporteur n°4", + transporter4Address: "Adresse du transporteur n°4", + transporter4PostalCode: "Code postal du transporteur n°4", + transporter4City: "Commune du transporteur n°4", + transporter4CountryCode: "Pays du transporteur n°4", + transporter5TransportMode: "Mode de transport du transporteur n°5", + transporter5Type: "Type de transporteur n°5", + transporter5OrgId: "Numéro d'identification du transporteur n°5", + transporter5ReceiptNumber: "Numéro de récépissé du transporteur n°5", + transporter5Name: "Raison sociale du transporteur n°5", + transporter5Address: "Adresse du transporteur n°5", + transporter5PostalCode: "Code postal du transporteur n°5", + transporter5City: "Commune du transporteur n°5", + transporter5CountryCode: "Pays du transporteur n°5" +}; diff --git a/libs/back/registry/src/incomingWaste/database.ts b/libs/back/registry/src/incomingWaste/database.ts new file mode 100644 index 0000000000..667d1198c4 --- /dev/null +++ b/libs/back/registry/src/incomingWaste/database.ts @@ -0,0 +1,64 @@ +import { prisma } from "@td/prisma"; +import { ParsedZodIncomingWasteItem } from "./validation/schema"; + +export async function saveIncomingWasteLine({ + line, + importId +}: { + line: ParsedZodIncomingWasteItem & { createdById: string }; + importId: string | null; +}) { + const { reason, ...persistedData } = line; + switch (line.reason) { + case "MODIFIER": + await prisma.$transaction(async tx => { + await tx.registryIncomingWaste.updateMany({ + where: { publicId: line.publicId }, + data: { isActive: false } + }); + await tx.registryIncomingWaste.create({ + data: { ...persistedData, importId } + }); + }); + return; + case "ANNULER": + await prisma.registryIncomingWaste.updateMany({ + where: { publicId: line.publicId }, + data: { isCancelled: true } + }); + return; + case "IGNORER": + return; + default: + await prisma.registryIncomingWaste.create({ + data: { ...persistedData, importId } + }); + return; + } +} + +export async function getIncomingWasteImportSiretsAssociations( + importId: string +) { + const importSirets = await prisma.registryIncomingWaste.findMany({ + distinct: ["reportForSiret"], + where: { importId }, + select: { reportForSiret: true, reportAsSiret: true } + }); + + const siretsMap = importSirets.reduce( + (list, { reportForSiret, reportAsSiret }) => { + const as = reportAsSiret ?? reportForSiret; + const key = `${reportForSiret}-${as}`; + + if (!list.has(key)) { + list.set(key, { for: reportForSiret, as }); + } + + return list; + }, + new Map() + ); + + return [...siretsMap.values()]; +} diff --git a/libs/back/registry/src/incomingWaste/validation/index.ts b/libs/back/registry/src/incomingWaste/validation/index.ts new file mode 100644 index 0000000000..e4833ef7a1 --- /dev/null +++ b/libs/back/registry/src/incomingWaste/validation/index.ts @@ -0,0 +1,37 @@ +import { transformReportForInfos } from "../../shared/transform"; +import { registryErrorMap } from "../../zodErrors"; +import { + producerRefinement, + refineIsDangerous, + refineMunicipalities, + refineNotificationNumber, + refineWeighingHour, + refineWeightAndVolume, + senderRefinement, + transporter1Refinement, + transporter2Refinement, + transporter3Refinement, + transporter4Refinement, + transporter5Refinement +} from "./refinement"; +import { incomingWasteSchema } from "./schema"; +import { transformAndRefineReason } from "./transform"; + +export function safeParseAsyncIncomingWaste(line: unknown) { + return incomingWasteSchema + .superRefine(refineIsDangerous) + .superRefine(refineWeighingHour) + .superRefine(refineWeightAndVolume) + .superRefine(refineMunicipalities) + .superRefine(refineNotificationNumber) + .superRefine(producerRefinement) + .superRefine(senderRefinement) + .superRefine(transporter1Refinement) + .superRefine(transporter2Refinement) + .superRefine(transporter3Refinement) + .superRefine(transporter4Refinement) + .superRefine(transporter5Refinement) + .transform(transformAndRefineReason) + .transform(transformReportForInfos) + .safeParseAsync(line, { errorMap: registryErrorMap }); +} diff --git a/libs/back/registry/src/incomingWaste/validation/refinement.ts b/libs/back/registry/src/incomingWaste/validation/refinement.ts new file mode 100644 index 0000000000..14a1177691 --- /dev/null +++ b/libs/back/registry/src/incomingWaste/validation/refinement.ts @@ -0,0 +1,174 @@ +import { Refinement, z } from "zod"; +import { ParsedZodIncomingWasteItem } from "./schema"; +import { getCachedCompany } from "../../shared/helpers"; +import { $Enums } from "@prisma/client"; +import { refineActorOrgId } from "../../shared/refinement"; + +export const refineIsDangerous: Refinement = ( + incomingWasteItem, + { addIssue } +) => { + // No check if the value is not set + if (incomingWasteItem.wasteIsDangerous == null) { + return; + } + + if ( + (incomingWasteItem.wastePop || incomingWasteItem.wasteCode.includes("*")) && + !incomingWasteItem.wasteIsDangerous + ) { + addIssue({ + code: z.ZodIssueCode.custom, + message: `Le déchet contient des POP ou a un code déchet avec étoile, il ne peut pas être indiqué comme non dangereux`, + path: ["wasteIsDangerous"] + }); + } +}; + +export const refineWeighingHour: Refinement< + ParsedZodIncomingWasteItem +> = async (incomingWasteItem, { addIssue }) => { + const company = await getCachedCompany(incomingWasteItem.reportForSiret); + + const isIncineration = company?.wasteProcessorTypes.some( + type => + type === $Enums.WasteProcessorType.DANGEROUS_WASTES_INCINERATION || + type === $Enums.WasteProcessorType.NON_DANGEROUS_WASTES_INCINERATION + ); + + const isWastesStorage = company?.wasteProcessorTypes.some( + type => + type === $Enums.WasteProcessorType.DANGEROUS_WASTES_STORAGE || + type === $Enums.WasteProcessorType.NON_DANGEROUS_WASTES_STORAGE + ); + + const isMandatory = + (isIncineration && + ["R 1", "D 10"].includes(incomingWasteItem.operationCode)) || + (isWastesStorage && incomingWasteItem.operationCode === "D 5"); + + if (isMandatory && !incomingWasteItem.weighingHour) { + addIssue({ + code: z.ZodIssueCode.custom, + message: `L'heure de pesée est obligatoire`, + path: ["weighingHour"] + }); + } +}; + +export const refineWeightAndVolume: Refinement = ( + incomingWasteItem, + { addIssue } +) => { + const isUsingRoad = [ + incomingWasteItem.transporter1TransportMode, + incomingWasteItem.transporter2TransportMode, + incomingWasteItem.transporter3TransportMode, + incomingWasteItem.transporter4TransportMode, + incomingWasteItem.transporter5TransportMode + ].some(transportMode => transportMode === "ROUTE"); + + if (isUsingRoad && incomingWasteItem.weightValue > 40) { + addIssue({ + code: z.ZodIssueCode.custom, + message: `Le poids ne peut pas dépasser 40 tonnes lorsque le déchet est transporté par la route`, + path: ["weightValue"] + }); + } + + if ( + isUsingRoad && + incomingWasteItem.volume && + incomingWasteItem.volume > 40 + ) { + addIssue({ + code: z.ZodIssueCode.custom, + message: `Le volume ne peut pas dépasser 40 M3 lorsque le déchet est transporté par la route`, + path: ["volume"] + }); + } + + if ( + incomingWasteItem.weightIsEstimate && + ["R 1", "D 10", "D 5"].includes(incomingWasteItem.operationCode) + ) { + addIssue({ + code: z.ZodIssueCode.custom, + message: `Pour les codes opération R 1, D 10 et D 5, le poids ne peut pas être estimé`, + path: ["weightIsEstimate"] + }); + } +}; + +export const refineMunicipalities: Refinement = ( + incomingWasteItem, + { addIssue } +) => { + if ( + incomingWasteItem.municipalitiesInseeCodes?.length !== + incomingWasteItem.municipalitiesNames?.length + ) { + addIssue({ + code: z.ZodIssueCode.custom, + message: `Le nombre de codes INSEE et de noms de communes doit être identique`, + path: ["municipalitiesNames"] + }); + } +}; + +export const refineNotificationNumber: Refinement< + ParsedZodIncomingWasteItem +> = (incomingWasteItem, { addIssue }) => { + const isDangerous = + incomingWasteItem.wasteIsDangerous || + incomingWasteItem.wastePop || + incomingWasteItem.wasteCode.includes("*"); + + if (!incomingWasteItem.notificationNumber && isDangerous) { + addIssue({ + code: z.ZodIssueCode.custom, + message: `Le uméro de notification est obligatoire lorsque le déchet est dangereux`, + path: ["notificationNumber"] + }); + } +}; + +export const producerRefinement = refineActorOrgId({ + typeKey: "producerType", + orgIdKey: "producerOrgId" +}); + +export const senderRefinement = refineActorOrgId({ + typeKey: "senderType", + orgIdKey: "senderOrgId" +}); + +export const transporter1Refinement = + refineActorOrgId({ + typeKey: "transporter1Type", + orgIdKey: "transporter1OrgId" + }); + +export const transporter2Refinement = + refineActorOrgId({ + typeKey: "transporter2Type", + orgIdKey: "transporter2OrgId" + }); + +export const transporter3Refinement = + refineActorOrgId({ + typeKey: "transporter3Type", + orgIdKey: "transporter3OrgId" + }); + +export const transporter4Refinement = + refineActorOrgId({ + typeKey: "transporter4Type", + orgIdKey: "transporter4OrgId" + }); + +export const transporter5Refinement = + refineActorOrgId({ + typeKey: "transporter5Type", + orgIdKey: "transporter5OrgId" + }); diff --git a/libs/back/registry/src/incomingWaste/validation/schema.ts b/libs/back/registry/src/incomingWaste/validation/schema.ts new file mode 100644 index 0000000000..6aec2c583a --- /dev/null +++ b/libs/back/registry/src/incomingWaste/validation/schema.ts @@ -0,0 +1,231 @@ +import { isSiret } from "@td/constants"; +import { z } from "zod"; +import { + reasonSchema, + publicIdSchema, + reportAsSiretSchema, + wasteCodeSchema, + wasteCodeBaleSchema, + wasteDescriptionSchema, + volumeSchema, + weightIsEstimateSchema, + weightValueSchema, + getActorTypeSchema, + getActorOrgIdSchema, + getActorAddressSchema, + getActorCitySchema, + getActorCountryCodeSchema, + getActorNameSchema, + getActorPostalCodeSchema, + transportModeSchema, + transportReceiptNumberSchema, + operationCodeSchema, + getActorSiretSchema +} from "../../shared/schemas"; +import { sub } from "date-fns"; + +export type ParsedZodIncomingWasteItem = z.output; + +const inputIncomingWasteSchema = z.object({ + reason: reasonSchema, + publicId: publicIdSchema, + reportAsSiret: reportAsSiretSchema, + reportForSiret: z.coerce + .string({ + invalid_type_error: + "Le SIRET du destinataire doit être une chaîne de caractères" + }) + .min(14, "Le SIRET du destinataire ne doit pas faire moins de 14 chiffres") + .max(14, "Le SIRET du destinataire ne doit pas faire plus de 14 chiffres") + .refine(value => { + return isSiret(value); + }, "Le SIRET du destinataire n'est pas un SIRET valide"), + wasteCode: wasteCodeSchema, + wastePop: z.union( + [ + z + .enum(["OUI", "NON"], { + required_error: "Le champ POP est requis", + invalid_type_error: + "Le champ POP n'est pas valide. Valeurs possibles: OUI, NON" + }) + .transform(val => val === "OUI"), + z.boolean() + ], + { invalid_type_error: "Le champ POP saisi n'est pas valide" } + ), + wasteIsDangerous: z.union( + [ + z + .enum(["OUI", "NON"], { + required_error: "Le champ Dangereux est requis", + invalid_type_error: + "Le champ Dangereux n'est pas valide. Valeurs possibles: OUI, NON" + }) + .transform(val => val === "OUI") + .optional(), + z.boolean().optional() + ], + { invalid_type_error: "Le champ Dangereux saisi n'est pas valide" } + ), + wasteDescription: wasteDescriptionSchema, + wasteCodeBale: wasteCodeBaleSchema, + receptionDate: z.coerce + .date() + .min( + sub(new Date(), { years: 1 }), + "La date réception ne peut pas être antérieure à J-1an" + ) + .max(new Date(), "La date réception ne peut pas être dans le futur"), + weighingHour: z + .string() + .refine(val => { + if (!val) { + return true; + } + // 00:00 or 00:00:00 or 00:00:00.000 + return /^\d{2}:\d{2}(?::\d{2}(?:\.\d{3})?)?$/.test(val); + }, `L'heure de pesée n'est pas valide. Format attendu: 00:00, 00:00:00 ou 00:00:00.000`) + .optional(), + weightValue: weightValueSchema, + weightIsEstimate: weightIsEstimateSchema, + volume: volumeSchema, + producerType: getActorTypeSchema("de producteur"), + producerOrgId: getActorOrgIdSchema("du producteur"), + producerName: getActorNameSchema("du producteur"), + producerAddress: getActorAddressSchema("du producteur"), + producerPostalCode: getActorCitySchema("du producteur"), + producerCity: getActorPostalCodeSchema("du producteur"), + producerCountryCode: getActorCountryCodeSchema("du producteur"), + municipalitiesInseeCodes: z + .string() + .transform(val => + val + ? String(val) + .split(",") + .map(val => val.trim()) + : [] + ) + .pipe(z.array(z.string())), + municipalitiesNames: z + .string() + .transform(val => + val + ? String(val) + .split(",") + .map(val => val.trim()) + : [] + ) + .pipe( + z.array( + z + .string() + .min( + 1, + "Le libellé de la commune de collecte de déchet doit faire plus de 1 caractère" + ) + .max( + 300, + "Le libellé de la commune de collecte de déchet doit faire moins de 300 caractères" + ) + ) + ), + senderType: getActorTypeSchema("d'expéditeur"), + senderOrgId: getActorOrgIdSchema("d'expéditeur"), + senderName: getActorNameSchema("d'expéditeur'"), + senderTakeOverFullAddress: z + .string() + .min( + 1, + "L'adresse de prise en charge de l'expéditeur doit faire plus de 1 caractère" + ) + .max( + 150, + "L'adresse de prise en charge de l'expéditeur doit faire moins de 150 caractères" + ) + .optional(), + senderAddress: getActorAddressSchema("d'expéditeur'"), + senderPostalCode: getActorCitySchema("d'expéditeur'"), + senderCity: getActorPostalCodeSchema("d'expéditeur'"), + senderCountryCode: getActorCountryCodeSchema("d'expéditeur'"), + brokerSiret: getActorSiretSchema("du courtier").optional(), + brokerName: getActorNameSchema("du courtier").optional(), + brokerReceiptNumber: z + .string() + .max( + 150, + "Le numéro de récépissé du courtier ne doit pas excéder 150 caractères" + ) + .optional(), + traderSiret: getActorSiretSchema("du négociant").optional(), + traderName: getActorNameSchema("du négociant").optional(), + traderReceiptNumber: z + .string() + .max( + 150, + "Le numéro de récépissé du négociant ne doit pas excéder 150 caractères" + ) + .optional(), + ecoOrganismeSiret: getActorSiretSchema("de l'éco-organisme").optional(), + ecoOrganismeName: getActorNameSchema("de l'éco-organisme").optional(), + operationCode: operationCodeSchema, + documentNumber: z.string().optional(), // TODO 12 caractères & rule + notificationNumber: z.string().optional(), // TODO 12 caractères & rule + notificationDocumentInputNumber: z.string().optional(), // TODO rule + transporter1TransportMode: transportModeSchema, + transporter1Type: getActorTypeSchema("de transporteur 1"), + transporter1OrgId: getActorOrgIdSchema("du transporteur 1"), + transporter1ReceiptNumber: transportReceiptNumberSchema, + transporter1Name: getActorNameSchema("du transporteur 1"), + transporter1Address: getActorAddressSchema("du transporteur 1"), + transporter1PostalCode: getActorCitySchema("du transporteur 1"), + transporter1City: getActorPostalCodeSchema("du transporteur 1"), + transporter1CountryCode: getActorCountryCodeSchema("du transporteur 1"), + transporter2TransportMode: transportModeSchema.optional(), + transporter2Type: getActorTypeSchema("de transporteur 2"), + transporter2OrgId: getActorOrgIdSchema("du transporteur 2"), + transporter2ReceiptNumber: transportReceiptNumberSchema, + transporter2Name: getActorNameSchema("du transporteur 2"), + transporter2Address: getActorAddressSchema("du transporteur 2"), + transporter2PostalCode: getActorCitySchema("du transporteur 2"), + transporter2City: getActorPostalCodeSchema("du transporteur 2"), + transporter2CountryCode: getActorCountryCodeSchema("du transporteur 2"), + transporter3TransportMode: transportModeSchema.optional(), + transporter3Type: getActorTypeSchema("de transporteur 3"), + transporter3OrgId: getActorOrgIdSchema("du transporteur 3"), + transporter3ReceiptNumber: transportReceiptNumberSchema, + transporter3Name: getActorNameSchema("du transporteur 3"), + transporter3Address: getActorAddressSchema("du transporteur 3"), + transporter3PostalCode: getActorCitySchema("du transporteur 3"), + transporter3City: getActorPostalCodeSchema("du transporteur 3"), + transporter3CountryCode: getActorCountryCodeSchema("du transporteur 3"), + transporter4TransportMode: transportModeSchema.optional(), + transporter4Type: getActorTypeSchema("de transporteur 4"), + transporter4OrgId: getActorOrgIdSchema("du transporteur 4"), + transporter4ReceiptNumber: transportReceiptNumberSchema, + transporter4Name: getActorNameSchema("du transporteur 4"), + transporter4Address: getActorAddressSchema("du transporteur 4"), + transporter4PostalCode: getActorCitySchema("du transporteur 4"), + transporter4City: getActorPostalCodeSchema("du transporteur 4"), + transporter4CountryCode: getActorCountryCodeSchema("du transporteur 4"), + transporter5TransportMode: transportModeSchema.optional(), + transporter5Type: getActorTypeSchema("de transporteur 5"), + transporter5OrgId: getActorOrgIdSchema("du transporteur 5"), + transporter5ReceiptNumber: transportReceiptNumberSchema, + transporter5Name: getActorNameSchema("du transporteur 5"), + transporter5Address: getActorAddressSchema("du transporteur 5"), + transporter5PostalCode: getActorCitySchema("du transporteur 5"), + transporter5City: getActorPostalCodeSchema("du transporteur 5"), + transporter5CountryCode: getActorCountryCodeSchema("du transporteur 5") +}); + +// Props added through transform +const transformedSsdSchema = z.object({ + reportForAddress: z.string().default(""), + reportForCity: z.string().default(""), + reportForPostalCode: z.string().default(""), + reportForName: z.coerce.string().default("") +}); + +export const incomingWasteSchema = + inputIncomingWasteSchema.merge(transformedSsdSchema); diff --git a/libs/back/registry/src/incomingWaste/validation/transform.ts b/libs/back/registry/src/incomingWaste/validation/transform.ts new file mode 100644 index 0000000000..19ef0d1f3e --- /dev/null +++ b/libs/back/registry/src/incomingWaste/validation/transform.ts @@ -0,0 +1,33 @@ +import { RefinementCtx, z } from "zod"; +import { ParsedZodIncomingWasteItem } from "./schema"; +import { prisma } from "@td/prisma"; + +export async function transformAndRefineReason( + incomingWasteItem: ParsedZodIncomingWasteItem, + { addIssue }: RefinementCtx +) { + const incomingWasteItemInDb = await prisma.registryIncomingWaste.findFirst({ + where: { + publicId: incomingWasteItem.publicId, + reportForSiret: incomingWasteItem.reportForSiret, + isActive: true + } + }); + + // If the line alreary exists in DB and we dont have a reason, we can simply ignore it + if (incomingWasteItemInDb && !incomingWasteItem.reason) { + incomingWasteItem.reason = "IGNORER"; + return incomingWasteItem; + } + + if (!incomingWasteItemInDb && incomingWasteItem.reason) { + addIssue({ + code: z.ZodIssueCode.custom, + message: `La raison doit rester vide, le numéro unique "${incomingWasteItem.publicId}" n'a jamais été importé.`, + path: ["reason"] + }); + return z.NEVER; + } + + return incomingWasteItem; +} diff --git a/libs/back/registry/src/index.ts b/libs/back/registry/src/index.ts new file mode 100644 index 0000000000..47ae8777c0 --- /dev/null +++ b/libs/back/registry/src/index.ts @@ -0,0 +1,5 @@ +export * from "./import"; +export { ImportType, IMPORT_TYPES, importOptions } from "./options"; +export * from "./s3"; + +export { SSD_HEADERS } from "./ssd/constants"; diff --git a/libs/back/registry/src/options.ts b/libs/back/registry/src/options.ts new file mode 100644 index 0000000000..5fe70a9cff --- /dev/null +++ b/libs/back/registry/src/options.ts @@ -0,0 +1,56 @@ +import { SafeParseReturnType } from "zod"; +import { SSD_HEADERS } from "./ssd/constants"; +import { safeParseAsyncSsd } from "./ssd/validation"; +import { getSsdImportSiretsAssociations, saveSsdLine } from "./ssd/database"; +import { INCOMING_WASTE_HEADERS } from "./incomingWaste/constants"; +import { + saveIncomingWasteLine, + getIncomingWasteImportSiretsAssociations +} from "./incomingWaste/database"; +import { safeParseAsyncIncomingWaste } from "./incomingWaste/validation"; + +export type ParsedLine = { + reason?: "MODIFIER" | "ANNULER" | "IGNORER"; + publicId: string; + reportForSiret: string; + reportAsSiret?: string; +}; + +export type ImportOptions = { + headers: Record; + safeParseAsync: ( + line: unknown + ) => Promise>; + saveLine: ({ + line, + importId + }: { + line: ParsedLine; + importId: string | null; + }) => Promise; + getImportSiretsAssociations: ( + importId: string + ) => Promise<{ for: string; as: string }[]>; +}; + +export const IMPORT_TYPES = ["SSD", "INCOMING_WASTE"] as const; +export type ImportType = (typeof IMPORT_TYPES)[number]; + +export const importOptions: Record = { + SSD: { + headers: SSD_HEADERS, + safeParseAsync: safeParseAsyncSsd, + saveLine: saveSsdLine, + getImportSiretsAssociations: getSsdImportSiretsAssociations + }, + INCOMING_WASTE: { + headers: INCOMING_WASTE_HEADERS, + safeParseAsync: safeParseAsyncIncomingWaste, + saveLine: saveIncomingWasteLine, + getImportSiretsAssociations: getIncomingWasteImportSiretsAssociations + } +}; + +export const CSV_DELIMITER = ";"; +export const UNAUTHORIZED_ERROR = + "Vous n'avez pas le droit de faire une déclaration pour ce SIRET"; diff --git a/libs/back/registry/src/s3.ts b/libs/back/registry/src/s3.ts new file mode 100644 index 0000000000..8dcfae46d0 --- /dev/null +++ b/libs/back/registry/src/s3.ts @@ -0,0 +1,137 @@ +import { + GetObjectCommand, + HeadObjectCommand, + NotFound, + PutObjectCommand, + PutObjectTaggingCommand, + S3Client +} from "@aws-sdk/client-s3"; +import { Upload } from "@aws-sdk/lib-storage"; +import { getSignedUrl } from "@aws-sdk/s3-request-presigner"; +import { PassThrough, Readable } from "node:stream"; +import { envConfig } from "./config"; + +export const registryS3Client = new S3Client({ + endpoint: envConfig.S3_ENDPOINT, + region: envConfig.S3_REGION, + forcePathStyle: true, + credentials: { + accessKeyId: envConfig.S3_ACCESS_KEY_ID, + secretAccessKey: envConfig.S3_SECRET_ACCESS_KEY + } +}); + +const SIGNED_URL_EXPIRES_IN = 60 * 10; // 10 minutes + +export function getUploadWithWritableStream( + bucketName: string, + key: string, + contentType?: string +): { + s3Stream: PassThrough; + upload: Upload; +} { + const s3Stream = new PassThrough(); + + const upload = new Upload({ + client: registryS3Client, + params: { + Bucket: bucketName, + Key: key, + Body: s3Stream, + ContentType: contentType + } + }); + + return { s3Stream, upload }; +} + +export async function getFileMetadata(bucketName: string, key: string) { + const headCommand = new HeadObjectCommand({ + Bucket: bucketName, + Key: key + }); + + try { + const metadata = await registryS3Client.send(headCommand); + return metadata; + } catch (err) { + if (err instanceof NotFound) { + return undefined; + } + throw err; + } +} + +export async function getFileAsStream(bucketName: string, key: string) { + const getCommand = new GetObjectCommand({ + Bucket: bucketName, + Key: key + }); + + const { Body } = await registryS3Client.send(getCommand); + return Body as Readable; +} + +export async function getSignedUrlForUpload({ + bucketName, + key, + metadata, + tags +}: { + bucketName: string; + key: string; + metadata?: Record; + tags?: Record; +}) { + const command = new PutObjectCommand({ + Bucket: bucketName, + Key: key, + Metadata: metadata, + Tagging: Object.entries({ ...tags, temp: true }) + .map(([key, value]) => `${key}=${value}`) + .join("&") + }); + + const signedUrl = await getSignedUrl(registryS3Client, command, { + expiresIn: SIGNED_URL_EXPIRES_IN, + unhoistableHeaders: new Set(["x-amz-meta-filename"]) + }); + return signedUrl; +} + +export async function getSignedUrlForDownload({ + bucketName, + key +}: { + bucketName: string; + key: string; + metadata?: Record; + tags?: Record; +}) { + const command = new GetObjectCommand({ + Bucket: bucketName, + Key: key, + ResponseContentDisposition: `attachment; filename="${bucketName}_${key}"` + }); + + const signedUrl = await getSignedUrl(registryS3Client, command, { + expiresIn: SIGNED_URL_EXPIRES_IN + }); + return signedUrl; +} + +export async function setFileAsNotTemporary(bucketName: string, key: string) { + const putObjectTaggingCommand = new PutObjectTaggingCommand({ + Bucket: bucketName, + Key: key, + Tagging: { + TagSet: [ + { Key: "temp", Value: "false" } // Change temp to "false" + ] + } + }); + + const response = await registryS3Client.send(putObjectTaggingCommand); + return response; +} diff --git a/libs/back/registry/src/shared/helpers.ts b/libs/back/registry/src/shared/helpers.ts new file mode 100644 index 0000000000..aada14753c --- /dev/null +++ b/libs/back/registry/src/shared/helpers.ts @@ -0,0 +1,21 @@ +import { prisma } from "@td/prisma"; +import { ttlCache } from "./ttlCache"; +import { Company } from "@prisma/client"; + +export async function getCachedCompany(siret: string) { + const cachedValue = ttlCache.get(siret); + if (cachedValue) { + return cachedValue; + } + + const company = await prisma.company.findUnique({ + where: { orgId: siret } + }); + + if (!company) { + return null; + } + + ttlCache.set(siret, company); + return company; +} diff --git a/libs/back/registry/src/shared/refinement.ts b/libs/back/registry/src/shared/refinement.ts new file mode 100644 index 0000000000..1640ac3a4a --- /dev/null +++ b/libs/back/registry/src/shared/refinement.ts @@ -0,0 +1,73 @@ +import { isSiret } from "@td/constants"; +import { checkVAT, countries } from "jsvat"; +import { Refinement, z } from "zod"; + +export function refineActorOrgId({ + typeKey, + orgIdKey +}: { + typeKey: string; + orgIdKey: string; +}): Refinement { + return (item, { addIssue }) => { + const type: + | "ENTREPRISE_FR" + | "ENTREPRISE_UE" + | "ENTREPRISE_HORS_UE" + | "ASSOCIATION" + | "PERSONNE_PHYSIQUE" + | "COMMUNES" = item[typeKey]; + const orgId: string = item[orgIdKey]; + + switch (type) { + case "ENTREPRISE_FR": { + if (!isSiret(orgId)) { + addIssue({ + code: z.ZodIssueCode.custom, + message: "Le SIRET du destinataire n'est pas un SIRET valide.", + path: [orgIdKey] + }); + } + break; + } + case "ENTREPRISE_UE": { + const { isValid } = checkVAT(orgId, countries); + if (!isValid) { + addIssue({ + code: z.ZodIssueCode.custom, + message: + "Le numéro d'identification du destinataire doit faire entre 3 et 27 caractères pour une entreprise Européenne. Il commence par 2 lettres majuscules et est suivi de chiffres.", + path: [orgIdKey] + }); + } + break; + } + case "ENTREPRISE_HORS_UE": { + const isOrgIdValidOutOfUe = orgId && /[A-Z0-9]{1,25}/.test(orgId); + if (!isOrgIdValidOutOfUe) { + addIssue({ + code: z.ZodIssueCode.custom, + message: + "Le numéro d'identification du destinataire doit faire entre 1 et 25 caractères pour une entreprise hors UE. Il est composé de lettres majuscules et de chiffres.", + path: [orgIdKey] + }); + } + break; + } + case "ASSOCIATION": { + const isOrgIdValidAssociation = orgId && /W[0-9]{9}/.test(orgId); + if (!isOrgIdValidAssociation) { + addIssue({ + code: z.ZodIssueCode.custom, + message: + "Le numéro d'identification du destinataire doit faire 10 caractères pour une assoxiation. Il commence par un W suivi de 9 chiffres.", + path: [orgIdKey] + }); + } + break; + } + default: + throw new Error("Unhandled destination type"); + } + }; +} diff --git a/libs/back/registry/src/shared/schemas.ts b/libs/back/registry/src/shared/schemas.ts new file mode 100644 index 0000000000..c69691a648 --- /dev/null +++ b/libs/back/registry/src/shared/schemas.ts @@ -0,0 +1,216 @@ +import { + BSDD_WASTE_CODES_ENUM, + isSiret, + PROCESSING_OPERATIONS_CODES_ENUM, + WASTE_CODES_BALE +} from "@td/constants"; +import { z } from "zod"; + +export const reasonSchema = z + .enum(["MODIFIER", "EDIT", "ANNULER", "CANCEL", "IGNORER"], { + invalid_type_error: + "Le motif n'est pas une valeur autorisée. Valeurs possibles: MODIFIER, ANNULER" + }) + .transform(val => { + if (val === "EDIT") { + return "MODIFIER"; + } + if (val === "CANCEL") { + return "ANNULER"; + } + + return val; + }) + .optional(); + +export const publicIdSchema = z + .string({ + required_error: "Le numéro unique est requis", + invalid_type_error: "Le numéro unique doit être une chaîne de caractères" + }) + .min(1, "Le numéro unique doit faire au moins 2 caractères") + .max(36, "Le numéro unique ne peut pas dépasser 36 charactères") + .refine(val => /^[a-zA-Z0-9-_./]+$/.test(val), { + message: + "Le numéro unique ne peut contenir que des lettres, des chiffres, des tirets, des underscores et des points" + }); + +export const reportAsSiretSchema = z.coerce + .string({ + invalid_type_error: + "Le SIRET du déclarant doit être une chaîne de caractères" + }) + .min(14, "Le SIRET du déclarant ne doit pas faire moins de 14 chiffres") + .max(14, "Le SIRET du déclarant ne doit pas faire plus de 14 chiffres") + .refine(value => { + return isSiret(value); + }, "Le SIRET du déclarant n'est pas un SIRET valide") + .optional(); + +export const wasteCodeSchema = z.nativeEnum(BSDD_WASTE_CODES_ENUM, { + required_error: "Le code déchet est requis", + invalid_type_error: + "Le code déchet n'a pas une valeur autorisée. Il doit faire partie de la liste officielle des codes déchets. Ex: 17 02 01, 10 01 18*. Attention à bien respecter les espaces." +}); + +export const wasteDescriptionSchema = z + .string() + .min(2, "La dénomination usuelle du déchet doit faire au moins 2 charactères") + .max( + 150, + "La dénomination usuelle du déchet ne peut pas dépasser 150 charactères" + ); + +export const wasteCodeBaleSchema = z.enum(WASTE_CODES_BALE).optional(); + +export const operationCodeSchema = z + .string() + .transform(val => val.replace(/([A-Z])(\d)/, "$1 $2")) // D5 becomes D 5 + .pipe( + z.nativeEnum(PROCESSING_OPERATIONS_CODES_ENUM, { + required_error: "Le code de traitement est requis", + invalid_type_error: + "Le code de traitement n'est pas une valeur autorisée. Valeurs possibles: R1 à R13, D1 à D15" + }) + ); + +export const weightValueSchema = z.coerce + .number({ + required_error: "Le poids est requis", + invalid_type_error: "Le poids doit être un nombre" + }) + .min(0, "Le poids ne peut pas être inférieur à 0") + .max(100_000_000, "Le poids ne peut pas dépasser 100 000 000") + .multipleOf(0.001, "Le poids ne doit pas avoir plus de 3 décimales"); + +export const weightIsEstimateSchema = z.union( + [ + z + .enum(["ESTIME", "REEL"], { + required_error: "Le type de poids est requis", + invalid_type_error: + "Le type de poids n'est pas valide. Valeurs possibles (sans accent): ESTIME, REEL" + }) + .transform(val => val === "ESTIME"), + z.boolean() + ], + { invalid_type_error: "Le type de poids saisi n'est pas valide" } +); + +export const volumeSchema = z.coerce + .number({ + required_error: "La quantité est requise", + invalid_type_error: "La quantité doit être un nombre" + }) + .min(0, "La quantité ne peut pas être inférieure à 0") + .max(100_000_000, "La quantité ne peut pas dépasser 100 000 000") + .multipleOf(0.001, "La quantité ne doit pas avoir plus de 3 décimales") + .optional(); + +export const getActorTypeSchema = (name: string) => + z.enum( + ["ENTREPRISE_FR", "ENTREPRISE_UE", "ENTREPRISE_HORS_UE", "ASSOCIATION"], + { + required_error: `Le type ${name} est requis`, + invalid_type_error: `Le type ${name} n'est pas une valeur autorisée. Valeurs possibles: ENTREPRISE_FR, ENTREPRISE_UE, ENTREPRISE_HORS_UE, ASSOCIATION` + } + ); + +export const getActorOrgIdSchema = (name: string) => + z + .string() + .min(1, `Le numéro d'identification ${name} doit faire plus d'1 charactère`) + .max( + 27, + `Le numéro d'identification ${name} ne peut pas dépasser 27 charactères` + ); + +export const getActorSiretSchema = (name: string) => + z.coerce + .string({ + invalid_type_error: `Le SIRET ${name} doit être une chaîne de caractères` + }) + .min(14, `Le SIRET ${name} ne doit pas faire moins de 14 chiffres`) + .max(14, `Le SIRET ${name} ne doit pas faire plus de 14 chiffres`) + .refine(value => { + return isSiret(value); + }, "Le SIRET du déclarant n'est pas un SIRET valide") + .optional(); + +export const getActorNameSchema = (name: string) => + z + .string() + .min(2, `Le nom ${name} ne peut pas faire moins de 2 charactères`) + .max(150, `Le nom ${name} ne peut pas dépasser 150 charactères`); + +export const getActorAddressSchema = (name: string) => + z + .string() + .min( + 2, + `Le libellé de la commune ${name} ne peut pas faire moins de 2 charactères` + ) + .max( + 150, + `Le libellé de la commune ${name} ne peut pas dépasser 150 charactères` + ); + +export const getActorCitySchema = (name: string) => + z + .string() + .min( + 2, + `Le libellé de la commune ${name} ne peut pas faire moins de 2 charactères` + ) + .max( + 45, + `Le libellé de la commune ${name} ne peut pas dépasser 45 charactères` + ); + +export const getActorPostalCodeSchema = (name: string) => + z.string().refine(val => { + if (!val) return true; + return /^[0-9]{5,6}$/.test(val); + }, `Le code postal ${name} n'est pas valide. Il doit être composé de 5 ou 6 chiffres`); + +export const getActorCountryCodeSchema = (name: string) => + z.string().refine(val => { + if (!val) return true; + return /^[A-Z]{2}$/.test(val); + }, `Le code du pays ${name} n'est pas valide. Il doit être composé de 2 lettres majuscules`); + +export const transportModeSchema = z + .enum(["ROUTE", "AÉRIEN", "FLUVIAL", "MARITIME", "PIPELINE", "FERRÉ"], { + required_error: "Le mode de transport est requis", + invalid_type_error: + "Le mode de transport n'est pas valide. Consultez la documentation pour la liste des valeurs possibles" + }) + .transform(val => { + switch (val) { + case "ROUTE": + return "ROAD"; + case "AÉRIEN": + return "AIR"; + case "FLUVIAL": + return "RIVER"; + case "MARITIME": + return "SEA"; + case "PIPELINE": + return "OTHER"; + case "FERRÉ": + return "RAIL"; + default: + throw Error("Unhandled transport mode"); + } + }); + +export const transportReceiptNumberSchema = z + .string() + .min( + 5, + "Le numéro de récépissé de transport doit faire au moins 5 caractères" + ) + .max( + 50, + "Le numéro de récépissé de transport ne peut pas dépasser 50 caractères" + ); diff --git a/libs/back/registry/src/shared/transform.ts b/libs/back/registry/src/shared/transform.ts new file mode 100644 index 0000000000..514f2148f3 --- /dev/null +++ b/libs/back/registry/src/shared/transform.ts @@ -0,0 +1,27 @@ +import { ParsedLine } from "../options"; +import { RefinementCtx, z } from "zod"; +import { getCachedCompany } from "./helpers"; + +export async function transformReportForInfos( + line: ParsedLine, + { addIssue }: RefinementCtx +) { + const company = await getCachedCompany(line.reportForSiret); + + if (!company) { + addIssue({ + code: z.ZodIssueCode.custom, + message: `Le siret "${line.reportForSiret}" n'est pas inscrit sur Trackdéchets`, + path: ["reportForSiret"] + }); + return z.NEVER; + } + + return { + ...line, + reportForName: company.name, + reportForAddress: company.address, + reportForCity: "", + reportForPostalCode: "" + }; +} diff --git a/libs/back/registry/src/shared/ttlCache.ts b/libs/back/registry/src/shared/ttlCache.ts new file mode 100644 index 0000000000..a25cc94197 --- /dev/null +++ b/libs/back/registry/src/shared/ttlCache.ts @@ -0,0 +1,39 @@ +// Taken from https://www.npmjs.com/package/lru-cache doc +// "If you truly wish to use a cache that is bound only by TTL expiration, consider using a Map object, +// and calling setTimeout to delete entries when they expire. It will perform much better than an LRU cache." +// ------- +// Its used to cache company infos: when we import a file most of the lines (if not all) will share the same reportForSiret. +// So we can cache the company infos for a short time to avoid querying the database for each line. + +const DEFAULT_TTL = 60 * 1000 * 3; // 3 minutes + +export const ttlCache = { + data: new Map(), + timers: new Map(), + set: (key: string, value: unknown, ttl = DEFAULT_TTL) => { + if (ttlCache.timers.has(key)) { + clearTimeout(ttlCache.timers.get(key)); + } + ttlCache.timers.set( + key, + setTimeout(() => ttlCache.delete(key), ttl) + ); + ttlCache.data.set(key, value); + }, + get: (key: string) => ttlCache.data.get(key) as T, + has: (key: string) => ttlCache.data.has(key), + delete: (key: string) => { + if (ttlCache.timers.has(key)) { + clearTimeout(ttlCache.timers.get(key)); + } + ttlCache.timers.delete(key); + return ttlCache.data.delete(key); + }, + clear: () => { + ttlCache.data.clear(); + for (const v of ttlCache.timers.values()) { + clearTimeout(v); + } + ttlCache.timers.clear(); + } +}; diff --git a/libs/back/registry/src/ssd/constants.ts b/libs/back/registry/src/ssd/constants.ts new file mode 100644 index 0000000000..3842e3ab12 --- /dev/null +++ b/libs/back/registry/src/ssd/constants.ts @@ -0,0 +1,29 @@ +export const SSD_HEADERS = { + reason: "Motif", + publicId: "Numéro unique", + reportAsSiret: "SIRET du déclarant", + reportForSiret: "SIRET de l'émetteur", + useDate: "Date d'utilisation", + dispatchDate: "Date d'expédition", + wasteCode: "Code déchet", + wasteDescription: "Dénomination du déchet", + wasteCodeBale: "Code déchet Bâle", + secondaryWasteCodes: "Codes déchets secondaires", + secondaryWasteDescriptions: "Dénominations des déchets secondaires", + product: "Produit", + weightValue: "Poids en tonne", + weightIsEstimate: "Type de poids", + volume: "Volume en M3", + processingDate: "Date de traitement", + processingEndDate: "Date de fin de traitement", + destinationType: "Type de destinataire", + destinationOrgId: "Numéro d'identification du destinataire", + destinationName: "Raison sociale du destinataire", + destinationAddress: "Adresse du destinataire", + destinationCity: "Commune du destinataire", + destinationPostalCode: "Code postal du destinataire", + destinationCountryCode: "Code pays du destinataire", + operationCode: "Code d'opération", + operationMode: "Mode de traitement", + administrativeActReference: "Référence de l'acte administratif" +}; diff --git a/libs/back/registry/src/ssd/database.ts b/libs/back/registry/src/ssd/database.ts new file mode 100644 index 0000000000..add1dab7fa --- /dev/null +++ b/libs/back/registry/src/ssd/database.ts @@ -0,0 +1,58 @@ +import { prisma } from "@td/prisma"; +import { ParsedZodSsdItem } from "./validation/schema"; + +export async function saveSsdLine({ + line, + importId +}: { + line: ParsedZodSsdItem & { createdById: string }; + importId: string | null; +}) { + const { reason, ...persistedData } = line; + switch (line.reason) { + case "MODIFIER": + await prisma.$transaction(async tx => { + await tx.registrySsd.updateMany({ + where: { publicId: line.publicId }, + data: { isActive: false } + }); + await tx.registrySsd.create({ data: { ...persistedData, importId } }); + }); + return; + case "ANNULER": + await prisma.registrySsd.updateMany({ + where: { publicId: line.publicId }, + data: { isCancelled: true } + }); + return; + case "IGNORER": + return; + default: + await prisma.registrySsd.create({ data: { ...persistedData, importId } }); + return; + } +} + +export async function getSsdImportSiretsAssociations(importId: string) { + const importSirets = await prisma.registrySsd.findMany({ + distinct: ["reportForSiret"], + where: { importId }, + select: { reportForSiret: true, reportAsSiret: true } + }); + + const siretsMap = importSirets.reduce( + (list, { reportForSiret, reportAsSiret }) => { + const as = reportAsSiret ?? reportForSiret; + const key = `${reportForSiret}-${as}`; + + if (!list.has(key)) { + list.set(key, { for: reportForSiret, as }); + } + + return list; + }, + new Map() + ); + + return [...siretsMap.values()]; +} diff --git a/libs/back/registry/src/ssd/validation/index.ts b/libs/back/registry/src/ssd/validation/index.ts new file mode 100644 index 0000000000..08ebc96661 --- /dev/null +++ b/libs/back/registry/src/ssd/validation/index.ts @@ -0,0 +1,19 @@ +import { transformReportForInfos } from "../../shared/transform"; +import { registryErrorMap } from "../../zodErrors"; +import { + refineDates, + refineDestinationOrgId, + refineSecondaryWasteCodes +} from "./refinement"; +import { ssdSchema } from "./schema"; +import { transformAndRefineReason } from "./transform"; + +export function safeParseAsyncSsd(line: unknown) { + return ssdSchema + .superRefine(refineDates) + .superRefine(refineDestinationOrgId) + .superRefine(refineSecondaryWasteCodes) + .transform(transformAndRefineReason) + .transform(transformReportForInfos) + .safeParseAsync(line, { errorMap: registryErrorMap }); +} diff --git a/libs/back/registry/src/ssd/validation/refinement.ts b/libs/back/registry/src/ssd/validation/refinement.ts new file mode 100644 index 0000000000..6c26d9de76 --- /dev/null +++ b/libs/back/registry/src/ssd/validation/refinement.ts @@ -0,0 +1,151 @@ +import { isSiret, countries } from "@td/constants"; +import { checkVAT } from "jsvat"; +import { Refinement, z } from "zod"; + +import { ParsedZodSsdItem } from "./schema"; + +export const refineDates: Refinement = ( + ssdItem, + { addIssue } +) => { + if (ssdItem.useDate && ssdItem.dispatchDate) { + addIssue({ + code: z.ZodIssueCode.custom, + message: + "Impossible de saisir à la fois une date d'utilisation et une date d'expédition.", + path: ["useDate"] + }); + } + + if (ssdItem.useDate && ssdItem.useDate < ssdItem.processingDate) { + addIssue({ + code: z.ZodIssueCode.custom, + message: + "La date d'utilisation ne peut pas être antérieure à la date de traitement.", + path: ["useDate"] + }); + } + + if (ssdItem.dispatchDate && ssdItem.dispatchDate < ssdItem.processingDate) { + addIssue({ + code: z.ZodIssueCode.custom, + message: + "La date d'expédition ne peut pas être antérieure à la date de traitement.", + path: ["dispatchDate"] + }); + } + + if ( + ssdItem.processingEndDate && + ssdItem.processingEndDate < ssdItem.processingDate + ) { + addIssue({ + code: z.ZodIssueCode.custom, + message: + "La date de fin de traitement ne peut pas être antérieure à la date de traitement.", + path: ["processingEndDate"] + }); + } + + if ( + ssdItem.processingEndDate && + ssdItem.useDate && + ssdItem.useDate < ssdItem.processingDate + ) { + addIssue({ + code: z.ZodIssueCode.custom, + message: + "La date de fin de traitement ne peut pas être postérieure à la date d'utilisation.", + path: ["processingEndDate"] + }); + } + + if ( + ssdItem.processingEndDate && + ssdItem.dispatchDate && + ssdItem.dispatchDate < ssdItem.processingDate + ) { + addIssue({ + code: z.ZodIssueCode.custom, + message: + "La date de fin de traitement ne peut pas être postérieure à la date d'expédition.", + path: ["processingEndDate"] + }); + } +}; + +export const refineDestinationOrgId: Refinement = ( + ssdItem, + { addIssue } +) => { + switch (ssdItem.destinationType) { + case "ENTREPRISE_FR": { + if (!isSiret(ssdItem.destinationOrgId)) { + addIssue({ + code: z.ZodIssueCode.custom, + message: "Le SIRET du destinataire n'est pas un SIRET valide.", + path: ["destinationOrgId"] + }); + } + break; + } + case "ENTREPRISE_UE": { + const { isValid } = checkVAT(ssdItem.destinationOrgId, countries); + if (!isValid) { + addIssue({ + code: z.ZodIssueCode.custom, + message: + "Le numéro d'identification du destinataire doit faire entre 3 et 27 caractères pour une entreprise Européenne. Il commence par 2 lettres majuscules et est suivi de chiffres.", + path: ["destinationOrgId"] + }); + } + break; + } + case "ENTREPRISE_HORS_UE": { + const isOrgIdValidOutOfUe = + ssdItem.destinationOrgId && + /[A-Z0-9]{1,25}/.test(ssdItem.destinationOrgId); + if (!isOrgIdValidOutOfUe) { + addIssue({ + code: z.ZodIssueCode.custom, + message: + "Le numéro d'identification du destinataire doit faire entre 1 et 25 caractères pour une entreprise hors UE. Il est composé de lettres majuscules et de chiffres.", + path: ["destinationOrgId"] + }); + } + break; + } + case "ASSOCIATION": { + const isOrgIdValidAssociation = + ssdItem.destinationOrgId && /W[0-9]{9}/.test(ssdItem.destinationOrgId); + if (!isOrgIdValidAssociation) { + addIssue({ + code: z.ZodIssueCode.custom, + message: + "Le numéro d'identification du destinataire doit faire 10 caractères pour une assoxiation. Il commence par un W suivi de 9 chiffres.", + path: ["destinationOrgId"] + }); + } + break; + } + default: + throw new Error("Unhandled destination type"); + } +}; + +export const refineSecondaryWasteCodes: Refinement = ( + ssdItem, + { addIssue } +) => { + const wasteCodesLength = ssdItem.secondaryWasteCodes?.length || 0; + const wasteDescriptionsLength = + ssdItem.secondaryWasteDescriptions?.length || 0; + + if (wasteCodesLength !== wasteDescriptionsLength) { + addIssue({ + code: z.ZodIssueCode.custom, + message: `Le nombre de code déchets secondaites doit correspondre au nombre de descriptions secondaires. ${wasteCodesLength} code(s) et ${wasteDescriptionsLength} description(s) fournis.`, + path: ["secondaryWasteCodes"] + }); + } +}; diff --git a/libs/back/registry/src/ssd/validation/schema.ts b/libs/back/registry/src/ssd/validation/schema.ts new file mode 100644 index 0000000000..dca29f64d6 --- /dev/null +++ b/libs/back/registry/src/ssd/validation/schema.ts @@ -0,0 +1,204 @@ +import { OperationMode } from "@prisma/client"; +import { BSDD_WASTE_CODES_ENUM, isSiret } from "@td/constants"; +import { sub } from "date-fns"; +import { z } from "zod"; +import { + getActorAddressSchema, + getActorCitySchema, + getActorCountryCodeSchema, + getActorNameSchema, + getActorOrgIdSchema, + getActorPostalCodeSchema, + getActorTypeSchema, + operationCodeSchema, + publicIdSchema, + reasonSchema, + reportAsSiretSchema, + volumeSchema, + wasteCodeBaleSchema, + wasteCodeSchema, + wasteDescriptionSchema, + weightIsEstimateSchema, + weightValueSchema +} from "../../shared/schemas"; + +export type ParsedZodSsdItem = z.output; + +const inputSsdSchema = z.object({ + reason: reasonSchema, + publicId: publicIdSchema, + reportAsSiret: reportAsSiretSchema, + reportForSiret: z.coerce + .string({ + invalid_type_error: + "Le SIRET de l'émetteur doit être une chaîne de caractères" + }) + .min(14, "Le SIRET de l'émetteur ne doit pas faire moins de 14 chiffres") + .max(14, "Le SIRET de l'émetteur ne doit pas faire plus de 14 chiffres") + .refine(value => { + return isSiret(value); + }, "Le SIRET de l'émetteur n'est pas un SIRET valide"), + useDate: z.coerce + .date() + .min( + sub(new Date(), { years: 1 }), + "La date d'utilisation ne peut pas être antérieure à J-1an" + ) + .max(new Date(), "La date d'utilisation ne peut pas être dans le futur") + .optional(), + dispatchDate: z.coerce + .date() + .min( + sub(new Date(), { years: 1 }), + "La date d'utilisation ne peut pas être antérieure à J-1an" + ) + .max(new Date(), "La date d'utilisation ne peut pas être dans le futur") + .optional(), + wasteCode: wasteCodeSchema, + wasteDescription: wasteDescriptionSchema, + wasteCodeBale: wasteCodeBaleSchema, + secondaryWasteCodes: z + .string() + .optional() + .transform(val => + val + ? String(val) + .split(",") + .map(val => val.trim()) + : [] + ) + .pipe( + z + .array( + z.nativeEnum(BSDD_WASTE_CODES_ENUM, { + required_error: "Le code déchet secondaire est requis", + invalid_type_error: + "Le code déchet secondaire n'a pas une valeur autorisée. Il doit faire partie de la liste officielle des codes déchets. Ex: 17 02 01, 10 01 18*. Attention à bien respecter les espaces" + }) + ) + .optional() + ), + secondaryWasteDescriptions: z + .string() + .optional() + .transform(val => + val + ? String(val) + .split(",") + .map(val => val.trim()) + : [] + ) + .pipe( + z + .array( + z + .string() + .min( + 2, + "Les dénominations usuelles du déchet doivent faire au moins 2 charactères" + ) + .max( + 150, + "Les dénominations usuelles du déchet ne peuvent pas dépasser 150 charactères" + ) + ) + .optional() + ), + product: z + .string() + .min(2, "Le produit doit faire au moins 2 charactères") + .max(75, "Le produit ne peut pas dépasser 75 charactères"), + weightValue: weightValueSchema, + weightIsEstimate: weightIsEstimateSchema, + volume: volumeSchema, + processingDate: z.coerce + .date() + .min( + sub(new Date(), { years: 1 }), + "La date de traitement ne peut pas être antérieure à J-1 an" + ) + .max(new Date(), "La date de traitement ne peut pas être dans le futur"), + processingEndDate: z.coerce + .date() + .min( + sub(new Date(), { years: 1 }), + "La date de fin de traitement ne peut pas être antérieure à J-1an" + ) + .max( + new Date(), + "La date de fin de traitement ne peut pas être dans le futur" + ) + .optional(), + destinationType: getActorTypeSchema("de destinataire"), + destinationOrgId: getActorOrgIdSchema("du destinataire"), + destinationName: getActorNameSchema("du destinataire"), + destinationAddress: getActorAddressSchema("du destinataire"), + destinationCity: getActorCitySchema("du destinataire"), + destinationPostalCode: getActorPostalCodeSchema("du destinataire"), + destinationCountryCode: getActorCountryCodeSchema("du destinataire"), + operationCode: operationCodeSchema, + operationMode: z + .enum( + [ + "Réutilisation", + "Reutilisation", + "REUTILISATION", + "RECYCLAGE", + "Recyclage", + "Valorisation énergétique", + "VALORISATION_ENERGETIQUE", + "Élimination", + "Elimination", + "ELIMINATION" + ], + { + required_error: "Le code de qualification est requis", + invalid_type_error: + "Le code de qualification n'est pas une valeur autorisée. Valeurs possibles: Réutilisation, Recyclage, Valorisation énergétique ou Élimination" + } + ) + .transform(val => { + switch (val) { + case "Réutilisation": + case "Reutilisation": + case "REUTILISATION": + return OperationMode.REUTILISATION; + case "Recyclage": + case "RECYCLAGE": + return OperationMode.RECYCLAGE; + case "Valorisation énergétique": + case "VALORISATION_ENERGETIQUE": + return OperationMode.VALORISATION_ENERGETIQUE; + case "Élimination": + case "Elimination": + case "ELIMINATION": + return OperationMode.ELIMINATION; + default: + throw Error("Unhandled qualification code"); + } + }), + administrativeActReference: z + .string() + .min( + 8, + "La référence d'acte administratif doit faire au moins 8 charactères" + ) + .max( + 100, + "La référence d'acte administratif ne peut pas dépasser 100 charactères" + ) + .refine( + val => /^[a-zA-ZÀ-û0-9\s]+$/.test(val), + "La référence d'acte administratif ne peut contenir que des lettres ou des chiffres" + ) +}); + +// Props added through transform +const transformedSsdSchema = z.object({ + reportForAddress: z.string().default(""), + reportForCity: z.string().default(""), + reportForPostalCode: z.string().default(""), + reportForName: z.coerce.string().default("") +}); + +export const ssdSchema = inputSsdSchema.merge(transformedSsdSchema); diff --git a/libs/back/registry/src/ssd/validation/transform.ts b/libs/back/registry/src/ssd/validation/transform.ts new file mode 100644 index 0000000000..2829470a4b --- /dev/null +++ b/libs/back/registry/src/ssd/validation/transform.ts @@ -0,0 +1,34 @@ +import { prisma } from "@td/prisma"; +import { RefinementCtx, z } from "zod"; + +import { ParsedZodSsdItem } from "./schema"; + +export async function transformAndRefineReason( + ssdItem: ParsedZodSsdItem, + { addIssue }: RefinementCtx +) { + const ssdItemInDb = await prisma.registrySsd.findFirst({ + where: { + publicId: ssdItem.publicId, + reportForSiret: ssdItem.reportForSiret, + isActive: true + } + }); + + // If the line alreary exists in DB and we dont have a reason, we can simply ignore it + if (ssdItemInDb && !ssdItem.reason) { + ssdItem.reason = "IGNORER"; + return ssdItem; + } + + if (!ssdItemInDb && ssdItem.reason) { + addIssue({ + code: z.ZodIssueCode.custom, + message: `La raison doit rester vide, le numéro unique "${ssdItem.publicId}" n'a jamais été importé.`, + path: ["reason"] + }); + return z.NEVER; + } + + return ssdItem; +} diff --git a/libs/back/registry/src/transformers.ts b/libs/back/registry/src/transformers.ts new file mode 100644 index 0000000000..0f91a85445 --- /dev/null +++ b/libs/back/registry/src/transformers.ts @@ -0,0 +1,102 @@ +import { parse } from "@fast-csv/parse"; +import { logger } from "@td/logger"; +import duplexify from "duplexify"; +import * as Excel from "exceljs"; +import { PassThrough, Readable } from "node:stream"; + +import { CSV_DELIMITER, ImportOptions } from "./options"; + +export function getTransformCsvStream(options: ImportOptions) { + const parseStream = parse({ + headers: rawHeaders => { + const headerLabels = Object.values(options.headers); + const headerKeys = Object.keys(options.headers); + return rawHeaders.map((header, index) => { + if (header !== headerLabels[index]) { + return header; // Return the original header. The "headers" event handler will detect the error. + } + return headerKeys[index]; + }); + }, + renameHeaders: true, + delimiter: CSV_DELIMITER, + trim: true + }) + .transform(async rawLine => { + // Iterate over each key in the row and replace empty strings with null + for (const key in rawLine) { + if (rawLine[key] === "") { + rawLine[key] = undefined; + } + } + + const result = await options.safeParseAsync(rawLine); + return { rawLine, result }; + }) + .on("headers", headers => { + const expectedHeaders = Object.keys(options.headers); + + for (const [idx, header] of headers.entries()) { + if (header === expectedHeaders[idx]) { + continue; + } + // Destroy the stream to stop the parsing process without flushing it + parseStream.destroy( + new Error( + `En-tête non valide pour la colonne numéro ${idx + 1}. Attendu "${ + options.headers[expectedHeaders[idx]] + }", reçu "${header}"` + ) + ); + break; + } + }) + .on("error", error => { + logger.error(`Error while parsing CSV. ${error.message}`); + }) + .on("end", (rowCount: number) => + logger.info(`Finished parsing CSV import. ${rowCount} rows parsed.`) + ); + + return parseStream; +} + +export function getTransformXlsxStream(options: ImportOptions) { + const inputStream = new PassThrough(); + const workbookReader = new Excel.stream.xlsx.WorkbookReader(inputStream, {}); + + const createReader = async function* () { + for await (const worksheetReader of workbookReader) { + for await (const row of worksheetReader) { + if (row.number === 0) { + const headerLabels = Object.values(options.headers); + + headerLabels.forEach((label, index) => { + const cellValue = row.getCell(index).value; + if (cellValue !== label) { + throw new Error( + `En-tête non valide à l'index ${index}. Attendu "${label}", reçu "${cellValue}"` + ); + } + }); + + continue; + } + + const rawLine = {}; + const keys = Object.keys(options.headers); + for (const [index, key] of keys.entries()) { + rawLine[key] = row.getCell(index).value; + } + + const result = await options.safeParseAsync(rawLine); + yield { rawLine, result }; + } + } + }; + + const outputStream = Readable.from(createReader()); + + const xslxTransformStream = duplexify(inputStream, outputStream); + return xslxTransformStream; +} diff --git a/libs/back/registry/src/zodErrors.ts b/libs/back/registry/src/zodErrors.ts new file mode 100644 index 0000000000..171be193a0 --- /dev/null +++ b/libs/back/registry/src/zodErrors.ts @@ -0,0 +1,39 @@ +import { z } from "zod"; + +export const registryErrorMap: z.ZodErrorMap = (issue, ctx) => { + if (issue.code === z.ZodIssueCode.invalid_type) { + if (issue.received === z.ZodParsedType.undefined) { + return { message: "Champ requis" }; + } else if (issue.received === z.ZodParsedType.nan) { + return { message: "Champ requis. La valeur doit être un nombre" }; + } else { + return { + message: `Une valeur de type "${issue.expected}" était attendue, reçu "${issue.received}"` + }; + } + } + + if (issue.code === z.ZodIssueCode.invalid_enum_value) { + if (issue.options.length <= 10) { + return { + message: `La valeur "${ + ctx.data + }" ne fait pas partie des valeurs autorisées. Veuillez saisir une des valeurs suivantes: ${issue.options + .map(o => `"${o}"`) + .join(", ")}` + }; + } + return { + message: `La valeur "${ctx.data}" ne fait pas partie des valeurs autorisées. Veuillez vous référer à la documentation pour la liste des valeurs possibles` + }; + } + + if (issue.code === z.ZodIssueCode.invalid_date) { + return { + message: + "Le format de date est invalide. Exemples de formats possibles: 2000-01-01T00:00:00.000Z, 2000-01-01T00:00:00.000, 2000-01-01" + }; + } + + return { message: ctx.defaultError }; +}; diff --git a/libs/back/registry/tsconfig.json b/libs/back/registry/tsconfig.json new file mode 100644 index 0000000000..25f7201d87 --- /dev/null +++ b/libs/back/registry/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "module": "commonjs" + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/libs/back/registry/tsconfig.lib.json b/libs/back/registry/tsconfig.lib.json new file mode 100644 index 0000000000..e583571eac --- /dev/null +++ b/libs/back/registry/tsconfig.lib.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "commonjs", + "outDir": "../../../dist/out-tsc", + "declaration": true, + "types": ["node"] + }, + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"], + "include": ["src/**/*.ts"] +} diff --git a/libs/back/registry/tsconfig.spec.json b/libs/back/registry/tsconfig.spec.json new file mode 100644 index 0000000000..d11d0d29d9 --- /dev/null +++ b/libs/back/registry/tsconfig.spec.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"], + "sourceMap": true + }, + "include": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/libs/back/scripts/src/scripts/20240802142645389_bsda_draft_restriction.ts b/libs/back/scripts/src/scripts/20240802142645389_bsda_draft_restriction.ts index b8db5420f4..c16b69d29e 100644 --- a/libs/back/scripts/src/scripts/20240802142645389_bsda_draft_restriction.ts +++ b/libs/back/scripts/src/scripts/20240802142645389_bsda_draft_restriction.ts @@ -126,7 +126,7 @@ export async function run() { id: correspondingEvent.actor } }); - } catch (error) { + } catch (_) { logger.error(`failed to fetch user ${correspondingEvent.actor}`); } } @@ -162,7 +162,7 @@ export async function run() { let userCompanies: Company[] = []; try { userCompanies = await getUserCompanies(user.id as string); - } catch (error) { + } catch (_) { logger.error(`failed to fetch companies of user ${user.id}`); } const userOrgIds = userCompanies.map(company => company.orgId); diff --git a/libs/back/scripts/src/scripts/20241009174516425_bsvhu_draft_restriction.ts b/libs/back/scripts/src/scripts/20241009174516425_bsvhu_draft_restriction.ts index 0cb17fd17c..b1d1d89aad 100644 --- a/libs/back/scripts/src/scripts/20241009174516425_bsvhu_draft_restriction.ts +++ b/libs/back/scripts/src/scripts/20241009174516425_bsvhu_draft_restriction.ts @@ -133,7 +133,7 @@ export async function run() { id: correspondingEvent.actor } }); - } catch (error) { + } catch (_) { logger.error(`failed to fetch user ${correspondingEvent.actor}`); } } @@ -164,7 +164,7 @@ export async function run() { let userCompanies: Company[] = []; try { userCompanies = await getUserCompanies(user.id as string); - } catch (error) { + } catch (_) { logger.error(`failed to fetch companies of user ${user.id}`); } const userOrgIds = userCompanies.map(company => company.orgId); diff --git a/libs/back/tracer/src/pkg.ts b/libs/back/tracer/src/pkg.ts index 0a6d782b2f..7adfe2e75e 100644 --- a/libs/back/tracer/src/pkg.ts +++ b/libs/back/tracer/src/pkg.ts @@ -19,7 +19,7 @@ export function findPkg(): { name: string | undefined } { return JSON.parse(readFileSync(filePath, "utf8")) as { name: string | undefined; }; - } catch (e) { + } catch (_) { return { name: undefined }; } } diff --git a/libs/shared/constants/src/BALE.ts b/libs/shared/constants/src/BALE.ts new file mode 100644 index 0000000000..af347d8513 --- /dev/null +++ b/libs/shared/constants/src/BALE.ts @@ -0,0 +1,124 @@ +export const WASTE_CODES_BALE = [ + "A1010", + "A1020", + "A1030", + "A1040", + "A1050", + "A1060", + "A1070", + "A1080", + "A1090", + "A1100", + "A1110", + "A1120", + "A1130", + "A1140", + "A1150", + "A1160", + "A1170", + "A1180", + "A1190", + "A2010", + "A2020", + "A2030", + "A2040", + "A2050", + "A2060", + "A3010", + "A3020", + "A3030", + "A3040", + "A3050", + "A3060", + "A3070", + "A3080", + "A3090", + "A3100", + "A3110", + "A3120", + "A3130", + "A3140", + "A3150", + "A3160", + "A3170", + "A3180", + "A3190", + "A3200", + "A4010", + "A4020", + "A4030", + "A4040", + "A4050", + "A4060", + "A4070", + "A4080", + "A4090", + "A4100", + "A4110", + "A4120", + "A4130", + "A4140", + "A4150", + "A4160", + "B1010", + "B1020", + "B1030", + "B1031", + "B1040", + "B1050", + "B1060", + "B1070", + "B1080", + "B1090", + "B1100", + "B1110", + "B1115", + "B1120", + "B1130", + "B1140", + "B1150", + "B1160", + "B1170", + "B1180", + "B1190", + "B1200", + "B1210", + "B1220", + "B1230", + "B1240", + "B1250", + "B2010", + "B2020", + "B2030", + "B2040", + "B2050", + "B2060", + "B2070", + "B2080", + "B2090", + "B2100", + "B2110", + "B2120", + "B2130", + "B3010", + "B3020", + "B3026", + "B3027", + "B3030", + "B3035", + "B3040", + "B3050", + "B3060", + "B3065", + "B3070", + "B3080", + "B3090", + "B3100", + "B3110", + "B3120", + "B3130", + "B3140", + "B4010", + "B4020", + "B4030" +] as const; diff --git a/libs/shared/constants/src/PROCESSING_AND_REUSE_OPERATIONS.ts b/libs/shared/constants/src/PROCESSING_AND_REUSE_OPERATIONS.ts index d6d6124b3b..6e78c3259e 100644 --- a/libs/shared/constants/src/PROCESSING_AND_REUSE_OPERATIONS.ts +++ b/libs/shared/constants/src/PROCESSING_AND_REUSE_OPERATIONS.ts @@ -1,17 +1,16 @@ import { PROCESSING_OPERATIONS, - ProcessingOperation, ProcessingOperationType } from "./PROCESSING_OPERATIONS"; -export const PROCESSING_AND_REUSE_OPERATIONS: ProcessingOperation[] = [ +export const PROCESSING_AND_REUSE_OPERATIONS = [ { type: ProcessingOperationType.Valorisation, code: "R 0", description: "Réutilisation - réemploi" }, ...PROCESSING_OPERATIONS -]; +] as const; export const PROCESSING_AND_REUSE_OPERATIONS_CODES: string[] = PROCESSING_AND_REUSE_OPERATIONS.map(operation => operation.code); diff --git a/libs/shared/constants/src/PROCESSING_OPERATIONS.ts b/libs/shared/constants/src/PROCESSING_OPERATIONS.ts index e825dbe1cc..02f561694a 100644 --- a/libs/shared/constants/src/PROCESSING_OPERATIONS.ts +++ b/libs/shared/constants/src/PROCESSING_OPERATIONS.ts @@ -4,13 +4,7 @@ export enum ProcessingOperationType { Groupement = "GROUPEMENT" } -export interface ProcessingOperation { - type: ProcessingOperationType; - code: string; - description: string; -} - -export const PROCESSING_OPERATIONS: ProcessingOperation[] = [ +export const PROCESSING_OPERATIONS = [ { type: ProcessingOperationType.Valorisation, code: "R 1", @@ -170,12 +164,20 @@ export const PROCESSING_OPERATIONS: ProcessingOperation[] = [ description: "Stockage préalablement à l’une des opérations D1 à D14 (à l’exclusion du stockage temporaire, avant collecte, sur le site de production)." } -]; +] as const; -export const PROCESSING_OPERATIONS_CODES: string[] = PROCESSING_OPERATIONS.map( +export const PROCESSING_OPERATIONS_CODES = PROCESSING_OPERATIONS.map( operation => operation.code ); +type OperationCodes = (typeof PROCESSING_OPERATIONS_CODES)[number]; +// Build an object that zods nativeEnum can ingest +export const PROCESSING_OPERATIONS_CODES_ENUM = + PROCESSING_OPERATIONS_CODES.reduce((obj, cur) => { + obj[cur] = cur; + return obj; + }, {} as Record); + export const PROCESSING_OPERATIONS_GROUPEMENT_CODES: string[] = PROCESSING_OPERATIONS.filter( operation => operation.type === ProcessingOperationType.Groupement diff --git a/libs/shared/constants/src/WASTES.ts b/libs/shared/constants/src/WASTES.ts index 5c7218933e..fdb820986f 100644 --- a/libs/shared/constants/src/WASTES.ts +++ b/libs/shared/constants/src/WASTES.ts @@ -1,12 +1,12 @@ // source: https://aida.ineris.fr/consultation_document/10327 -export interface WasteNode { +export type WasteNode = Readonly<{ code: string; description: string; - children: WasteNode[]; -} + children: readonly WasteNode[]; +}>; -export const ALL_WASTES_TREE: WasteNode[] = [ +export const ALL_WASTES_TREE = [ { code: "01", description: @@ -5526,7 +5526,7 @@ export const ALL_WASTES_TREE: WasteNode[] = [ } ] } -]; +] as const; const bsffOnlyWasteCodes = ["14 06 01*"] as const; const bsdaOnlyWasteCodes = [ @@ -5589,6 +5589,19 @@ export const ALL_WASTES = flatten(ALL_WASTES_TREE); export const BSDD_WASTES = flatten(BSDD_WASTES_TREE); export const BSDD_WASTE_CODES = BSDD_WASTES.map(waste => waste.code); +type WasteCode = + (typeof ALL_WASTES_TREE)[number]["children"][number]["children"][number]["code"]; +const wasteCodesArray: WasteCode[] = ALL_WASTES_TREE.flatMap(parent => + parent.children.flatMap(child => + child.children.map(grandchild => grandchild.code) + ) +); +// Build an object that zods nativeEnum can ingest +export const BSDD_WASTE_CODES_ENUM = wasteCodesArray.reduce((obj, cur) => { + obj[cur] = cur; + return obj; +}, {} as Record); + export const BSDA_WASTES = ALL_WASTES.filter(w => BSDA_WASTE_CODES.some(code => code === w.code) ); @@ -5622,7 +5635,7 @@ export const BSDD_SAMPLE_NUMBER_WASTE_CODES = [ "13 02 08*" ]; -function flatten(wastes: WasteNode[]): WasteNode[] { +function flatten(wastes: readonly WasteNode[]): WasteNode[] { return wastes .reduce( (acc: WasteNode[], waste) => @@ -5636,7 +5649,7 @@ function flatten(wastes: WasteNode[]): WasteNode[] { } export function toWasteTree( - wasteNodes: WasteNode[], + wasteNodes: readonly WasteNode[], opts?: { exclude?: string[] } | { include?: string[] } ): WasteNode[] { return wasteNodes diff --git a/libs/shared/constants/src/index.ts b/libs/shared/constants/src/index.ts index 89268b3a27..487098f708 100644 --- a/libs/shared/constants/src/index.ts +++ b/libs/shared/constants/src/index.ts @@ -13,3 +13,4 @@ export * from "./statuses"; export * from "./VALIDATION"; export * from "./WASTES"; export * from "./emailHelpers"; +export * from "./BALE"; diff --git a/nx.json b/nx.json index b897abad74..d0b59bb420 100644 --- a/nx.json +++ b/nx.json @@ -1,7 +1,4 @@ { - "affected": { - "defaultBase": "dev" - }, "namedInputs": { "default": ["{projectRoot}/**/*", "sharedGlobals"], "sharedGlobals": [ @@ -66,5 +63,7 @@ "cacheableOperations": ["build-storybook"] } } - } + }, + "defaultBase": "dev", + "useLegacyCache": true } diff --git a/package-lock.json b/package-lock.json index aec10881bc..2e0230ee03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,8 +11,9 @@ "dependencies": { "@apollo/client": "^3.7.16", "@apollo/server": "^4.9.1", - "@aws-sdk/client-s3": "^3.359.0", - "@aws-sdk/lib-storage": "^3.359.0", + "@aws-sdk/client-s3": "3.677.0", + "@aws-sdk/lib-storage": "3.677.0", + "@aws-sdk/s3-request-presigner": "3.677.0", "@bull-board/api": "^4.12.2", "@bull-board/express": "^4.12.2", "@codegouvfr/react-dsfr": "^1.13.8", @@ -77,6 +78,7 @@ "dataloader": "^2.0.0", "date-fns": "^2.28.0", "decimal.js": "^10.4.3", + "duplexify": "^4.1.3", "exceljs": "^4.3.0", "express": "^4.18.2", "express-rate-limit": "^5.5.0", @@ -158,6 +160,7 @@ "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.21.0", "@babel/runtime": "^7.21.0", + "@chromatic-com/storybook": "^1.9.0", "@docusaurus/module-type-aliases": "^3.5.2", "@faker-js/faker": "^7.6.0", "@fast-csv/parse": "^4.3.0", @@ -165,26 +168,26 @@ "@graphql-codegen/typescript": "^3.0.2", "@graphql-codegen/typescript-operations": "^3.0.2", "@graphql-codegen/typescript-resolvers": "^3.1.1", - "@nx/esbuild": "18.0.7", - "@nx/eslint": "18.0.7", - "@nx/eslint-plugin": "18.0.7", - "@nx/jest": "18.0.7", - "@nx/js": "18.0.7", - "@nx/node": "18.0.7", - "@nx/react": "18.0.7", - "@nx/storybook": "^18.0.8", - "@nx/vite": "18.0.7", - "@nx/web": "18.0.7", + "@nx/esbuild": "20.0.3", + "@nx/eslint": "20.0.3", + "@nx/eslint-plugin": "20.0.3", + "@nx/jest": "20.0.3", + "@nx/js": "20.0.3", + "@nx/node": "20.0.3", + "@nx/react": "20.0.3", + "@nx/storybook": "20.0.3", + "@nx/vite": "20.0.3", + "@nx/web": "20.0.3", "@playwright/test": "^1.40.1", - "@storybook/addon-a11y": "^8.0.0", - "@storybook/addon-actions": "^8.0.0", - "@storybook/addon-essentials": "^8.0.0", - "@storybook/addon-interactions": "^8.0.0", - "@storybook/addon-links": "^8.0.0", - "@storybook/addon-mdx-gfm": "^8.0.0", - "@storybook/core-server": "^8.0.0", - "@storybook/react": "^8.0.0", - "@storybook/react-vite": "^8.0.0", + "@storybook/addon-a11y": "8.3.6", + "@storybook/addon-actions": "8.3.6", + "@storybook/addon-essentials": "8.3.6", + "@storybook/addon-interactions": "8.3.6", + "@storybook/addon-links": "8.3.6", + "@storybook/addon-mdx-gfm": "8.3.6", + "@storybook/core-server": "8.3.6", + "@storybook/react": "8.3.6", + "@storybook/react-vite": "8.3.6", "@swc-node/register": "1.8.0", "@swc/cli": "~0.1.62", "@swc/core": "~1.3.85", @@ -201,6 +204,7 @@ "@types/connect-redis": "^0.0.14", "@types/cors": "^2.8.6", "@types/cron": "^1.7.2", + "@types/duplexify": "^3.6.4", "@types/express": "~4.17.13", "@types/express-rate-limit": "^5.1.3", "@types/express-serve-static-core": "^4.17.24", @@ -231,8 +235,8 @@ "@types/sanitize-html": "^2.3.1", "@types/supertest": "^2.0.10", "@types/zxcvbn": "^4.4.0", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", + "@typescript-eslint/eslint-plugin": "8.11.0", + "@typescript-eslint/parser": "8.11.0", "@vitejs/plugin-react": "4.2.1", "babel-jest": "^29.7.0", "babel-loader": "^8.3.0", @@ -241,8 +245,8 @@ "core-js": "^3.21.1", "docusaurus-graphql-plugin": "^0.9.0", "esbuild": "0.19.5", - "eslint": "8.57.0", - "eslint-plugin-import": "^2.27.5", + "eslint": "8.57.1", + "eslint-plugin-import": "2.31.0", "eslint-plugin-jsx-a11y": "6.7.1", "eslint-plugin-no-only-tests": "^3.1.0", "eslint-plugin-react": "7.32.2", @@ -256,12 +260,12 @@ "jsdom": "~22.1.0", "mermaid": "10.6.1", "node-mocks-http": "^1.11.0", - "nx": "18.0.7", + "nx": "20.0.3", "prettier": "^2.8.6", "raw-loader": "^4.0.2", "sass": "^1.55.0", - "storybook": "^8.0.0", - "storybook-addon-apollo-client": "^5.0.0", + "storybook": "8.3.6", + "storybook-addon-apollo-client": "^7.3.0", "superagent-mock": "^4.0.0", "supertest": "^6.1.6", "ts-jest": "^29.1.0", @@ -293,9 +297,9 @@ } }, "node_modules/@adobe/css-tools": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", - "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==" + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", + "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==" }, "node_modules/@algolia/autocomplete-core": { "version": "1.9.3", @@ -419,9 +423,9 @@ } }, "node_modules/@algolia/client-common": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.2.5.tgz", - "integrity": "sha512-ITE85veJWwClnoNyv7Zydh9U0eKA82cDy8pLw+2hzL+zlzFIvV68ihGOEQ/kXt8N4v+R4MFzvsxnIpMruQzEug==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.10.1.tgz", + "integrity": "sha512-WsMBmO92GMWBvhS2RHwdbgxwbEh3sEymSMMXiO48ayyR8Crvr+KvcccDCrpA/Ek2XOpMZYVkCvvfpr50yEBMAA==", "peer": true, "engines": { "node": ">= 14.0.0" @@ -447,14 +451,15 @@ } }, "node_modules/@algolia/client-search": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.2.5.tgz", - "integrity": "sha512-OVDLzm5BEUbJmjfMm7b0Xx8vkK+NyEh7whPHuap2qy0x7RxQDLMXjiKsBbt1WNq+9nfX6+M/f2t0CJ8ENVuyYQ==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.10.1.tgz", + "integrity": "sha512-Zogjyw/evyywK9XqQ5iDsTsB5rJ0kEVdIQvw0sEV5KHq0XX7JcLdCRbMz22f5NPwVoiZkxWRcsHN9FgWMkS7lg==", "peer": true, "dependencies": { - "@algolia/client-common": "5.2.5", - "@algolia/requester-browser-xhr": "5.2.5", - "@algolia/requester-node-http": "5.2.5" + "@algolia/client-common": "5.10.1", + "@algolia/requester-browser-xhr": "5.10.1", + "@algolia/requester-fetch": "5.10.1", + "@algolia/requester-node-http": "5.10.1" }, "engines": { "node": ">= 14.0.0" @@ -532,12 +537,12 @@ } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.2.5.tgz", - "integrity": "sha512-Ri73PphNy1ceig94xJW9bPdN7uIYFAjpsABpp2Fsun4DmeZD5a4rMCNwwOXXsbC8h+lUzW34zpUf+h4Nk+eaqA==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.10.1.tgz", + "integrity": "sha512-HAPq25Vd2eocTiNbTV9QpI2jXZYWoq9fB4tE4EWlLPCnx6P1C7bx6kXzHkBuRE6szbMyIZW47YlsYsDU/Vslhg==", "peer": true, "dependencies": { - "@algolia/client-common": "5.2.5" + "@algolia/client-common": "5.10.1" }, "engines": { "node": ">= 14.0.0" @@ -548,13 +553,25 @@ "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==" }, + "node_modules/@algolia/requester-fetch": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.10.1.tgz", + "integrity": "sha512-SwmfnWdtShlXWnOZniGgWKRweRdKWRdN+kF/HM6UJE3G+2RNZKUHYzpJCWuxGkWHX9hcukBRrx8JRHj2m6+sRA==", + "peer": true, + "dependencies": { + "@algolia/client-common": "5.10.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@algolia/requester-node-http": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.2.5.tgz", - "integrity": "sha512-/tTdEuWcWHSe/mGMomWkuaFDoRcpfl/jvGISVTPRq3pJvM1FPAzxlh2MXge6C30aUS9bxh3V0aWwgKFCilzyMQ==", + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.10.1.tgz", + "integrity": "sha512-lCk2y8J2Xs812BCymenscKs+BddHYnln/NIlqC4yU5Xa7EEyU/yd68jHxBRt75cIkgaNdNW5C4WzzcNpWc44vg==", "peer": true, "dependencies": { - "@algolia/client-common": "5.2.5" + "@algolia/client-common": "5.10.1" }, "engines": { "node": ">= 14.0.0" @@ -1091,22 +1108,11 @@ "node": ">=14" } }, - "node_modules/@aw-web-design/x-default-browser": { - "version": "1.4.126", - "resolved": "https://registry.npmjs.org/@aw-web-design/x-default-browser/-/x-default-browser-1.4.126.tgz", - "integrity": "sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==", - "dev": true, - "dependencies": { - "default-browser-id": "3.0.0" - }, - "bin": { - "x-default-browser": "bin/x-default-browser.js" - } - }, "node_modules/@aws-crypto/crc32": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "optional": true, "dependencies": { "@aws-crypto/util": "^3.0.0", "@aws-sdk/types": "^3.222.0", @@ -1116,27 +1122,36 @@ "node_modules/@aws-crypto/crc32/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true }, "node_modules/@aws-crypto/crc32c": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz", - "integrity": "sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", + "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", + "license": "Apache-2.0", "dependencies": { - "@aws-crypto/util": "^3.0.0", + "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" + "tslib": "^2.6.2" } }, - "node_modules/@aws-crypto/crc32c/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "node_modules/@aws-crypto/crc32c/node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } }, "node_modules/@aws-crypto/ie11-detection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "optional": true, "dependencies": { "tslib": "^1.11.1" } @@ -1144,31 +1159,48 @@ "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true }, "node_modules/@aws-crypto/sha1-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz", - "integrity": "sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", + "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", + "license": "Apache-2.0", "dependencies": { - "@aws-crypto/ie11-detection": "^3.0.0", - "@aws-crypto/supports-web-crypto": "^3.0.0", - "@aws-crypto/util": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "node_modules/@aws-crypto/sha1-browser/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "node_modules/@aws-crypto/sha1-browser/node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } }, "node_modules/@aws-crypto/sha256-browser": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "optional": true, "dependencies": { "@aws-crypto/ie11-detection": "^3.0.0", "@aws-crypto/sha256-js": "^3.0.0", @@ -1183,12 +1215,14 @@ "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true }, "node_modules/@aws-crypto/sha256-js": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "optional": true, "dependencies": { "@aws-crypto/util": "^3.0.0", "@aws-sdk/types": "^3.222.0", @@ -1198,12 +1232,14 @@ "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true }, "node_modules/@aws-crypto/supports-web-crypto": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "optional": true, "dependencies": { "tslib": "^1.11.1" } @@ -1211,12 +1247,14 @@ "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true }, "node_modules/@aws-crypto/util": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "optional": true, "dependencies": { "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-utf8-browser": "^3.0.0", @@ -1226,7 +1264,8 @@ "node_modules/@aws-crypto/util/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true }, "node_modules/@aws-sdk/client-cognito-identity": { "version": "3.540.0", @@ -1280,6071 +1319,6412 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.540.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.540.0.tgz", - "integrity": "sha512-rYBuNB7uqCO9xZc0OAwM2K6QJAo2Syt1L5OhEaf7zG7FulNMyrK6kJPg1WrvNE90tW6gUdDaTy3XsQ7lq6O7uA==", - "dependencies": { - "@aws-crypto/sha1-browser": "3.0.0", - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.540.0", - "@aws-sdk/core": "3.535.0", - "@aws-sdk/credential-provider-node": "3.540.0", - "@aws-sdk/middleware-bucket-endpoint": "3.535.0", - "@aws-sdk/middleware-expect-continue": "3.535.0", - "@aws-sdk/middleware-flexible-checksums": "3.535.0", - "@aws-sdk/middleware-host-header": "3.535.0", - "@aws-sdk/middleware-location-constraint": "3.535.0", - "@aws-sdk/middleware-logger": "3.535.0", - "@aws-sdk/middleware-recursion-detection": "3.535.0", - "@aws-sdk/middleware-sdk-s3": "3.535.0", - "@aws-sdk/middleware-signing": "3.535.0", - "@aws-sdk/middleware-ssec": "3.537.0", - "@aws-sdk/middleware-user-agent": "3.540.0", - "@aws-sdk/region-config-resolver": "3.535.0", - "@aws-sdk/signature-v4-multi-region": "3.535.0", - "@aws-sdk/types": "3.535.0", - "@aws-sdk/util-endpoints": "3.540.0", - "@aws-sdk/util-user-agent-browser": "3.535.0", - "@aws-sdk/util-user-agent-node": "3.535.0", - "@aws-sdk/xml-builder": "3.535.0", - "@smithy/config-resolver": "^2.2.0", - "@smithy/core": "^1.4.0", - "@smithy/eventstream-serde-browser": "^2.2.0", - "@smithy/eventstream-serde-config-resolver": "^2.2.0", - "@smithy/eventstream-serde-node": "^2.2.0", - "@smithy/fetch-http-handler": "^2.5.0", - "@smithy/hash-blob-browser": "^2.2.0", - "@smithy/hash-node": "^2.2.0", - "@smithy/hash-stream-node": "^2.2.0", - "@smithy/invalid-dependency": "^2.2.0", - "@smithy/md5-js": "^2.2.0", - "@smithy/middleware-content-length": "^2.2.0", - "@smithy/middleware-endpoint": "^2.5.0", - "@smithy/middleware-retry": "^2.2.0", - "@smithy/middleware-serde": "^2.3.0", - "@smithy/middleware-stack": "^2.2.0", - "@smithy/node-config-provider": "^2.3.0", - "@smithy/node-http-handler": "^2.5.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/smithy-client": "^2.5.0", - "@smithy/types": "^2.12.0", - "@smithy/url-parser": "^2.2.0", - "@smithy/util-base64": "^2.3.0", - "@smithy/util-body-length-browser": "^2.2.0", - "@smithy/util-body-length-node": "^2.3.0", - "@smithy/util-defaults-mode-browser": "^2.2.0", - "@smithy/util-defaults-mode-node": "^2.3.0", - "@smithy/util-endpoints": "^1.2.0", - "@smithy/util-retry": "^2.2.0", - "@smithy/util-stream": "^2.2.0", - "@smithy/util-utf8": "^2.3.0", - "@smithy/util-waiter": "^2.2.0", + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.677.0.tgz", + "integrity": "sha512-TrfT7hyjs0FRh5MosduFZsskHhjvBKL451Wo5f80IcnxvNL8YZouh6kblUSiHKUxuc32WSiAKbXJJaPWdXs75Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha1-browser": "5.2.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.677.0", + "@aws-sdk/client-sts": "3.677.0", + "@aws-sdk/core": "3.677.0", + "@aws-sdk/credential-provider-node": "3.677.0", + "@aws-sdk/middleware-bucket-endpoint": "3.667.0", + "@aws-sdk/middleware-expect-continue": "3.667.0", + "@aws-sdk/middleware-flexible-checksums": "3.677.0", + "@aws-sdk/middleware-host-header": "3.667.0", + "@aws-sdk/middleware-location-constraint": "3.667.0", + "@aws-sdk/middleware-logger": "3.667.0", + "@aws-sdk/middleware-recursion-detection": "3.667.0", + "@aws-sdk/middleware-sdk-s3": "3.677.0", + "@aws-sdk/middleware-ssec": "3.667.0", + "@aws-sdk/middleware-user-agent": "3.677.0", + "@aws-sdk/region-config-resolver": "3.667.0", + "@aws-sdk/signature-v4-multi-region": "3.677.0", + "@aws-sdk/types": "3.667.0", + "@aws-sdk/util-endpoints": "3.667.0", + "@aws-sdk/util-user-agent-browser": "3.675.0", + "@aws-sdk/util-user-agent-node": "3.677.0", + "@aws-sdk/xml-builder": "3.662.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/eventstream-serde-browser": "^3.0.10", + "@smithy/eventstream-serde-config-resolver": "^3.0.7", + "@smithy/eventstream-serde-node": "^3.0.9", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-blob-browser": "^3.1.6", + "@smithy/hash-node": "^3.0.7", + "@smithy/hash-stream-node": "^3.1.6", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/md5-js": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-stream": "^3.1.9", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.6", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.540.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.540.0.tgz", - "integrity": "sha512-rrQZMuw4sxIo3eyAUUzPQRA336mPRnrAeSlSdVHBKZD8Fjvoy0lYry2vNhkPLpFZLso1J66KRyuIv4LzRR3v1Q==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.535.0", - "@aws-sdk/middleware-host-header": "3.535.0", - "@aws-sdk/middleware-logger": "3.535.0", - "@aws-sdk/middleware-recursion-detection": "3.535.0", - "@aws-sdk/middleware-user-agent": "3.540.0", - "@aws-sdk/region-config-resolver": "3.535.0", - "@aws-sdk/types": "3.535.0", - "@aws-sdk/util-endpoints": "3.540.0", - "@aws-sdk/util-user-agent-browser": "3.535.0", - "@aws-sdk/util-user-agent-node": "3.535.0", - "@smithy/config-resolver": "^2.2.0", - "@smithy/core": "^1.4.0", - "@smithy/fetch-http-handler": "^2.5.0", - "@smithy/hash-node": "^2.2.0", - "@smithy/invalid-dependency": "^2.2.0", - "@smithy/middleware-content-length": "^2.2.0", - "@smithy/middleware-endpoint": "^2.5.0", - "@smithy/middleware-retry": "^2.2.0", - "@smithy/middleware-serde": "^2.3.0", - "@smithy/middleware-stack": "^2.2.0", - "@smithy/node-config-provider": "^2.3.0", - "@smithy/node-http-handler": "^2.5.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/smithy-client": "^2.5.0", - "@smithy/types": "^2.12.0", - "@smithy/url-parser": "^2.2.0", - "@smithy/util-base64": "^2.3.0", - "@smithy/util-body-length-browser": "^2.2.0", - "@smithy/util-body-length-node": "^2.3.0", - "@smithy/util-defaults-mode-browser": "^2.2.0", - "@smithy/util-defaults-mode-node": "^2.3.0", - "@smithy/util-endpoints": "^1.2.0", - "@smithy/util-middleware": "^2.2.0", - "@smithy/util-retry": "^2.2.0", - "@smithy/util-utf8": "^2.3.0", + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.540.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.540.0.tgz", - "integrity": "sha512-LZYK0lBRQK8D8M3Sqc96XiXkAV2v70zhTtF6weyzEpgwxZMfSuFJjs0jFyhaeZBZbZv7BBghIdhJ5TPavNxGMQ==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.540.0", - "@aws-sdk/core": "3.535.0", - "@aws-sdk/middleware-host-header": "3.535.0", - "@aws-sdk/middleware-logger": "3.535.0", - "@aws-sdk/middleware-recursion-detection": "3.535.0", - "@aws-sdk/middleware-user-agent": "3.540.0", - "@aws-sdk/region-config-resolver": "3.535.0", - "@aws-sdk/types": "3.535.0", - "@aws-sdk/util-endpoints": "3.540.0", - "@aws-sdk/util-user-agent-browser": "3.535.0", - "@aws-sdk/util-user-agent-node": "3.535.0", - "@smithy/config-resolver": "^2.2.0", - "@smithy/core": "^1.4.0", - "@smithy/fetch-http-handler": "^2.5.0", - "@smithy/hash-node": "^2.2.0", - "@smithy/invalid-dependency": "^2.2.0", - "@smithy/middleware-content-length": "^2.2.0", - "@smithy/middleware-endpoint": "^2.5.0", - "@smithy/middleware-retry": "^2.2.0", - "@smithy/middleware-serde": "^2.3.0", - "@smithy/middleware-stack": "^2.2.0", - "@smithy/node-config-provider": "^2.3.0", - "@smithy/node-http-handler": "^2.5.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/smithy-client": "^2.5.0", - "@smithy/types": "^2.12.0", - "@smithy/url-parser": "^2.2.0", - "@smithy/util-base64": "^2.3.0", - "@smithy/util-body-length-browser": "^2.2.0", - "@smithy/util-body-length-node": "^2.3.0", - "@smithy/util-defaults-mode-browser": "^2.2.0", - "@smithy/util-defaults-mode-node": "^2.3.0", - "@smithy/util-endpoints": "^1.2.0", - "@smithy/util-middleware": "^2.2.0", - "@smithy/util-retry": "^2.2.0", - "@smithy/util-utf8": "^2.3.0", + "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" - }, - "peerDependencies": { - "@aws-sdk/credential-provider-node": "^3.540.0" } }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.540.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.540.0.tgz", - "integrity": "sha512-ITHUQxvpqfQX6obfpIi3KYGzZYfe/I5Ixjfxoi5lB7ISCtmxqObKB1fzD93wonkMJytJ7LUO8panZl/ojiJ1uw==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.535.0", - "@aws-sdk/middleware-host-header": "3.535.0", - "@aws-sdk/middleware-logger": "3.535.0", - "@aws-sdk/middleware-recursion-detection": "3.535.0", - "@aws-sdk/middleware-user-agent": "3.540.0", - "@aws-sdk/region-config-resolver": "3.535.0", - "@aws-sdk/types": "3.535.0", - "@aws-sdk/util-endpoints": "3.540.0", - "@aws-sdk/util-user-agent-browser": "3.535.0", - "@aws-sdk/util-user-agent-node": "3.535.0", - "@smithy/config-resolver": "^2.2.0", - "@smithy/core": "^1.4.0", - "@smithy/fetch-http-handler": "^2.5.0", - "@smithy/hash-node": "^2.2.0", - "@smithy/invalid-dependency": "^2.2.0", - "@smithy/middleware-content-length": "^2.2.0", - "@smithy/middleware-endpoint": "^2.5.0", - "@smithy/middleware-retry": "^2.2.0", - "@smithy/middleware-serde": "^2.3.0", - "@smithy/middleware-stack": "^2.2.0", - "@smithy/node-config-provider": "^2.3.0", - "@smithy/node-http-handler": "^2.5.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/smithy-client": "^2.5.0", - "@smithy/types": "^2.12.0", - "@smithy/url-parser": "^2.2.0", - "@smithy/util-base64": "^2.3.0", - "@smithy/util-body-length-browser": "^2.2.0", - "@smithy/util-body-length-node": "^2.3.0", - "@smithy/util-defaults-mode-browser": "^2.2.0", - "@smithy/util-defaults-mode-node": "^2.3.0", - "@smithy/util-endpoints": "^1.2.0", - "@smithy/util-middleware": "^2.2.0", - "@smithy/util-retry": "^2.2.0", - "@smithy/util-utf8": "^2.3.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@aws-sdk/credential-provider-node": "^3.540.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.535.0.tgz", - "integrity": "sha512-+Yusa9HziuaEDta1UaLEtMAtmgvxdxhPn7jgfRY6PplqAqgsfa5FR83sxy5qr2q7xjQTwHtV4MjQVuOjG9JsLw==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^1.4.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/signature-v4": "^2.2.0", - "@smithy/smithy-client": "^2.5.0", - "@smithy/types": "^2.12.0", - "fast-xml-parser": "4.2.5", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.540.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.540.0.tgz", - "integrity": "sha512-XOTAIuVgticX+43GMpRbi5OHmJAhHfoHYsVGu0eRLhri1yFqUHXJgHUd51QQtlA8cFQN7JnFFM6sF5EDCPF49g==", - "optional": true, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.540.0", - "@aws-sdk/types": "3.535.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.535.0.tgz", - "integrity": "sha512-XppwO8c0GCGSAvdzyJOhbtktSEaShg14VJKg8mpMa1XcgqzmcqqHQjtDWbx5rZheY1VdpXZhpEzJkB6LpQejpA==", - "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/types": "^2.12.0", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sso": { + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.677.0.tgz", + "integrity": "sha512-/y6EskFhOa2w9VwXaXoyOrGeBjnOj/72wsxDOslS908qH+nf7m40pBK6e/iBelg04vlx0gqhlbfK8hLbaT6KHA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.677.0", + "@aws-sdk/middleware-host-header": "3.667.0", + "@aws-sdk/middleware-logger": "3.667.0", + "@aws-sdk/middleware-recursion-detection": "3.667.0", + "@aws-sdk/middleware-user-agent": "3.677.0", + "@aws-sdk/region-config-resolver": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@aws-sdk/util-endpoints": "3.667.0", + "@aws-sdk/util-user-agent-browser": "3.675.0", + "@aws-sdk/util-user-agent-node": "3.677.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.677.0.tgz", + "integrity": "sha512-2zgZkRIU7DsnUVOy+9bjfJ0IYMzi9ONWXQt/WqMa7HOnj4RfenfpipyhHYxGZR5kmehgv53EI79yvUu+SAfGNg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.677.0", + "@aws-sdk/credential-provider-node": "3.677.0", + "@aws-sdk/middleware-host-header": "3.667.0", + "@aws-sdk/middleware-logger": "3.667.0", + "@aws-sdk/middleware-recursion-detection": "3.667.0", + "@aws-sdk/middleware-user-agent": "3.677.0", + "@aws-sdk/region-config-resolver": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@aws-sdk/util-endpoints": "3.667.0", + "@aws-sdk/util-user-agent-browser": "3.675.0", + "@aws-sdk/util-user-agent-node": "3.677.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.677.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sts": { + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.677.0.tgz", + "integrity": "sha512-N5fs1GLSthnwrs44b4IJI//dcShuIT42g4pM8FCUJZwbrWn9Sp9F876R1mvb8A9TAy2S4qCXi7TkHS0REnuicQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.677.0", + "@aws-sdk/core": "3.677.0", + "@aws-sdk/credential-provider-node": "3.677.0", + "@aws-sdk/middleware-host-header": "3.667.0", + "@aws-sdk/middleware-logger": "3.667.0", + "@aws-sdk/middleware-recursion-detection": "3.667.0", + "@aws-sdk/middleware-user-agent": "3.677.0", + "@aws-sdk/region-config-resolver": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@aws-sdk/util-endpoints": "3.667.0", + "@aws-sdk/util-user-agent-browser": "3.675.0", + "@aws-sdk/util-user-agent-node": "3.677.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.535.0.tgz", - "integrity": "sha512-kdj1wCmOMZ29jSlUskRqN04S6fJ4dvt0Nq9Z32SA6wO7UG8ht6Ot9h/au/eTWJM3E1somZ7D771oK7dQt9b8yw==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/core": { + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.677.0.tgz", + "integrity": "sha512-5auvc1wmXmd7u9Y9nM95Ia+VX7J2FiZLuADitHqE4mHPH9riDgOY+uK/yM+UKr+lfq4zKiZQG7i8cfabZlCY8g==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/fetch-http-handler": "^2.5.0", - "@smithy/node-http-handler": "^2.5.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/smithy-client": "^2.5.0", - "@smithy/types": "^2.12.0", - "@smithy/util-stream": "^2.2.0", + "@aws-sdk/types": "3.667.0", + "@smithy/core": "^2.4.8", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/property-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/signature-v4": "^4.2.0", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-middleware": "^3.0.7", + "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.540.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.540.0.tgz", - "integrity": "sha512-igN/RbsnulIBwqXbwsWmR3srqmtbPF1dm+JteGvUY31FW65fTVvWvSr945Y/cf1UbhPmIQXntlsqESqpkhTHwg==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.677.0.tgz", + "integrity": "sha512-0ctcqKzclr9TiNIkB8I+YRogjWH/4mLWQGv/bgb8ElHqph+rPy4pOubj1Ax01sbs7XdwDaImjBYV5xXE+BEsYw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sts": "3.540.0", - "@aws-sdk/credential-provider-env": "3.535.0", - "@aws-sdk/credential-provider-process": "3.535.0", - "@aws-sdk/credential-provider-sso": "3.540.0", - "@aws-sdk/credential-provider-web-identity": "3.540.0", - "@aws-sdk/types": "3.535.0", - "@smithy/credential-provider-imds": "^2.3.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/shared-ini-file-loader": "^2.4.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/core": "3.677.0", + "@aws-sdk/types": "3.667.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.540.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.540.0.tgz", - "integrity": "sha512-HKQZJbLHlrHX9A0B1poiYNXIIQfy8whTjuosTCYKPDBhhUyVAQfxy/KG726j0v43IhaNPLgTGZCJve4hAsazSw==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.677.0.tgz", + "integrity": "sha512-c4TnShdzk37dhL1HGGzZ2PDKIIEmo1IbT/4y5hSRdNc8Z8fu6spE5GoeVsv6p/HdSGPS7XTy6aOFCMCk4AeIzQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.535.0", - "@aws-sdk/credential-provider-http": "3.535.0", - "@aws-sdk/credential-provider-ini": "3.540.0", - "@aws-sdk/credential-provider-process": "3.535.0", - "@aws-sdk/credential-provider-sso": "3.540.0", - "@aws-sdk/credential-provider-web-identity": "3.540.0", - "@aws-sdk/types": "3.535.0", - "@smithy/credential-provider-imds": "^2.3.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/shared-ini-file-loader": "^2.4.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/core": "3.677.0", + "@aws-sdk/types": "3.667.0", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-stream": "^3.1.9", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.535.0.tgz", - "integrity": "sha512-9O1OaprGCnlb/kYl8RwmH7Mlg8JREZctB8r9sa1KhSsWFq/SWO0AuJTyowxD7zL5PkeS4eTvzFFHWCa3OO5epA==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.677.0.tgz", + "integrity": "sha512-hW+oHj5zplPLzTk74LG+gZVOKQnmBPyRIbwg3uZWr23xfOxh/Osu9Wq8qwgu2+UyFHr+6/DRFjZJ6avNA2jpKw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/shared-ini-file-loader": "^2.4.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/core": "3.677.0", + "@aws-sdk/credential-provider-env": "3.677.0", + "@aws-sdk/credential-provider-http": "3.677.0", + "@aws-sdk/credential-provider-process": "3.677.0", + "@aws-sdk/credential-provider-sso": "3.677.0", + "@aws-sdk/credential-provider-web-identity": "3.677.0", + "@aws-sdk/types": "3.667.0", + "@smithy/credential-provider-imds": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.677.0" } }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.540.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.540.0.tgz", - "integrity": "sha512-tKkFqK227LF5ajc5EL6asXS32p3nkofpP8G7NRpU7zOEOQCg01KUc4JRX+ItI0T007CiN1J19yNoFqHLT/SqHg==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.677.0.tgz", + "integrity": "sha512-DwFriiDx2SSdj7VhRv/0fm8UIK7isy+WZAlqUdZ9xDsX4x1AD5KwMv9AwGhJrMuTjnPSxRSwjt23S7ZXwUfhdw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.540.0", - "@aws-sdk/token-providers": "3.540.0", - "@aws-sdk/types": "3.535.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/shared-ini-file-loader": "^2.4.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/credential-provider-env": "3.677.0", + "@aws-sdk/credential-provider-http": "3.677.0", + "@aws-sdk/credential-provider-ini": "3.677.0", + "@aws-sdk/credential-provider-process": "3.677.0", + "@aws-sdk/credential-provider-sso": "3.677.0", + "@aws-sdk/credential-provider-web-identity": "3.677.0", + "@aws-sdk/types": "3.667.0", + "@smithy/credential-provider-imds": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.540.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.540.0.tgz", - "integrity": "sha512-OpDm9w3A168B44hSjpnvECP4rvnFzD86rN4VYdGADuCvEa5uEcdA/JuT5WclFPDqdWEmFBqS1pxBIJBf0g2Q9Q==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.677.0.tgz", + "integrity": "sha512-pBqHjIFvHBJb2NOsVqdIHWcOzXDoNXBokxTvMggb3WYML6ixwrH7kpd1CAzegeQlvZD4SCcRoy3ahv5rbuR+og==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sts": "3.540.0", - "@aws-sdk/types": "3.535.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/core": "3.677.0", + "@aws-sdk/types": "3.667.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-providers": { - "version": "3.540.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.540.0.tgz", - "integrity": "sha512-tAmvqdZngCrER5/AAwTmDSjO05LGIshKL+lwcJr2OUV5jtQVzfbFrorf+b5dnI+3i8+zGcEAV9omra4XGrO9Kg==", - "optional": true, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.677.0.tgz", + "integrity": "sha512-OkRP3z8yI22t9LS9At5fYr6RN7zKSDiGgeyjEnrqiGHOWGPMJN2GKa8IAFC4dgXt4Nm/EfmEW7UweiqzEKJKOA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.540.0", - "@aws-sdk/client-sso": "3.540.0", - "@aws-sdk/client-sts": "3.540.0", - "@aws-sdk/credential-provider-cognito-identity": "3.540.0", - "@aws-sdk/credential-provider-env": "3.535.0", - "@aws-sdk/credential-provider-http": "3.535.0", - "@aws-sdk/credential-provider-ini": "3.540.0", - "@aws-sdk/credential-provider-node": "3.540.0", - "@aws-sdk/credential-provider-process": "3.535.0", - "@aws-sdk/credential-provider-sso": "3.540.0", - "@aws-sdk/credential-provider-web-identity": "3.540.0", - "@aws-sdk/types": "3.535.0", - "@smithy/credential-provider-imds": "^2.3.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/client-sso": "3.677.0", + "@aws-sdk/core": "3.677.0", + "@aws-sdk/token-providers": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/lib-storage": { - "version": "3.540.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.540.0.tgz", - "integrity": "sha512-xNLOpuOSzGO90fwn+GBsM//a4ALYl85WEsovKyJI6jYJTMCGLrzJQeq8cxeC5Xz6w8Ol86lf80Gll/cz4phy7g==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.677.0.tgz", + "integrity": "sha512-yjuI6hSt1rLFqBQiNKx/nF75Ao72xR8ybqKztzebtFNCrYl8oXVkRiigg5XKNCDmelsx1lcU9IcSiuPHzlGtUQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^2.2.0", - "@smithy/middleware-endpoint": "^2.5.0", - "@smithy/smithy-client": "^2.5.0", - "buffer": "5.6.0", - "events": "3.3.0", - "stream-browserify": "3.0.0", + "@aws-sdk/core": "3.677.0", + "@aws-sdk/types": "3.667.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-s3": "^3.0.0" + "@aws-sdk/client-sts": "^3.677.0" } }, - "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.535.0.tgz", - "integrity": "sha512-7sijlfQsc4UO9Fsl11mU26Y5f9E7g6UoNg/iJUBpC5pgvvmdBRO5UEhbB/gnqvOEPsBXyhmfzbstebq23Qdz7A==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.667.0.tgz", + "integrity": "sha512-Z7fIAMQnPegs7JjAQvlOeWXwpMRfegh5eCoIP6VLJIeR6DLfYKbP35JBtt98R6DXslrN2RsbTogjbxPEDQfw1w==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@aws-sdk/util-arn-parser": "3.535.0", - "@smithy/node-config-provider": "^2.3.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/types": "^2.12.0", - "@smithy/util-config-provider": "^2.3.0", + "@aws-sdk/types": "3.667.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.535.0.tgz", - "integrity": "sha512-hFKyqUBky0NWCVku8iZ9+PACehx0p6vuMw5YnZf8FVgHP0fode0b/NwQY6UY7oor/GftvRsAlRUAWGNFEGUpwA==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-logger": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.667.0.tgz", + "integrity": "sha512-PtTRNpNm/5c746jRgZCNg4X9xEJIwggkGJrF0GP9AB1ANg4pc/sF2Fvn1NtqPe9wtQ2stunJprnm5WkCHN7QiA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/types": "3.667.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.535.0.tgz", - "integrity": "sha512-rBIzldY9jjRATxICDX7t77aW6ctqmVDgnuAOgbVT5xgHftt4o7PGWKoMvl/45hYqoQgxVFnCBof9bxkqSBebVA==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.667.0.tgz", + "integrity": "sha512-U5glWD3ehFohzpUpopLtmqAlDurGWo2wRGPNgi4SwhWU7UDt6LS7E/UvJjqC0CUrjlzOw+my2A+Ncf+fisMhxQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-crypto/crc32": "3.0.0", - "@aws-crypto/crc32c": "3.0.0", - "@aws-sdk/types": "3.535.0", - "@smithy/is-array-buffer": "^2.2.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/types": "^2.12.0", - "@smithy/util-utf8": "^2.3.0", + "@aws-sdk/types": "3.667.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.535.0.tgz", - "integrity": "sha512-0h6TWjBWtDaYwHMQJI9ulafeS4lLaw1vIxRjbpH0svFRt6Eve+Sy8NlVhECfTU2hNz/fLubvrUxsXoThaLBIew==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.677.0.tgz", + "integrity": "sha512-A3gzUsTsvyv/JCmD0p2fkbiOyp+tpAiAADDwzi+eYeyzH4xzqnrzSkGk5KSb58uUQo27eeBzRXHd46d0u+sMrQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/core": "3.677.0", + "@aws-sdk/types": "3.667.0", + "@aws-sdk/util-endpoints": "3.667.0", + "@smithy/core": "^2.4.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.535.0.tgz", - "integrity": "sha512-SxfS9wfidUZZ+WnlKRTCRn3h+XTsymXRXPJj8VV6hNRNeOwzNweoG3YhQbTowuuNfXf89m9v6meYkBBtkdacKw==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.667.0.tgz", + "integrity": "sha512-iNr+JhhA902JMKHG9IwT9YdaEx6KGl6vjAL5BRNeOjfj4cZYMog6Lz/IlfOAltMtT0w88DAHDEFrBd2uO0l2eg==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/types": "3.667.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.7", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.535.0.tgz", - "integrity": "sha512-huNHpONOrEDrdRTvSQr1cJiRMNf0S52NDXtaPzdxiubTkP+vni2MohmZANMOai/qT0olmEVX01LhZ0ZAOgmg6A==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/token-providers": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.667.0.tgz", + "integrity": "sha512-ZecJlG8p6D4UTYlBHwOWX6nknVtw/OBJ3yPXTSajBjhUlj9lE2xvejI8gl4rqkyLXk7z3bki+KR4tATbMaM9yg==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/types": "^2.12.0", + "@aws-sdk/types": "3.667.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.667.0" } }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.535.0.tgz", - "integrity": "sha512-am2qgGs+gwqmR4wHLWpzlZ8PWhm4ktj5bYSgDrsOfjhdBlWNxvPoID9/pDAz5RWL48+oH7I6SQzMqxXsFDikrw==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.535.0.tgz", - "integrity": "sha512-/dLG/E3af6ohxkQ5GBHT8tZfuPIg6eItKxCXuulvYj0Tqgf3Mb+xTsvSkxQsJF06RS4sH7Qsg/PnB8ZfrJrXpg==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-endpoints": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.667.0.tgz", + "integrity": "sha512-X22SYDAuQJWnkF1/q17pkX3nGw5XMD9YEUbmt87vUnRq7iyJ3JOpl6UKOBeUBaL838wA5yzdbinmCITJ/VZ1QA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@aws-sdk/util-arn-parser": "3.535.0", - "@smithy/node-config-provider": "^2.3.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/signature-v4": "^2.2.0", - "@smithy/smithy-client": "^2.5.0", - "@smithy/types": "^2.12.0", - "@smithy/util-config-provider": "^2.3.0", + "@aws-sdk/types": "3.667.0", + "@smithy/types": "^3.5.0", + "@smithy/util-endpoints": "^2.1.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-signing": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.535.0.tgz", - "integrity": "sha512-Rb4sfus1Gc5paRl9JJgymJGsb/i3gJKK/rTuFZICdd1PBBE5osIOHP5CpzWYBtc5LlyZE1a2QoxPMCyG+QUGPw==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.675.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.675.0.tgz", + "integrity": "sha512-HW4vGfRiX54RLcsYjLuAhcBBJ6lRVEZd7njfGpAwBB9s7BH8t48vrpYbyA5XbbqbTvXfYBnugQCUw9HWjEa1ww==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/signature-v4": "^2.2.0", - "@smithy/types": "^2.12.0", - "@smithy/util-middleware": "^2.2.0", + "@aws-sdk/types": "3.667.0", + "@smithy/types": "^3.5.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.677.0.tgz", + "integrity": "sha512-gFhL0zVY/um0Eu2aWil82pjWaZL4yBmOnjz0+RDz18okFBHaz1Om8o/H+1Vvj+xsnuDYV4ezVMyAaXVtTcYOnw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.677.0", + "@aws-sdk/types": "3.667.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.537.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.537.0.tgz", - "integrity": "sha512-2QWMrbwd5eBy5KCYn9a15JEWBgrK2qFEKQN2lqb/6z0bhtevIOxIRfC99tzvRuPt6nixFQ+ynKuBjcfT4ZFrdQ==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/abort-controller": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.6.tgz", + "integrity": "sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.540.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.540.0.tgz", - "integrity": "sha512-8Rd6wPeXDnOYzWj1XCmOKcx/Q87L0K1/EHqOBocGjLVbN3gmRxBvpmR1pRTjf7IsWfnnzN5btqtcAkfDPYQUMQ==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/config-resolver": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.10.tgz", + "integrity": "sha512-Uh0Sz9gdUuz538nvkPiyv1DZRX9+D15EKDtnQP5rYVAzM/dnYk3P8cg73jcxyOitPgT3mE3OVj7ky7sibzHWkw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@aws-sdk/util-endpoints": "3.540.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/types": "^2.12.0", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/types": "^3.6.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.535.0.tgz", - "integrity": "sha512-IXOznDiaItBjsQy4Fil0kzX/J3HxIOknEphqHbOfUf+LpA5ugcsxuQQONrbEQusCBnfJyymrldBvBhFmtlU9Wg==", - "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/node-config-provider": "^2.3.0", - "@smithy/types": "^2.12.0", - "@smithy/util-config-provider": "^2.3.0", - "@smithy/util-middleware": "^2.2.0", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/core": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.1.tgz", + "integrity": "sha512-DujtuDA7BGEKExJ05W5OdxCoyekcKT3Rhg1ZGeiUWaz2BJIWXjZmsG/DIP4W48GHno7AQwRsaCb8NcBgH3QZpg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-stream": "^3.2.1", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.535.0.tgz", - "integrity": "sha512-tqCsEsEj8icW0SAh3NvyhRUq54Gz2pu4NM2tOSrFp7SO55heUUaRLSzYteNZCTOupH//AAaZvbN/UUTO/DrOog==", - "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.535.0", - "@aws-sdk/types": "3.535.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/signature-v4": "^2.2.0", - "@smithy/types": "^2.12.0", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/credential-provider-imds": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.5.tgz", + "integrity": "sha512-4FTQGAsuwqTzVMmiRVTn0RR9GrbRfkP0wfu/tXWVHd2LgNpTY0uglQpIScXK4NaEyXbB3JmZt8gfVqO50lP8wg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^3.1.9", + "@smithy/property-provider": "^3.1.8", + "@smithy/types": "^3.6.0", + "@smithy/url-parser": "^3.0.8", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.540.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.540.0.tgz", - "integrity": "sha512-9BvtiVEZe5Ev88Wa4ZIUbtT6BVcPwhxmVInQ6c12MYNb0WNL54BN6wLy/eknAfF05gpX2/NDU2pUDOyMPdm/+g==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.9.tgz", + "integrity": "sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso-oidc": "3.540.0", - "@aws-sdk/types": "3.535.0", - "@smithy/property-provider": "^2.2.0", - "@smithy/shared-ini-file-loader": "^2.4.0", - "@smithy/types": "^2.12.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", + "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/types": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.535.0.tgz", - "integrity": "sha512-aY4MYfduNj+sRR37U7XxYR8wemfbKP6lx00ze2M2uubn7mZotuVrWYAafbMSXrdEMSToE5JDhr28vArSOoLcSg==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/hash-node": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.8.tgz", + "integrity": "sha512-tlNQYbfpWXHimHqrvgo14DrMAgUBua/cNoz9fMYcDmYej7MAmUcjav/QKQbFc3NrcPxeJ7QClER4tWZmfwoPng==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.6.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.535.0.tgz", - "integrity": "sha512-smVo29nUPAOprp8Z5Y3GHuhiOtw6c8/EtLCm5AVMtRsTPw4V414ZXL2H66tzmb5kEeSzQlbfBSBEdIFZoxO9kg==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/hash-node/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.540.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.540.0.tgz", - "integrity": "sha512-1kMyQFAWx6f8alaI6UT65/5YW/7pDWAKAdNwL6vuJLea03KrZRX3PMoONOSJpAS5m3Ot7HlWZvf3wZDNTLELZw==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/invalid-dependency": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.8.tgz", + "integrity": "sha512-7Qynk6NWtTQhnGTTZwks++nJhQ1O54Mzi7fz4PqZOiYXb4Z1Flpb2yRvdALoggTS8xjtohWUM+RygOtB30YL3Q==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/types": "^2.12.0", - "@smithy/util-endpoints": "^1.2.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.535.0.tgz", - "integrity": "sha512-PHJ3SL6d2jpcgbqdgiPxkXpu7Drc2PYViwxSIqvvMKhDwzSB1W3mMvtpzwKM4IE7zLFodZo0GKjJ9AsoXndXhA==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.535.0.tgz", - "integrity": "sha512-RWMcF/xV5n+nhaA/Ff5P3yNP3Kur/I+VNZngog4TEs92oB/nwOdAg/2JL8bVAhUbMrjTjpwm7PItziYFQoqyig==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/middleware-content-length": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.10.tgz", + "integrity": "sha512-T4dIdCs1d/+/qMpwhJ1DzOhxCZjZHbHazEPJWdB4GDi2HjIZllVzeBEcdJUN0fomV8DURsgOyrbEUzg3vzTaOg==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/types": "^2.12.0", - "bowser": "^2.11.0", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.535.0.tgz", - "integrity": "sha512-dRek0zUuIT25wOWJlsRm97nTkUlh1NDcLsQZIN2Y8KxhwoXXWtJs5vaDPT+qAg+OpcNj80i1zLR/CirqlFg/TQ==", - "dependencies": { - "@aws-sdk/types": "3.535.0", - "@smithy/node-config-provider": "^2.3.0", - "@smithy/types": "^2.12.0", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/middleware-endpoint": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.1.tgz", + "integrity": "sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^2.5.1", + "@smithy/middleware-serde": "^3.0.8", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "@smithy/url-parser": "^3.0.8", + "@smithy/util-middleware": "^3.0.8", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/util-utf8-browser": { - "version": "3.259.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", - "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/middleware-retry": { + "version": "3.0.25", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.25.tgz", + "integrity": "sha512-m1F70cPaMBML4HiTgCw5I+jFNtjgz5z5UdGnUbG37vw6kh4UvizFYjqJGHvicfgKMkDL6mXwyPp5mhZg02g5sg==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.3.1" + "@smithy/node-config-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.5", + "@smithy/service-error-classification": "^3.0.8", + "@smithy/smithy-client": "^3.4.2", + "@smithy/types": "^3.6.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-retry": "^3.0.8", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/xml-builder": { - "version": "3.535.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.535.0.tgz", - "integrity": "sha512-VXAq/Jz8KIrU84+HqsOJhIKZqG0PNTdi6n6PFQ4xJf44ZQHD/5C7ouH4qCFX5XgZXcgbRIcMVVYGC6Jye0dRng==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/middleware-serde": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.8.tgz", + "integrity": "sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/middleware-stack": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.8.tgz", + "integrity": "sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==", + "license": "Apache-2.0", "dependencies": { - "@babel/highlight": "^7.24.2", - "picocolors": "^1.0.0" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", - "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", - "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/core": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", - "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/node-config-provider": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.9.tgz", + "integrity": "sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==", + "license": "Apache-2.0", "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.1", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.1", - "@babel/parser": "^7.24.1", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" + "@smithy/property-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "node": ">=16.0.0" } }, - "node_modules/@babel/generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", - "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", - "dependencies": { - "@babel/types": "^7.24.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/node-http-handler": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.5.tgz", + "integrity": "sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^3.1.6", + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/property-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.8.tgz", + "integrity": "sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==", + "license": "Apache-2.0", "dependencies": { - "@babel/types": "^7.22.5" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/protocol-http": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.5.tgz", + "integrity": "sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==", + "license": "Apache-2.0", "dependencies": { - "@babel/types": "^7.22.15" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/querystring-builder": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.8.tgz", + "integrity": "sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==", + "license": "Apache-2.0", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "@smithy/types": "^3.6.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz", - "integrity": "sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/querystring-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.8.tgz", + "integrity": "sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/service-error-classification": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.8.tgz", + "integrity": "sha512-uEC/kCCFto83bz5ZzapcrgGqHOh/0r69sZ2ZuHlgoD5kYgXJEThCoTuw/y1Ub3cE7aaKdznb+jD9xRPIfIwD7g==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" + "@smithy/types": "^3.6.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", - "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.9.tgz", + "integrity": "sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/signature-v4": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.1.tgz", + "integrity": "sha512-NsV1jF4EvmO5wqmaSzlnTVetemBS3FZHdyc5CExbDljcyJCEEkJr8ANu2JvtNbVg/9MvKAWV44kTrGS+Pi4INg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/smithy-client": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.2.tgz", + "integrity": "sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA==", + "license": "Apache-2.0", "dependencies": { - "@babel/types": "^7.22.5" + "@smithy/core": "^2.5.1", + "@smithy/middleware-endpoint": "^3.2.1", + "@smithy/middleware-stack": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-stream": "^3.2.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", "dependencies": { - "@babel/types": "^7.23.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/url-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.8.tgz", + "integrity": "sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==", + "license": "Apache-2.0", "dependencies": { - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" + "@smithy/querystring-parser": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-base64/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", "dependencies": { - "@babel/types": "^7.22.5" + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", - "engines": { - "node": ">=6.9.0" + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-body-length-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", + "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" } }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-body-length-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", + "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-config-provider": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", + "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-defaults-mode-browser": { + "version": "3.0.25", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.25.tgz", + "integrity": "sha512-fRw7zymjIDt6XxIsLwfJfYUfbGoO9CmCJk6rjJ/X5cd20+d2Is7xjU5Kt/AiDt6hX8DAf5dztmfP5O82gR9emA==", + "license": "Apache-2.0", "dependencies": { - "@babel/types": "^7.22.5" + "@smithy/property-provider": "^3.1.8", + "@smithy/smithy-client": "^3.4.2", + "@smithy/types": "^3.6.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">= 10.0.0" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-defaults-mode-node": { + "version": "3.0.25", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.25.tgz", + "integrity": "sha512-H3BSZdBDiVZGzt8TG51Pd2FvFO0PAx/A0mJ0EH8a13KJ6iUCdYnw/Dk/MdC1kTd0eUuUGisDFaxXVXo4HHFL1g==", + "license": "Apache-2.0", "dependencies": { - "@babel/types": "^7.22.5" + "@smithy/config-resolver": "^3.0.10", + "@smithy/credential-provider-imds": "^3.2.5", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/property-provider": "^3.1.8", + "@smithy/smithy-client": "^3.4.2", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">= 10.0.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-endpoints": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.4.tgz", + "integrity": "sha512-kPt8j4emm7rdMWQyL0F89o92q10gvCUa6sBkBtDJ7nV2+P7wpXczzOfoDJ49CKXe5CCqb8dc1W+ZdLlrKzSAnQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/types": "^7.22.5" + "@smithy/node-config-provider": "^3.1.9", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helpers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", - "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-middleware": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.8.tgz", + "integrity": "sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==", + "license": "Apache-2.0", "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-retry": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.8.tgz", + "integrity": "sha512-TCEhLnY581YJ+g1x0hapPz13JFqzmh/pMWL2KEFASC51qCfw3+Y47MrTmea4bUE5vsdxQ4F6/KFbUeSz22Q1ow==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@smithy/service-error-classification": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", - "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", - "bin": { - "parser": "bin/babel-parser.js" + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-stream": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.2.1.tgz", + "integrity": "sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^4.0.0", + "@smithy/node-http-handler": "^3.2.5", + "@smithy/types": "^3.6.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-stream/node_modules/@smithy/fetch-http-handler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.0.0.tgz", + "integrity": "sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-stream/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", - "dev": true, + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz", - "integrity": "sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA==", - "dev": true, + "node_modules/@aws-sdk/client-s3/node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-decorators": "^7.24.1" - }, - "engines": { - "node": ">=6.9.0" + "strnum": "^1.0.5" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bin": { + "fxparser": "src/cli/cli.js" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", - "dev": true, + "node_modules/@aws-sdk/client-sso": { + "version": "3.540.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.540.0.tgz", + "integrity": "sha512-rrQZMuw4sxIo3eyAUUzPQRA336mPRnrAeSlSdVHBKZD8Fjvoy0lYry2vNhkPLpFZLso1J66KRyuIv4LzRR3v1Q==", + "optional": true, "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.535.0", + "@aws-sdk/middleware-host-header": "3.535.0", + "@aws-sdk/middleware-logger": "3.535.0", + "@aws-sdk/middleware-recursion-detection": "3.535.0", + "@aws-sdk/middleware-user-agent": "3.540.0", + "@aws-sdk/region-config-resolver": "3.535.0", + "@aws-sdk/types": "3.535.0", + "@aws-sdk/util-endpoints": "3.540.0", + "@aws-sdk/util-user-agent-browser": "3.535.0", + "@aws-sdk/util-user-agent-node": "3.535.0", + "@smithy/config-resolver": "^2.2.0", + "@smithy/core": "^1.4.0", + "@smithy/fetch-http-handler": "^2.5.0", + "@smithy/hash-node": "^2.2.0", + "@smithy/invalid-dependency": "^2.2.0", + "@smithy/middleware-content-length": "^2.2.0", + "@smithy/middleware-endpoint": "^2.5.0", + "@smithy/middleware-retry": "^2.2.0", + "@smithy/middleware-serde": "^2.3.0", + "@smithy/middleware-stack": "^2.2.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/node-http-handler": "^2.5.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/url-parser": "^2.2.0", + "@smithy/util-base64": "^2.3.0", + "@smithy/util-body-length-browser": "^2.2.0", + "@smithy/util-body-length-node": "^2.3.0", + "@smithy/util-defaults-mode-browser": "^2.2.0", + "@smithy/util-defaults-mode-node": "^2.3.0", + "@smithy/util-endpoints": "^1.2.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-retry": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=14.0.0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.540.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.540.0.tgz", + "integrity": "sha512-LZYK0lBRQK8D8M3Sqc96XiXkAV2v70zhTtF6weyzEpgwxZMfSuFJjs0jFyhaeZBZbZv7BBghIdhJ5TPavNxGMQ==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.540.0", + "@aws-sdk/core": "3.535.0", + "@aws-sdk/middleware-host-header": "3.535.0", + "@aws-sdk/middleware-logger": "3.535.0", + "@aws-sdk/middleware-recursion-detection": "3.535.0", + "@aws-sdk/middleware-user-agent": "3.540.0", + "@aws-sdk/region-config-resolver": "3.535.0", + "@aws-sdk/types": "3.535.0", + "@aws-sdk/util-endpoints": "3.540.0", + "@aws-sdk/util-user-agent-browser": "3.535.0", + "@aws-sdk/util-user-agent-node": "3.535.0", + "@smithy/config-resolver": "^2.2.0", + "@smithy/core": "^1.4.0", + "@smithy/fetch-http-handler": "^2.5.0", + "@smithy/hash-node": "^2.2.0", + "@smithy/invalid-dependency": "^2.2.0", + "@smithy/middleware-content-length": "^2.2.0", + "@smithy/middleware-endpoint": "^2.5.0", + "@smithy/middleware-retry": "^2.2.0", + "@smithy/middleware-serde": "^2.3.0", + "@smithy/middleware-stack": "^2.2.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/node-http-handler": "^2.5.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/url-parser": "^2.2.0", + "@smithy/util-base64": "^2.3.0", + "@smithy/util-body-length-browser": "^2.2.0", + "@smithy/util-body-length-node": "^2.3.0", + "@smithy/util-defaults-mode-browser": "^2.2.0", + "@smithy/util-defaults-mode-node": "^2.3.0", + "@smithy/util-endpoints": "^1.2.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-retry": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@aws-sdk/credential-provider-node": "^3.540.0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@aws-sdk/client-sts": { + "version": "3.540.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.540.0.tgz", + "integrity": "sha512-ITHUQxvpqfQX6obfpIi3KYGzZYfe/I5Ixjfxoi5lB7ISCtmxqObKB1fzD93wonkMJytJ7LUO8panZl/ojiJ1uw==", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.535.0", + "@aws-sdk/middleware-host-header": "3.535.0", + "@aws-sdk/middleware-logger": "3.535.0", + "@aws-sdk/middleware-recursion-detection": "3.535.0", + "@aws-sdk/middleware-user-agent": "3.540.0", + "@aws-sdk/region-config-resolver": "3.535.0", + "@aws-sdk/types": "3.535.0", + "@aws-sdk/util-endpoints": "3.540.0", + "@aws-sdk/util-user-agent-browser": "3.535.0", + "@aws-sdk/util-user-agent-node": "3.535.0", + "@smithy/config-resolver": "^2.2.0", + "@smithy/core": "^1.4.0", + "@smithy/fetch-http-handler": "^2.5.0", + "@smithy/hash-node": "^2.2.0", + "@smithy/invalid-dependency": "^2.2.0", + "@smithy/middleware-content-length": "^2.2.0", + "@smithy/middleware-endpoint": "^2.5.0", + "@smithy/middleware-retry": "^2.2.0", + "@smithy/middleware-serde": "^2.3.0", + "@smithy/middleware-stack": "^2.2.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/node-http-handler": "^2.5.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/url-parser": "^2.2.0", + "@smithy/util-base64": "^2.3.0", + "@smithy/util-body-length-browser": "^2.2.0", + "@smithy/util-body-length-node": "^2.3.0", + "@smithy/util-defaults-mode-browser": "^2.2.0", + "@smithy/util-defaults-mode-node": "^2.3.0", + "@smithy/util-endpoints": "^1.2.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-retry": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@aws-sdk/credential-provider-node": "^3.540.0" } }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "devOptional": true, + "node_modules/@aws-sdk/core": { + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.535.0.tgz", + "integrity": "sha512-+Yusa9HziuaEDta1UaLEtMAtmgvxdxhPn7jgfRY6PplqAqgsfa5FR83sxy5qr2q7xjQTwHtV4MjQVuOjG9JsLw==", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@smithy/core": "^1.4.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/signature-v4": "^2.2.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.540.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.540.0.tgz", + "integrity": "sha512-XOTAIuVgticX+43GMpRbi5OHmJAhHfoHYsVGu0eRLhri1yFqUHXJgHUd51QQtlA8cFQN7JnFFM6sF5EDCPF49g==", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@aws-sdk/client-cognito-identity": "3.540.0", + "@aws-sdk/types": "3.535.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.535.0.tgz", + "integrity": "sha512-XppwO8c0GCGSAvdzyJOhbtktSEaShg14VJKg8mpMa1XcgqzmcqqHQjtDWbx5rZheY1VdpXZhpEzJkB6LpQejpA==", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@aws-sdk/types": "3.535.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=14.0.0" } }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.1.tgz", - "integrity": "sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw==", - "dev": true, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.535.0.tgz", + "integrity": "sha512-kdj1wCmOMZ29jSlUskRqN04S6fJ4dvt0Nq9Z32SA6wO7UG8ht6Ot9h/au/eTWJM3E1somZ7D771oK7dQt9b8yw==", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@aws-sdk/types": "3.535.0", + "@smithy/fetch-http-handler": "^2.5.0", + "@smithy/node-http-handler": "^2.5.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/util-stream": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=14.0.0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.540.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.540.0.tgz", + "integrity": "sha512-igN/RbsnulIBwqXbwsWmR3srqmtbPF1dm+JteGvUY31FW65fTVvWvSr945Y/cf1UbhPmIQXntlsqESqpkhTHwg==", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@aws-sdk/client-sts": "3.540.0", + "@aws-sdk/credential-provider-env": "3.535.0", + "@aws-sdk/credential-provider-process": "3.535.0", + "@aws-sdk/credential-provider-sso": "3.540.0", + "@aws-sdk/credential-provider-web-identity": "3.540.0", + "@aws-sdk/types": "3.535.0", + "@smithy/credential-provider-imds": "^2.3.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/shared-ini-file-loader": "^2.4.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.540.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.540.0.tgz", + "integrity": "sha512-HKQZJbLHlrHX9A0B1poiYNXIIQfy8whTjuosTCYKPDBhhUyVAQfxy/KG726j0v43IhaNPLgTGZCJve4hAsazSw==", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" + "@aws-sdk/credential-provider-env": "3.535.0", + "@aws-sdk/credential-provider-http": "3.535.0", + "@aws-sdk/credential-provider-ini": "3.540.0", + "@aws-sdk/credential-provider-process": "3.535.0", + "@aws-sdk/credential-provider-sso": "3.540.0", + "@aws-sdk/credential-provider-web-identity": "3.540.0", + "@aws-sdk/types": "3.535.0", + "@smithy/credential-provider-imds": "^2.3.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/shared-ini-file-loader": "^2.4.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.1.tgz", - "integrity": "sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==", - "dev": true, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.535.0.tgz", + "integrity": "sha512-9O1OaprGCnlb/kYl8RwmH7Mlg8JREZctB8r9sa1KhSsWFq/SWO0AuJTyowxD7zL5PkeS4eTvzFFHWCa3OO5epA==", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@aws-sdk/types": "3.535.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/shared-ini-file-loader": "^2.4.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=14.0.0" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.540.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.540.0.tgz", + "integrity": "sha512-tKkFqK227LF5ajc5EL6asXS32p3nkofpP8G7NRpU7zOEOQCg01KUc4JRX+ItI0T007CiN1J19yNoFqHLT/SqHg==", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@aws-sdk/client-sso": "3.540.0", + "@aws-sdk/token-providers": "3.540.0", + "@aws-sdk/types": "3.535.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/shared-ini-file-loader": "^2.4.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=14.0.0" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.540.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.540.0.tgz", + "integrity": "sha512-OpDm9w3A168B44hSjpnvECP4rvnFzD86rN4VYdGADuCvEa5uEcdA/JuT5WclFPDqdWEmFBqS1pxBIJBf0g2Q9Q==", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@aws-sdk/client-sts": "3.540.0", + "@aws-sdk/types": "3.535.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=14.0.0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@aws-sdk/credential-providers": { + "version": "3.540.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.540.0.tgz", + "integrity": "sha512-tAmvqdZngCrER5/AAwTmDSjO05LGIshKL+lwcJr2OUV5jtQVzfbFrorf+b5dnI+3i8+zGcEAV9omra4XGrO9Kg==", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@aws-sdk/client-cognito-identity": "3.540.0", + "@aws-sdk/client-sso": "3.540.0", + "@aws-sdk/client-sts": "3.540.0", + "@aws-sdk/credential-provider-cognito-identity": "3.540.0", + "@aws-sdk/credential-provider-env": "3.535.0", + "@aws-sdk/credential-provider-http": "3.535.0", + "@aws-sdk/credential-provider-ini": "3.540.0", + "@aws-sdk/credential-provider-node": "3.540.0", + "@aws-sdk/credential-provider-process": "3.535.0", + "@aws-sdk/credential-provider-sso": "3.540.0", + "@aws-sdk/credential-provider-web-identity": "3.540.0", + "@aws-sdk/types": "3.535.0", + "@smithy/credential-provider-imds": "^2.3.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/@aws-sdk/lib-storage": { + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.677.0.tgz", + "integrity": "sha512-MbN3WF/CiWWGGUnb2kcEJU8jNDK8bSupQCtrJkyfa0/TIh8nQjUzmgMo44LBaC+a4EvVHzqetl+Wme5AhNU60w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^3.1.5", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/smithy-client": "^3.4.0", + "buffer": "5.6.0", + "events": "3.3.0", + "stream-browserify": "3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@aws-sdk/client-s3": "^3.677.0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/abort-controller": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.6.tgz", + "integrity": "sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/core": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.1.tgz", + "integrity": "sha512-DujtuDA7BGEKExJ05W5OdxCoyekcKT3Rhg1ZGeiUWaz2BJIWXjZmsG/DIP4W48GHno7AQwRsaCb8NcBgH3QZpg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-stream": "^3.2.1", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/fetch-http-handler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.0.0.tgz", + "integrity": "sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/middleware-endpoint": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.1.tgz", + "integrity": "sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^2.5.1", + "@smithy/middleware-serde": "^3.0.8", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "@smithy/url-parser": "^3.0.8", + "@smithy/util-middleware": "^3.0.8", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/middleware-serde": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.8.tgz", + "integrity": "sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/middleware-stack": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.8.tgz", + "integrity": "sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/node-config-provider": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.9.tgz", + "integrity": "sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@smithy/property-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/node-http-handler": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.5.tgz", + "integrity": "sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^3.1.6", + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/property-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.8.tgz", + "integrity": "sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/protocol-http": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.5.tgz", + "integrity": "sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/querystring-builder": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.8.tgz", + "integrity": "sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/types": "^3.6.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/querystring-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.8.tgz", + "integrity": "sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.9.tgz", + "integrity": "sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/smithy-client": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.2.tgz", + "integrity": "sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@smithy/core": "^2.5.1", + "@smithy/middleware-endpoint": "^3.2.1", + "@smithy/middleware-stack": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-stream": "^3.2.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/url-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.8.tgz", + "integrity": "sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@smithy/querystring-parser": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz", - "integrity": "sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/util-body-length-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", + "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "tslib": "^2.6.2" } }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz", - "integrity": "sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/util-middleware": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.8.tgz", + "integrity": "sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/util-stream": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.2.1.tgz", + "integrity": "sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^4.0.0", + "@smithy/node-http-handler": "^3.2.5", + "@smithy/types": "^3.6.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "node_modules/@aws-sdk/lib-storage/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.667.0.tgz", + "integrity": "sha512-XGz4jMAkDoTyFdtLz7ZF+C05IAhCTC1PllpvTBaj821z/L0ilhbqVhrT/f2Buw8Id/K5A390csGXgusXyrFFjA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.667.0", + "@aws-sdk/util-arn-parser": "3.568.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "@smithy/util-config-provider": "^3.0.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/@smithy/node-config-provider": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.9.tgz", + "integrity": "sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/property-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/@smithy/property-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.8.tgz", + "integrity": "sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.1.tgz", - "integrity": "sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==", - "dev": true, + "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/@smithy/protocol-http": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.5.tgz", + "integrity": "sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-flow": "^7.24.1" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.9.tgz", + "integrity": "sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/@smithy/util-config-provider": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", + "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.667.0.tgz", + "integrity": "sha512-0TiSL9S5DSG95NHGIz6qTMuV7GDKVn8tvvGSrSSZu/wXO3JaYSH0AElVpYfc4PtPRqVpEyNA7nnc7W56mMCLWQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.667.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "node_modules/@aws-sdk/middleware-expect-continue/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "node_modules/@aws-sdk/middleware-expect-continue/node_modules/@smithy/protocol-http": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.5.tgz", + "integrity": "sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "node_modules/@aws-sdk/middleware-expect-continue/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.677.0.tgz", + "integrity": "sha512-mTv3zRH+3/hW8hY0K855UrBmzW4pLb7n8MjlyL2dR8+wfXXw6DsSxGmEb4Jq13OjLTwSxyZs00JdpKtzgiIieA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-sdk/core": "3.677.0", + "@aws-sdk/types": "3.667.0", + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-sdk/core": { + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.677.0.tgz", + "integrity": "sha512-5auvc1wmXmd7u9Y9nM95Ia+VX7J2FiZLuADitHqE4mHPH9riDgOY+uK/yM+UKr+lfq4zKiZQG7i8cfabZlCY8g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.667.0", + "@smithy/core": "^2.4.8", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/property-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/signature-v4": "^4.2.0", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-middleware": "^3.0.7", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/abort-controller": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.6.tgz", + "integrity": "sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/core": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.1.tgz", + "integrity": "sha512-DujtuDA7BGEKExJ05W5OdxCoyekcKT3Rhg1ZGeiUWaz2BJIWXjZmsG/DIP4W48GHno7AQwRsaCb8NcBgH3QZpg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-stream": "^3.2.1", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/fetch-http-handler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.0.0.tgz", + "integrity": "sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/middleware-endpoint": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.1.tgz", + "integrity": "sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^2.5.1", + "@smithy/middleware-serde": "^3.0.8", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "@smithy/url-parser": "^3.0.8", + "@smithy/util-middleware": "^3.0.8", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/middleware-serde": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.8.tgz", + "integrity": "sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/middleware-stack": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.8.tgz", + "integrity": "sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/node-config-provider": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.9.tgz", + "integrity": "sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@smithy/property-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/node-http-handler": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.5.tgz", + "integrity": "sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^3.1.6", + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/property-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.8.tgz", + "integrity": "sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/protocol-http": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.5.tgz", + "integrity": "sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/querystring-builder": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.8.tgz", + "integrity": "sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@smithy/types": "^3.6.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/querystring-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.8.tgz", + "integrity": "sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.9.tgz", + "integrity": "sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/signature-v4": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.1.tgz", + "integrity": "sha512-NsV1jF4EvmO5wqmaSzlnTVetemBS3FZHdyc5CExbDljcyJCEEkJr8ANu2JvtNbVg/9MvKAWV44kTrGS+Pi4INg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/smithy-client": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.2.tgz", + "integrity": "sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/core": "^2.5.1", + "@smithy/middleware-endpoint": "^3.2.1", + "@smithy/middleware-stack": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-stream": "^3.2.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/url-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.8.tgz", + "integrity": "sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/querystring-parser": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.1.tgz", - "integrity": "sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-base64/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", - "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-body-length-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", + "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-middleware": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.8.tgz", + "integrity": "sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-stream": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.2.1.tgz", + "integrity": "sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^4.0.0", + "@smithy/node-http-handler": "^3.2.5", + "@smithy/types": "^3.6.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-stream/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.5" + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz", - "integrity": "sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==", - "dev": true, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz", - "integrity": "sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==", - "dev": true, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", - "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^1.0.5" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bin": { + "fxparser": "src/cli/cli.js" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.535.0.tgz", + "integrity": "sha512-0h6TWjBWtDaYwHMQJI9ulafeS4lLaw1vIxRjbpH0svFRt6Eve+Sy8NlVhECfTU2hNz/fLubvrUxsXoThaLBIew==", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "regenerator-transform": "^0.15.2" + "@aws-sdk/types": "3.535.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=14.0.0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.667.0.tgz", + "integrity": "sha512-ob85H3HhT3/u5O+x0o557xGZ78vSNeSSwMaSitxdsfs2hOuoUl1uk+OeLpi1hkuJnL41FPpokV7TVII2XrFfmg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@aws-sdk/types": "3.667.0", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", - "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", + "node_modules/@aws-sdk/middleware-location-constraint/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-plugin-utils": "^7.24.0", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.1", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "semver": "^6.3.1" + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "node_modules/@aws-sdk/middleware-location-constraint/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.535.0.tgz", + "integrity": "sha512-huNHpONOrEDrdRTvSQr1cJiRMNf0S52NDXtaPzdxiubTkP+vni2MohmZANMOai/qT0olmEVX01LhZ0ZAOgmg6A==", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@aws-sdk/types": "3.535.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=14.0.0" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.535.0.tgz", + "integrity": "sha512-am2qgGs+gwqmR4wHLWpzlZ8PWhm4ktj5bYSgDrsOfjhdBlWNxvPoID9/pDAz5RWL48+oH7I6SQzMqxXsFDikrw==", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@aws-sdk/types": "3.535.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.677.0.tgz", + "integrity": "sha512-3U8FHgWuxhAl97HMdaFs/SJlhpb5+i//FHv0JWYm2oAPZflIRFeJn1bgVtD7ka1NY2iJjpnqX8hHJPS547MnFQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.677.0", + "@aws-sdk/types": "3.667.0", + "@aws-sdk/util-arn-parser": "3.568.0", + "@smithy/core": "^2.4.8", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/signature-v4": "^4.2.0", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-stream": "^3.1.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/core": { + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.677.0.tgz", + "integrity": "sha512-5auvc1wmXmd7u9Y9nM95Ia+VX7J2FiZLuADitHqE4mHPH9riDgOY+uK/yM+UKr+lfq4zKiZQG7i8cfabZlCY8g==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@aws-sdk/types": "3.667.0", + "@smithy/core": "^2.4.8", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/property-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/signature-v4": "^4.2.0", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-middleware": "^3.0.7", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.1.tgz", - "integrity": "sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w==", + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/abort-controller": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.6.tgz", + "integrity": "sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-typescript": "^7.24.1" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/core": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.1.tgz", + "integrity": "sha512-DujtuDA7BGEKExJ05W5OdxCoyekcKT3Rhg1ZGeiUWaz2BJIWXjZmsG/DIP4W48GHno7AQwRsaCb8NcBgH3QZpg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-stream": "^3.2.1", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/fetch-http-handler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.0.0.tgz", + "integrity": "sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/middleware-endpoint": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.1.tgz", + "integrity": "sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^2.5.1", + "@smithy/middleware-serde": "^3.0.8", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "@smithy/url-parser": "^3.0.8", + "@smithy/util-middleware": "^3.0.8", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/middleware-serde": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.8.tgz", + "integrity": "sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/middleware-stack": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.8.tgz", + "integrity": "sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/node-config-provider": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.9.tgz", + "integrity": "sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@smithy/property-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/node-http-handler": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.5.tgz", + "integrity": "sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^3.1.6", + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/preset-env": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.3.tgz", - "integrity": "sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==", + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/property-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.8.tgz", + "integrity": "sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==", + "license": "Apache-2.0", "dependencies": { - "@babel/compat-data": "^7.24.1", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.1", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.1", - "@babel/plugin-transform-classes": "^7.24.1", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/preset-flow": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.1.tgz", - "integrity": "sha512-sWCV2G9pcqZf+JHyv/RyqEIpFypxdCSxWIxQjpdaQxenNog7cN1pr76hg8u0Fz8Qgg0H4ETkGcJnXL8d4j0PPA==", - "dev": true, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/protocol-http": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.5.tgz", + "integrity": "sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-transform-flow-strip-types": "^7.24.1" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/querystring-builder": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.8.tgz", + "integrity": "sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "@smithy/types": "^3.6.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/preset-react": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", - "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/querystring-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.8.tgz", + "integrity": "sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-transform-react-display-name": "^7.24.1", - "@babel/plugin-transform-react-jsx": "^7.23.4", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.24.1" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=16.0.0" } }, - "node_modules/@babel/preset-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", - "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.9.tgz", + "integrity": "sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-syntax-jsx": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-typescript": "^7.24.1" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/signature-v4": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.1.tgz", + "integrity": "sha512-NsV1jF4EvmO5wqmaSzlnTVetemBS3FZHdyc5CExbDljcyJCEEkJr8ANu2JvtNbVg/9MvKAWV44kTrGS+Pi4INg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/register": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.23.7.tgz", - "integrity": "sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==", - "dev": true, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/smithy-client": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.2.tgz", + "integrity": "sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA==", + "license": "Apache-2.0", "dependencies": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.6", - "source-map-support": "^0.5.16" + "@smithy/core": "^2.5.1", + "@smithy/middleware-endpoint": "^3.2.1", + "@smithy/middleware-stack": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-stream": "^3.2.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/register/node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/url-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.8.tgz", + "integrity": "sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==", + "license": "Apache-2.0", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "@smithy/querystring-parser": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6" + "node": ">=16.0.0" } }, - "node_modules/@babel/register/node_modules/find-up": { + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-body-length-browser": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", + "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", + "license": "Apache-2.0", "dependencies": { - "locate-path": "^3.0.0" + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6" + "node": ">=16.0.0" } }, - "node_modules/@babel/register/node_modules/locate-path": { + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-config-provider": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", + "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", + "license": "Apache-2.0", "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6" + "node": ">=16.0.0" } }, - "node_modules/@babel/register/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "license": "Apache-2.0", "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6" + "node": ">=16.0.0" } }, - "node_modules/@babel/register/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-middleware": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.8.tgz", + "integrity": "sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==", + "license": "Apache-2.0", "dependencies": { - "p-try": "^2.0.0" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-stream": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.2.1.tgz", + "integrity": "sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^4.0.0", + "@smithy/node-http-handler": "^3.2.5", + "@smithy/types": "^3.6.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/register/node_modules/p-locate": { + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-uri-escape": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "license": "Apache-2.0", "dependencies": { - "p-limit": "^2.0.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6" + "node": ">=16.0.0" } }, - "node_modules/@babel/register/node_modules/path-exists": { + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-utf8": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=4" + "node": ">=16.0.0" } }, - "node_modules/@babel/register/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" } }, - "node_modules/@babel/register/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.667.0.tgz", + "integrity": "sha512-1wuAUZIkmZIvOmGg5qNQU821CGFHhkuKioxXgNh0DpUxZ9+AeiV7yorJr+bqkb2KBFv1i1TnzGRecvKf/KvZIQ==", + "license": "Apache-2.0", "dependencies": { - "find-up": "^3.0.0" + "@aws-sdk/types": "3.667.0", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6" + "node": ">=16.0.0" } }, - "node_modules/@babel/register/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node_modules/@aws-sdk/middleware-ssec/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + "node_modules/@aws-sdk/middleware-ssec/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } }, - "node_modules/@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.540.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.540.0.tgz", + "integrity": "sha512-8Rd6wPeXDnOYzWj1XCmOKcx/Q87L0K1/EHqOBocGjLVbN3gmRxBvpmR1pRTjf7IsWfnnzN5btqtcAkfDPYQUMQ==", + "optional": true, "dependencies": { - "regenerator-runtime": "^0.14.0" + "@aws-sdk/types": "3.535.0", + "@aws-sdk/util-endpoints": "3.540.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.1.tgz", - "integrity": "sha512-T9ko/35G+Bkl+win48GduaPlhSlOjjE5s1TeiEcD+QpxlLQnoEfb/nO/T+TQqkm+ipFwORn+rB8w14iJ/uD0bg==", + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.535.0.tgz", + "integrity": "sha512-IXOznDiaItBjsQy4Fil0kzX/J3HxIOknEphqHbOfUf+LpA5ugcsxuQQONrbEQusCBnfJyymrldBvBhFmtlU9Wg==", + "optional": true, "dependencies": { - "core-js-pure": "^3.30.2", - "regenerator-runtime": "^0.14.0" + "@aws-sdk/types": "3.535.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/types": "^2.12.0", + "@smithy/util-config-provider": "^2.3.0", + "@smithy/util-middleware": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "node_modules/@aws-sdk/s3-request-presigner": { + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.677.0.tgz", + "integrity": "sha512-oudJgBX8FPFWiDt/jQ1fW+sJ+XHRMsQ2XXV1aAMCBNsopTBIfn4N8tAymLI3AVJl4UAsxToUITJb5k4NAx2UTw==", + "license": "Apache-2.0", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@aws-sdk/signature-v4-multi-region": "3.677.0", + "@aws-sdk/types": "3.667.0", + "@aws-sdk/util-format-url": "3.667.0", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/abort-controller": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.6.tgz", + "integrity": "sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@base2/pretty-print-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz", - "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==", - "dev": true + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/core": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.1.tgz", + "integrity": "sha512-DujtuDA7BGEKExJ05W5OdxCoyekcKT3Rhg1ZGeiUWaz2BJIWXjZmsG/DIP4W48GHno7AQwRsaCb8NcBgH3QZpg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-stream": "^3.2.1", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "devOptional": true + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/fetch-http-handler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.0.0.tgz", + "integrity": "sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } }, - "node_modules/@braintree/sanitize-url": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz", - "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==", - "dev": true + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } }, - "node_modules/@bull-board/api": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@bull-board/api/-/api-4.12.2.tgz", - "integrity": "sha512-efF8K1pvfEEft2ELQwCBe/a225vHufCjM2hfcyvmIG/SUX6TlKQFUFZ1+KV0wenD9wxvUVb5wxUu6on+HrZiVg==", + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/middleware-endpoint": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.1.tgz", + "integrity": "sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^2.5.1", + "@smithy/middleware-serde": "^3.0.8", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "@smithy/url-parser": "^3.0.8", + "@smithy/util-middleware": "^3.0.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/middleware-serde": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.8.tgz", + "integrity": "sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==", + "license": "Apache-2.0", "dependencies": { - "redis-info": "^3.0.8" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@bull-board/express": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@bull-board/express/-/express-4.12.2.tgz", - "integrity": "sha512-Y/pzCtQoxvLyioiNYLKKgxslccV+7dyTy4qCGAXyUbAuOaav+U4tbfWNcZYaMSkr/1gg0m/6S/qf+xn2vAsDkQ==", + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/middleware-stack": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.8.tgz", + "integrity": "sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==", + "license": "Apache-2.0", "dependencies": { - "@bull-board/api": "4.12.2", - "@bull-board/ui": "4.12.2", - "ejs": "3.1.7", - "express": "4.17.3" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@bull-board/express/node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/node-config-provider": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.9.tgz", + "integrity": "sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==", + "license": "Apache-2.0", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "@smithy/property-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 0.8" + "node": ">=16.0.0" } }, - "node_modules/@bull-board/express/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/node-http-handler": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.5.tgz", + "integrity": "sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^3.1.6", + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 0.8" + "node": ">=16.0.0" } }, - "node_modules/@bull-board/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/property-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.8.tgz", + "integrity": "sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==", + "license": "Apache-2.0", "dependencies": { - "ms": "2.0.0" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@bull-board/express/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/protocol-http": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.5.tgz", + "integrity": "sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } }, - "node_modules/@bull-board/express/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/querystring-builder": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.8.tgz", + "integrity": "sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 0.6" + "node": ">=16.0.0" } }, - "node_modules/@bull-board/express/node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/querystring-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.8.tgz", + "integrity": "sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } }, - "node_modules/@bull-board/express/node_modules/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.9.tgz", + "integrity": "sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==", + "license": "Apache-2.0", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.19.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.4.2", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.9.7", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", - "setprototypeof": "1.2.0", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 0.10.0" + "node": ">=16.0.0" } }, - "node_modules/@bull-board/express/node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/smithy-client": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.2.tgz", + "integrity": "sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA==", + "license": "Apache-2.0", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" + "@smithy/core": "^2.5.1", + "@smithy/middleware-endpoint": "^3.2.1", + "@smithy/middleware-stack": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-stream": "^3.2.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 0.8" + "node": ">=16.0.0" } }, - "node_modules/@bull-board/express/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" + "tslib": "^2.6.2" }, "engines": { - "node": ">= 0.6" + "node": ">=16.0.0" } }, - "node_modules/@bull-board/express/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/url-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.8.tgz", + "integrity": "sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==", + "license": "Apache-2.0", "dependencies": { - "ee-first": "1.1.1" + "@smithy/querystring-parser": "^3.0.8", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 0.8" + "node": ">=16.0.0" } }, - "node_modules/@bull-board/express/node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/util-body-length-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", + "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=0.6" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@bull-board/express/node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/util-middleware": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.8.tgz", + "integrity": "sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==", + "license": "Apache-2.0", "dependencies": { - "bytes": "3.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 0.8" + "node": ">=16.0.0" } }, - "node_modules/@bull-board/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/util-stream": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.2.1.tgz", + "integrity": "sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^4.0.0", + "@smithy/node-http-handler": "^3.2.5", + "@smithy/types": "^3.6.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } }, - "node_modules/@bull-board/express/node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "license": "Apache-2.0", "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "1.8.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">= 0.8.0" + "node": ">=16.0.0" } }, - "node_modules/@bull-board/express/node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "license": "Apache-2.0", "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.2" + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 0.8.0" + "node": ">=16.0.0" } }, - "node_modules/@bull-board/express/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.677.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.677.0.tgz", + "integrity": "sha512-VJvYwPnyPMBbvKDAO58t90/y2AtdRp4epax6QR0XScZEBuS777gQ3wJb1JyHLeEAEolKj/dd6jV5Iq+/lsZIIQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.677.0", + "@aws-sdk/types": "3.667.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/signature-v4": "^4.2.0", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 0.6" + "node": ">=16.0.0" } }, - "node_modules/@bull-board/ui": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@bull-board/ui/-/ui-4.12.2.tgz", - "integrity": "sha512-jB/OOEhg+DUL6ssmtQYTK+iYd3iy68bbozOp+q2xVUC4V7zeFmYF25sIApYFTNfbjuUMesAVOiX4u0gNEo/J7w==", + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", "dependencies": { - "@bull-board/api": "4.12.2" + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@codegouvfr/react-dsfr": { - "version": "1.13.8", - "resolved": "https://registry.npmjs.org/@codegouvfr/react-dsfr/-/react-dsfr-1.13.8.tgz", - "integrity": "sha512-shZxu0T2czxMRzgzbpyJLqVWZQHqO+8KPdhxYH3Btph+hvBzZD0vE0XChghmIwVd7m71qHkWk0ji1/74iVTxRQ==", + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "license": "Apache-2.0", "dependencies": { - "tsafe": "^1.7.2", - "yargs-parser": "^21.1.1" - }, - "bin": { - "copy-dsfr-to-public": "bin/copy-dsfr-to-public.js", - "only-include-used-icons": "bin/only-include-used-icons.js", - "react-dsfr": "bin/react-dsfr.js" + "tslib": "^2.6.2" }, - "peerDependencies": { - "@gouvfr/dsfr-chart": "^1.0.0" + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@smithy/protocol-http": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.5.tgz", + "integrity": "sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, - "peerDependenciesMeta": { - "@gouvfr/dsfr-chart": { - "optional": true - } + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "optional": true, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@smithy/signature-v4": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.1.tgz", + "integrity": "sha512-NsV1jF4EvmO5wqmaSzlnTVetemBS3FZHdyc5CExbDljcyJCEEkJr8ANu2JvtNbVg/9MvKAWV44kTrGS+Pi4INg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=0.1.90" + "node": ">=16.0.0" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "tslib": "^2.6.2" }, "engines": { - "node": ">=12" + "node": ">=16.0.0" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "license": "Apache-2.0", "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@smithy/util-middleware": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.8.tgz", + "integrity": "sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=10.0.0" + "node": ">=16.0.0" } }, - "node_modules/@docsearch/css": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.1.tgz", - "integrity": "sha512-VtVb5DS+0hRIprU2CO6ZQjK2Zg4QU5HrDM1+ix6rT0umsYvFvatMAnf97NHZlVWDaaLlx7GRfR/7FikANiM2Fg==" - }, - "node_modules/@docsearch/react": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.1.tgz", - "integrity": "sha512-qXZkEPvybVhSXj0K7U3bXc233tk5e8PfhoZ6MhPOiik/qUQxYC+Dn9DnoS7CxHQQhHfCvTiN0eY9M12oRghEXw==", + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "license": "Apache-2.0", "dependencies": { - "@algolia/autocomplete-core": "1.9.3", - "@algolia/autocomplete-preset-algolia": "1.9.3", - "@docsearch/css": "3.6.1", - "algoliasearch": "^4.19.1" + "tslib": "^2.6.2" }, - "peerDependencies": { - "@types/react": ">= 16.8.0 < 19.0.0", - "react": ">= 16.8.0 < 19.0.0", - "react-dom": ">= 16.8.0 < 19.0.0", - "search-insights": ">= 1 < 3" + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "search-insights": { - "optional": true - } + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@docusaurus/core": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.5.2.tgz", - "integrity": "sha512-4Z1WkhCSkX4KO0Fw5m/Vuc7Q3NxBG53NE5u59Rs96fWkMPZVSrzEPP16/Nk6cWb/shK7xXPndTmalJtw7twL/w==", + "node_modules/@aws-sdk/token-providers": { + "version": "3.540.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.540.0.tgz", + "integrity": "sha512-9BvtiVEZe5Ev88Wa4ZIUbtT6BVcPwhxmVInQ6c12MYNb0WNL54BN6wLy/eknAfF05gpX2/NDU2pUDOyMPdm/+g==", + "optional": true, "dependencies": { - "@babel/core": "^7.23.3", - "@babel/generator": "^7.23.3", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.22.9", - "@babel/preset-env": "^7.22.9", - "@babel/preset-react": "^7.22.5", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@babel/runtime-corejs3": "^7.22.6", - "@babel/traverse": "^7.22.8", - "@docusaurus/cssnano-preset": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "autoprefixer": "^10.4.14", - "babel-loader": "^9.1.3", - "babel-plugin-dynamic-import-node": "^2.3.3", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "clean-css": "^5.3.2", - "cli-table3": "^0.6.3", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", - "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.31.1", - "css-loader": "^6.8.1", - "css-minimizer-webpack-plugin": "^5.0.1", - "cssnano": "^6.1.2", - "del": "^6.1.1", - "detect-port": "^1.5.1", - "escape-html": "^1.0.3", - "eta": "^2.2.0", - "eval": "^0.1.8", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "html-minifier-terser": "^7.2.0", - "html-tags": "^3.3.1", - "html-webpack-plugin": "^5.5.3", - "leven": "^3.1.0", - "lodash": "^4.17.21", - "mini-css-extract-plugin": "^2.7.6", - "p-map": "^4.0.0", - "postcss": "^8.4.26", - "postcss-loader": "^7.3.3", - "prompts": "^2.4.2", - "react-dev-utils": "^12.0.1", - "react-helmet-async": "^1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", - "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.3.4", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.3.4", - "rtl-detect": "^1.0.4", - "semver": "^7.5.4", - "serve-handler": "^6.1.5", - "shelljs": "^0.8.5", - "terser-webpack-plugin": "^5.3.9", - "tslib": "^2.6.0", - "update-notifier": "^6.0.2", - "url-loader": "^4.1.1", - "webpack": "^5.88.1", - "webpack-bundle-analyzer": "^4.9.0", - "webpack-dev-server": "^4.15.1", - "webpack-merge": "^5.9.0", - "webpackbar": "^5.0.2" - }, - "bin": { - "docusaurus": "bin/docusaurus.mjs" + "@aws-sdk/client-sso-oidc": "3.540.0", + "@aws-sdk/types": "3.535.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/shared-ini-file-loader": "^2.4.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "@mdx-js/react": "^3.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@docusaurus/core/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "node_modules/@aws-sdk/types": { + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.535.0.tgz", + "integrity": "sha512-aY4MYfduNj+sRR37U7XxYR8wemfbKP6lx00ze2M2uubn7mZotuVrWYAafbMSXrdEMSToE5JDhr28vArSOoLcSg==", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@docusaurus/core/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.568.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.568.0.tgz", + "integrity": "sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==", + "license": "Apache-2.0", "dependencies": { - "fast-deep-equal": "^3.1.3" + "tslib": "^2.6.2" }, - "peerDependencies": { - "ajv": "^8.8.2" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@docusaurus/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.540.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.540.0.tgz", + "integrity": "sha512-1kMyQFAWx6f8alaI6UT65/5YW/7pDWAKAdNwL6vuJLea03KrZRX3PMoONOSJpAS5m3Ot7HlWZvf3wZDNTLELZw==", + "optional": true, "dependencies": { - "color-convert": "^2.0.1" + "@aws-sdk/types": "3.535.0", + "@smithy/types": "^2.12.0", + "@smithy/util-endpoints": "^1.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=14.0.0" } }, - "node_modules/@docusaurus/core/node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "node_modules/@aws-sdk/util-format-url": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.667.0.tgz", + "integrity": "sha512-S0D731SnEPnTfbJ/Dldw5dDrOc8uipK6NLXHDs2xIq0t61iwZLMEiN8yWCs2wAZVVJKpldUM1THLaaufU9SSSA==", + "license": "Apache-2.0", "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" + "@aws-sdk/types": "3.667.0", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" + "node": ">=16.0.0" } }, - "node_modules/@docusaurus/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@aws-sdk/util-format-url/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=16.0.0" } }, - "node_modules/@docusaurus/core/node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "node_modules/@aws-sdk/util-format-url/node_modules/@smithy/querystring-builder": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.8.tgz", + "integrity": "sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==", + "license": "Apache-2.0", "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" + "@smithy/types": "^3.6.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=16.0.0" } }, - "node_modules/@docusaurus/core/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "node_modules/@aws-sdk/util-format-url/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" + "tslib": "^2.6.2" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=16.0.0" } }, - "node_modules/@docusaurus/core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@aws-sdk/util-format-url/node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, - "node_modules/@docusaurus/core/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/@docusaurus/core/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.535.0.tgz", + "integrity": "sha512-PHJ3SL6d2jpcgbqdgiPxkXpu7Drc2PYViwxSIqvvMKhDwzSB1W3mMvtpzwKM4IE7zLFodZo0GKjJ9AsoXndXhA==", "dependencies": { - "p-locate": "^6.0.0" + "tslib": "^2.6.2" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=14.0.0" } }, - "node_modules/@docusaurus/core/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.535.0.tgz", + "integrity": "sha512-RWMcF/xV5n+nhaA/Ff5P3yNP3Kur/I+VNZngog4TEs92oB/nwOdAg/2JL8bVAhUbMrjTjpwm7PItziYFQoqyig==", + "optional": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "@aws-sdk/types": "3.535.0", + "@smithy/types": "^2.12.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" } }, - "node_modules/@docusaurus/core/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.535.0.tgz", + "integrity": "sha512-dRek0zUuIT25wOWJlsRm97nTkUlh1NDcLsQZIN2Y8KxhwoXXWtJs5vaDPT+qAg+OpcNj80i1zLR/CirqlFg/TQ==", + "optional": true, "dependencies": { - "yocto-queue": "^1.0.0" + "@aws-sdk/types": "3.535.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=14.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@docusaurus/core/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "optional": true, "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "tslib": "^2.3.1" } }, - "node_modules/@docusaurus/core/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "node_modules/@aws-sdk/xml-builder": { + "version": "3.662.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.662.0.tgz", + "integrity": "sha512-ikLkXn0igUpnJu2mCZjklvmcDGWT9OaLRv3JyC/cRkTaaSrblPjPM7KKsltxdMTLQ+v7fjCN0TsJpxphMfaOPA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=16.0.0" } }, - "node_modules/@docusaurus/core/node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "node_modules/@aws-sdk/xml-builder/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", "dependencies": { - "find-up": "^6.3.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=16.0.0" } }, - "node_modules/@docusaurus/core/node_modules/react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "node_modules/@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, - "peerDependencies": { - "react": ">=15" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@docusaurus/core/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "node_modules/@babel/compat-data": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", + "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", + "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.1", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.1", + "@babel/parser": "^7.24.1", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { - "node": ">= 12.13.0" + "node": ">=6.9.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://opencollective.com/babel" } }, - "node_modules/@docusaurus/core/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/@babel/generator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", + "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" } }, - "node_modules/@docusaurus/core/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dependencies": { - "has-flag": "^4.0.0" + "@babel/types": "^7.22.5" }, "engines": { - "node": ">=8" - } - }, - "node_modules/@docusaurus/core/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "node_modules/@docusaurus/cssnano-preset": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.5.2.tgz", - "integrity": "sha512-D3KiQXOMA8+O0tqORBrTOEQyQxNIfPm9jEaJoALjjSjc2M/ZAWcUfPQEnwr2JB2TadHw2gqWgpZckQmrVWkytA==", + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dependencies": { - "cssnano-preset-advanced": "^6.1.2", - "postcss": "^8.4.38", - "postcss-sort-media-queries": "^5.2.0", - "tslib": "^2.6.0" + "@babel/types": "^7.22.15" }, "engines": { - "node": ">=18.0" + "node": ">=6.9.0" } }, - "node_modules/@docusaurus/logger": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.5.2.tgz", - "integrity": "sha512-LHC540SGkeLfyT3RHK3gAMK6aS5TRqOD4R72BEU/DE2M/TY8WwEUAMY576UUc/oNJXv8pGhBmQB6N9p3pt8LQw==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dependencies": { - "chalk": "^4.1.2", - "tslib": "^2.6.0" + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { - "node": ">=18.0" + "node": ">=6.9.0" } }, - "node_modules/@docusaurus/logger/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "yallist": "^3.0.2" } }, - "node_modules/@docusaurus/logger/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz", + "integrity": "sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@docusaurus/logger/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@docusaurus/logger/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dependencies": { - "has-flag": "^4.0.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@docusaurus/mdx-loader": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.5.2.tgz", - "integrity": "sha512-ku3xO9vZdwpiMIVd8BzWV0DCqGEbCP5zs1iHfKX50vw6jX8vQo0ylYo1YJMZyz6e+JFJ17HYHT5FzVidz2IflA==", + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", "dependencies": { - "@docusaurus/logger": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "@mdx-js/mdx": "^3.0.0", - "@slorber/remark-comment": "^1.0.0", - "escape-html": "^1.0.3", - "estree-util-value-to-estree": "^3.0.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "image-size": "^1.0.2", - "mdast-util-mdx": "^3.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-raw": "^7.0.0", - "remark-directive": "^3.0.0", - "remark-emoji": "^4.0.0", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", - "stringify-object": "^3.3.0", - "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0", - "url-loader": "^4.1.1", - "vfile": "^6.0.1", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@docusaurus/module-type-aliases": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.5.2.tgz", - "integrity": "sha512-Z+Xu3+2rvKef/YKTMxZHsEXp1y92ac0ngjDiExRdqGTmEKtCUpkbNYH8v5eXo5Ls+dnW88n6WTa+Q54kLOkwPg==", + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dependencies": { - "@docusaurus/types": "3.5.2", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "*", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, - "peerDependencies": { - "react": "*", - "react-dom": "*" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.5.2.tgz", - "integrity": "sha512-R7ghWnMvjSf+aeNDH0K4fjyQnt5L0KzUEnUhmf1e3jZrv3wogeytZNN6n7X8yHcMsuZHPOrctQhXWnmxu+IRRg==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "cheerio": "1.0.0-rc.12", - "feed": "^4.2.2", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "reading-time": "^1.5.0", - "srcset": "^4.0.0", - "tslib": "^2.6.0", - "unist-util-visit": "^5.0.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" + "@babel/types": "^7.22.5" }, "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "node": ">=6.9.0" } }, - "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.5.2.tgz", - "integrity": "sha512-Bt+OXn/CPtVqM3Di44vHjE7rPCEsRCB/DMo2qoOuozB9f7+lsdrHvD0QCHdBs0uhz6deYJDppAr2VgqybKPlVQ==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/module-type-aliases": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "@types/react-router-config": "^5.0.7", - "combine-promises": "^1.1.0", - "fs-extra": "^11.1.1", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.6.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" + "@babel/types": "^7.23.0" }, "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "node": ">=6.9.0" } }, - "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.5.2.tgz", - "integrity": "sha512-WzhHjNpoQAUz/ueO10cnundRz+VUtkjFhhaQ9jApyv1a46FPURO4cef89pyNIOMny1fjDz/NUN2z6Yi+5WUrCw==", + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "fs-extra": "^11.1.1", - "tslib": "^2.6.0", - "webpack": "^5.88.1" + "@babel/types": "^7.24.0" }, "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "node": ">=6.9.0" } }, - "node_modules/@docusaurus/plugin-debug": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.5.2.tgz", - "integrity": "sha512-kBK6GlN0itCkrmHuCS6aX1wmoWc5wpd5KJlqQ1FyrF0cLDnvsYSnh7+ftdwzt7G6lGBho8lrVwkkL9/iQvaSOA==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "fs-extra": "^11.1.1", - "react-json-view-lite": "^1.2.0", - "tslib": "^2.6.0" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { - "node": ">=18.0" + "node": ">=6.9.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "@babel/core": "^7.0.0" } }, - "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.5.2.tgz", - "integrity": "sha512-rjEkJH/tJ8OXRE9bwhV2mb/WP93V441rD6XnM6MIluu7rk8qg38iSxS43ga2V2Q/2ib53PcqbDEJDG/yWQRJhQ==", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "tslib": "^2.6.0" + "@babel/types": "^7.22.5" }, "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "node": ">=6.9.0" } }, - "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.5.2.tgz", - "integrity": "sha512-lm8XL3xLkTPHFKKjLjEEAHUrW0SZBSHBE1I+i/tmYMBsjCcUB5UJ52geS5PSiOCFVR74tbPGcPHEV/gaaxFeSA==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "@types/gtag.js": "^0.0.12", - "tslib": "^2.6.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" }, "engines": { - "node": ">=18.0" + "node": ">=6.9.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "@babel/core": "^7.0.0" } }, - "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.5.2.tgz", - "integrity": "sha512-QkpX68PMOMu10Mvgvr5CfZAzZQFx8WLlOiUQ/Qmmcl6mjGK6H21WLT5x7xDmcpCoKA/3CegsqIqBR+nA137lQg==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "tslib": "^2.6.0" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { - "node": ">=18.0" + "node": ">=6.9.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "@babel/core": "^7.0.0" } }, - "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.5.2.tgz", - "integrity": "sha512-DnlqYyRAdQ4NHY28TfHuVk414ft2uruP4QWCH//jzpHjqvKyXjj2fmDtI8RPUBh9K8iZKFMHRnLtzJKySPWvFA==", + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "fs-extra": "^11.1.1", - "sitemap": "^7.1.1", - "tslib": "^2.6.0" + "@babel/types": "^7.22.5" }, "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "node": ">=6.9.0" } }, - "node_modules/@docusaurus/preset-classic": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.5.2.tgz", - "integrity": "sha512-3ihfXQ95aOHiLB5uCu+9PRy2gZCeSZoDcqpnDvf3B+sTrMvMTr8qRUzBvWkoIqc82yG5prCboRjk1SVILKx6sg==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/plugin-content-blog": "3.5.2", - "@docusaurus/plugin-content-docs": "3.5.2", - "@docusaurus/plugin-content-pages": "3.5.2", - "@docusaurus/plugin-debug": "3.5.2", - "@docusaurus/plugin-google-analytics": "3.5.2", - "@docusaurus/plugin-google-gtag": "3.5.2", - "@docusaurus/plugin-google-tag-manager": "3.5.2", - "@docusaurus/plugin-sitemap": "3.5.2", - "@docusaurus/theme-classic": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/theme-search-algolia": "3.5.2", - "@docusaurus/types": "3.5.2" + "@babel/types": "^7.22.5" }, "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "node": ">=6.9.0" } }, - "node_modules/@docusaurus/theme-classic": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.5.2.tgz", - "integrity": "sha512-XRpinSix3NBv95Rk7xeMF9k4safMkwnpSgThn0UNQNumKvmcIYjfkwfh2BhwYh/BxMXQHJ/PdmNh22TQFpIaYg==", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/module-type-aliases": "3.5.2", - "@docusaurus/plugin-content-blog": "3.5.2", - "@docusaurus/plugin-content-docs": "3.5.2", - "@docusaurus/plugin-content-pages": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/theme-translations": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "copy-text-to-clipboard": "^3.2.0", - "infima": "0.2.0-alpha.44", - "lodash": "^4.17.21", - "nprogress": "^0.2.0", - "postcss": "^8.4.26", - "prism-react-renderer": "^2.3.0", - "prismjs": "^1.29.0", - "react-router-dom": "^5.3.4", - "rtlcss": "^4.1.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" + "@babel/types": "^7.22.5" }, "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "node": ">=6.9.0" } }, - "node_modules/@docusaurus/theme-classic/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "node_modules/@docusaurus/theme-classic/node_modules/react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" }, - "peerDependencies": { - "react": ">=15" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@docusaurus/theme-common": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.5.2.tgz", - "integrity": "sha512-QXqlm9S6x9Ibwjs7I2yEDgsCocp708DrCrgHgKwg2n2AY0YQ6IjU0gAK35lHRLOvAoJUfCKpQAwUykB0R7+Eew==", + "node_modules/@babel/helpers": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", + "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", "dependencies": { - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/module-type-aliases": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "clsx": "^2.0.0", - "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^2.3.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" }, "engines": { - "node": ">=18.0" + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, - "peerDependencies": { - "@docusaurus/plugin-content-docs": "*", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@docusaurus/theme-common/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "node_modules/@babel/parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "bin": { + "parser": "bin/babel-parser.js" + }, "engines": { - "node": ">=6" + "node": ">=6.0.0" } }, - "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.5.2.tgz", - "integrity": "sha512-qW53kp3VzMnEqZGjakaV90sst3iN1o32PH+nawv1uepROO8aEGxptcq2R5rsv7aBShSRbZwIobdvSYKsZ5pqvA==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", + "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", "dependencies": { - "@docsearch/react": "^3.5.2", - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/plugin-content-docs": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/theme-translations": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "algoliasearch": "^4.18.0", - "algoliasearch-helper": "^3.13.3", - "clsx": "^2.0.0", - "eta": "^2.2.0", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { - "node": ">=18.0" + "node": ">=6.9.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/theme-search-algolia/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "engines": { - "node": ">=6" + "@babel/core": "^7.0.0" } }, - "node_modules/@docusaurus/theme-translations": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.5.2.tgz", - "integrity": "sha512-GPZLcu4aT1EmqSTmbdpVrDENGR2yObFEX8ssEFYTCiAIVc0EihNSdOIBTazUvgNqwvnoU1A8vIs1xyzc3LITTw==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", + "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", "dependencies": { - "fs-extra": "^11.1.1", - "tslib": "^2.6.0" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.24.1" }, "engines": { - "node": ">=18.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" } }, - "node_modules/@docusaurus/types": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.2.tgz", - "integrity": "sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", + "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "@babel/core": "^7.0.0" } }, - "node_modules/@docusaurus/utils": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.5.2.tgz", - "integrity": "sha512-33QvcNFh+Gv+C2dP9Y9xWEzMgf3JzrpL2nW9PopidiohS1nDcyknKRx2DWaFvyVTTYIkkABVSr073VTj/NITNA==", + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "dev": true, "dependencies": { - "@docusaurus/logger": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@svgr/webpack": "^8.1.0", - "escape-string-regexp": "^4.0.0", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "github-slugger": "^1.5.0", - "globby": "^11.1.0", - "gray-matter": "^4.0.3", - "jiti": "^1.20.0", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.5", - "prompts": "^2.4.2", - "resolve-pathname": "^3.0.0", - "shelljs": "^0.8.5", - "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { - "node": ">=18.0" + "node": ">=6.9.0" }, "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@docusaurus/utils-common": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.5.2.tgz", - "integrity": "sha512-i0AZjHiRgJU6d7faQngIhuHKNrszpL/SHQPgF1zH4H+Ij6E9NBYGy6pkcGWToIv7IVPbs+pQLh1P3whn0gWXVg==", + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz", + "integrity": "sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA==", + "dev": true, "dependencies": { - "tslib": "^2.6.0" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-decorators": "^7.24.1" }, "engines": { - "node": ">=18.0" + "node": ">=6.9.0" }, "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@docusaurus/utils-validation": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.5.2.tgz", - "integrity": "sha512-m+Foq7augzXqB6HufdS139PFxDC5d5q2QKZy8q0qYYvGdI6nnlNsGH4cIGsgBnV7smz+mopl3g4asbSDvMV0jA==", + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", + "dev": true, "dependencies": { - "@docusaurus/logger": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "fs-extra": "^11.2.0", - "joi": "^17.9.2", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.6.0" + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" }, "engines": { - "node": ">=18.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@elastic/elasticsearch": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-7.13.0.tgz", - "integrity": "sha512-WgwLWo2p9P2tdqzBGX9fHeG8p5IOTXprXNTECQG2mJ7z9n93N5AFBJpEw4d35tWWeCWi9jI13A2wzQZH7XZ/xw==", - "dependencies": { - "debug": "^4.3.1", - "hpagent": "^0.1.1", - "ms": "^2.1.3", - "secure-json-parse": "^2.4.0" - }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/babel-plugin": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", - "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/serialize": "^1.1.2", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/babel-plugin/node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=10", - "npm": ">=6" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/@emotion/babel-plugin/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/babel-plugin/node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - }, - "node_modules/@emotion/cache": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", - "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dependencies": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "stylis": "4.2.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/cache/node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - }, - "node_modules/@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" - }, - "node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "node_modules/@emotion/react": { - "version": "11.11.4", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", - "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.1.tgz", + "integrity": "sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "hoist-non-react-statics": "^3.3.1" + "@babel/helper-plugin-utils": "^7.24.0" }, - "peerDependencies": { - "react": ">=16.8.0" + "engines": { + "node": ">=6.9.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/serialize": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", - "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dependencies": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", - "csstype": "^3.0.2" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/sheet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", - "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" - }, - "node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, "peerDependencies": { - "react": ">=16.8.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" - }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", - "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==", - "cpu": [ - "arm" - ], + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.1.tgz", + "integrity": "sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz", - "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz", - "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", + "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", - "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz", - "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz", - "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz", - "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz", - "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz", - "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz", - "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz", - "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz", - "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz", - "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz", - "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz", - "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", - "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz", - "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", + "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz", - "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz", - "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz", - "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", + "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz", - "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", + "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "dependencies": { + "@babel/helper-module-imports": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz", - "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "devOptional": true, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz", + "integrity": "sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "devOptional": true, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", + "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" + }, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "devOptional": true, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz", + "integrity": "sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", + "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "devOptional": true, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", "dependencies": { - "type-fest": "^0.20.2" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", + "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", "dependencies": { - "brace-expansion": "^1.1.7" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { - "node": "*" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "devOptional": true, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", + "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "devOptional": true, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", + "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@faker-js/faker": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz", - "integrity": "sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==", - "dev": true, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", + "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, "engines": { - "node": ">=14.0.0", - "npm": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@fal-works/esbuild-plugin-global-externals": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz", - "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==", - "dev": true - }, - "node_modules/@fast-csv/format": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", - "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", "dependencies": { - "@types/node": "^14.0.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isboolean": "^3.0.3", - "lodash.isequal": "^4.5.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@fast-csv/format/node_modules/@types/node": { - "version": "14.18.63", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", - "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" - }, - "node_modules/@fast-csv/parse": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", - "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", + "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", "dependencies": { - "@types/node": "^14.0.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.groupby": "^4.6.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0", - "lodash.isundefined": "^3.0.1", - "lodash.uniq": "^4.5.0" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@fast-csv/parse/node_modules/@types/node": { - "version": "14.18.63", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", - "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" - }, - "node_modules/@floating-ui/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", - "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.1.tgz", + "integrity": "sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==", + "dev": true, "dependencies": { - "@floating-ui/utils": "^0.2.1" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-flow": "^7.24.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@floating-ui/dom": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", - "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", "dependencies": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@floating-ui/react-dom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", - "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", - "dev": true, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", "dependencies": { - "@floating-ui/dom": "^1.6.1" + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" - }, - "node_modules/@formatjs/ecma402-abstract": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz", - "integrity": "sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", + "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", "dependencies": { - "@formatjs/intl-localematcher": "0.5.4", - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/fast-memoize": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", - "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", "dependencies": { - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.6.tgz", - "integrity": "sha512-etVau26po9+eewJKYoiBKP6743I1br0/Ie00Pb/S/PtmYfmjTcOn2YCh2yNkSZI12h6Rg+BOgQYborXk46BvkA==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", + "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", "dependencies": { - "@formatjs/ecma402-abstract": "1.18.2", - "@formatjs/icu-skeleton-parser": "1.8.0", - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.0.tgz", - "integrity": "sha512-QWLAYvM0n8hv7Nq5BEs4LKIjevpVpbGLAJgOaYzg9wABEoX1j0JO1q2/jVkO6CVlq0dbsxZCngS5aXbysYueqA==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", "dependencies": { - "@formatjs/ecma402-abstract": "1.18.2", - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@formatjs/intl-localematcher": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", - "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", + "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", "dependencies": { - "tslib": "^2.4.0" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@fullhuman/postcss-purgecss": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.3.0.tgz", - "integrity": "sha512-qnKm5dIOyPGJ70kPZ5jiz0I9foVOic0j+cOzNDoo8KoCf6HjicIZ99UfO2OmE7vCYSKAAepEwJtNzpiiZAh9xw==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", "dependencies": { - "postcss": "7.0.32", - "purgecss": "^2.3.0" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@fullhuman/postcss-purgecss/node_modules/postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", + "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@fullhuman/postcss-purgecss/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", + "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@fullhuman/postcss-purgecss/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dependencies": { - "has-flag": "^3.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@graphql-codegen/cli": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-3.3.1.tgz", - "integrity": "sha512-4Es8Y9zFeT0Zx2qRL7L3qXDbbqvXK6aID+8v8lP6gaYD+uWx3Jd4Hsq5vxwVBR+6flm0BW/C85Qm0cvmT7O6LA==", - "dev": true, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", + "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", "dependencies": { - "@babel/generator": "^7.18.13", - "@babel/template": "^7.18.10", - "@babel/types": "^7.18.13", - "@graphql-codegen/core": "^3.1.0", - "@graphql-codegen/plugin-helpers": "^4.2.0", - "@graphql-tools/apollo-engine-loader": "^7.3.6", - "@graphql-tools/code-file-loader": "^7.3.17", - "@graphql-tools/git-loader": "^7.2.13", - "@graphql-tools/github-loader": "^7.3.20", - "@graphql-tools/graphql-file-loader": "^7.5.0", - "@graphql-tools/json-file-loader": "^7.4.1", - "@graphql-tools/load": "^7.8.0", - "@graphql-tools/prisma-loader": "^7.2.49", - "@graphql-tools/url-loader": "^7.13.2", - "@graphql-tools/utils": "^9.0.0", - "@parcel/watcher": "^2.1.0", - "@whatwg-node/fetch": "^0.8.0", - "chalk": "^4.1.0", - "cosmiconfig": "^7.0.0", - "debounce": "^1.2.0", - "detect-indent": "^6.0.0", - "graphql-config": "^4.5.0", - "inquirer": "^8.0.0", - "is-glob": "^4.0.1", - "jiti": "^1.17.1", - "json-to-pretty-yaml": "^1.2.2", - "listr2": "^4.0.5", - "log-symbols": "^4.0.0", - "micromatch": "^4.0.5", - "shell-quote": "^1.7.3", - "string-env-interpolation": "^1.0.1", - "ts-log": "^2.2.3", - "tslib": "^2.4.0", - "yaml": "^1.10.0", - "yargs": "^17.0.0" + "@babel/helper-plugin-utils": "^7.24.0" }, - "bin": { - "gql-gen": "cjs/bin.js", - "graphql-code-generator": "cjs/bin.js", - "graphql-codegen": "cjs/bin.js", - "graphql-codegen-esm": "esm/bin.js" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-codegen/cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", + "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", "dependencies": { - "color-convert": "^2.0.1" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-codegen/cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", + "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-codegen/cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", + "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.1" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-codegen/cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", "dependencies": { - "has-flag": "^4.0.0" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-codegen/core": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-3.1.0.tgz", - "integrity": "sha512-DH1/yaR7oJE6/B+c6ZF2Tbdh7LixF1K8L+8BoSubjNyQ8pNwR4a70mvc1sv6H7qgp6y1bPQ9tKE+aazRRshysw==", - "dev": true, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", + "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", "dependencies": { - "@graphql-codegen/plugin-helpers": "^4.1.0", - "@graphql-tools/schema": "^9.0.0", - "@graphql-tools/utils": "^9.1.1", - "tslib": "~2.5.0" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-codegen/core/node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", - "dev": true - }, - "node_modules/@graphql-codegen/plugin-helpers": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-4.2.0.tgz", - "integrity": "sha512-THFTCfg+46PXlXobYJ/OoCX6pzjI+9woQqCjdyKtgoI0tn3Xq2HUUCiidndxUpEYVrXb5pRiRXb7b/ZbMQqD0A==", - "dev": true, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", + "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", "dependencies": { - "@graphql-tools/utils": "^9.0.0", - "change-case-all": "1.0.15", - "common-tags": "1.8.2", - "import-from": "4.0.0", - "lodash": "~4.17.0", - "tslib": "~2.5.0" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-codegen/plugin-helpers/node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", - "dev": true - }, - "node_modules/@graphql-codegen/schema-ast": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-3.0.1.tgz", - "integrity": "sha512-rTKTi4XiW4QFZnrEqetpiYEWVsOFNoiR/v3rY9mFSttXFbIwNXPme32EspTiGWmEEdHY8UuTDtZN3vEcs/31zw==", - "dev": true, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", + "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", "dependencies": { - "@graphql-codegen/plugin-helpers": "^4.1.0", - "@graphql-tools/utils": "^9.0.0", - "tslib": "~2.5.0" + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-codegen/schema-ast/node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", - "dev": true - }, - "node_modules/@graphql-codegen/typescript": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-3.0.4.tgz", - "integrity": "sha512-x4O47447DZrWNtE/l5CU9QzzW4m1RbmCEdijlA3s2flG/y1Ckqdemob4CWfilSm5/tZ3w1junVDY616RDTSvZw==", - "dev": true, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", + "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", "dependencies": { - "@graphql-codegen/plugin-helpers": "^4.2.0", - "@graphql-codegen/schema-ast": "^3.0.1", - "@graphql-codegen/visitor-plugin-common": "3.1.1", - "auto-bind": "~4.0.0", - "tslib": "~2.5.0" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-codegen/typescript-operations": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-3.0.4.tgz", - "integrity": "sha512-6yE2OL2+WJ1vd5MwFEGXpaxsFGzjAGUytPVHDML3Bi3TwP1F3lnQlIko4untwvHW0JhZEGQ7Ck30H9HjcxpdKA==", - "dev": true, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", + "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", "dependencies": { - "@graphql-codegen/plugin-helpers": "^4.2.0", - "@graphql-codegen/typescript": "^3.0.4", - "@graphql-codegen/visitor-plugin-common": "3.1.1", - "auto-bind": "~4.0.0", - "tslib": "~2.5.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-codegen/typescript-operations/node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", - "dev": true - }, - "node_modules/@graphql-codegen/typescript-resolvers": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-resolvers/-/typescript-resolvers-3.2.1.tgz", - "integrity": "sha512-2ZIHk5J6HTuylse5ZIxw+aega54prHxvj7vM8hiKJ6vejZ94kvVPAq4aWmSFOkZ5lqU3YnM/ZyWfnhT5CUDj1g==", - "dev": true, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", "dependencies": { - "@graphql-codegen/plugin-helpers": "^4.2.0", - "@graphql-codegen/typescript": "^3.0.4", - "@graphql-codegen/visitor-plugin-common": "3.1.1", - "@graphql-tools/utils": "^9.0.0", - "auto-bind": "~4.0.0", - "tslib": "~2.5.0" + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-codegen/typescript-resolvers/node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", - "dev": true - }, - "node_modules/@graphql-codegen/typescript/node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", - "dev": true - }, - "node_modules/@graphql-codegen/visitor-plugin-common": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-3.1.1.tgz", - "integrity": "sha512-uAfp+zu/009R3HUAuTK2AamR1bxIltM6rrYYI6EXSmkM3rFtFsLTuJhjUDj98HcUCszJZrADppz8KKLGRUVlNg==", - "dev": true, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.1.tgz", + "integrity": "sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA==", "dependencies": { - "@graphql-codegen/plugin-helpers": "^4.2.0", - "@graphql-tools/optimize": "^1.3.0", - "@graphql-tools/relay-operation-optimizer": "^6.5.0", - "@graphql-tools/utils": "^9.0.0", - "auto-bind": "~4.0.0", - "change-case-all": "1.0.15", - "dependency-graph": "^0.11.0", - "graphql-tag": "^2.11.0", - "parse-filepath": "^1.0.2", - "tslib": "~2.5.0" + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-codegen/visitor-plugin-common/node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", - "dev": true - }, - "node_modules/@graphql-tools/apollo-engine-loader": { - "version": "7.3.26", - "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-7.3.26.tgz", - "integrity": "sha512-h1vfhdJFjnCYn9b5EY1Z91JTF0KB3hHVJNQIsiUV2mpQXZdeOXQoaWeYEKaiI5R6kwBw5PP9B0fv3jfUIG8LyQ==", - "dev": true, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", + "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", "dependencies": { - "@ardatan/sync-fetch": "^0.0.1", - "@graphql-tools/utils": "^9.2.1", - "@whatwg-node/fetch": "^0.8.0", - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-tools/batch-execute": { - "version": "8.5.22", - "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-8.5.22.tgz", - "integrity": "sha512-hcV1JaY6NJQFQEwCKrYhpfLK8frSXDbtNMoTur98u10Cmecy1zrqNKSqhEyGetpgHxaJRqszGzKeI3RuroDN6A==", - "dev": true, - "dependencies": { - "@graphql-tools/utils": "^9.2.1", - "dataloader": "^2.2.2", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/code-file-loader": { - "version": "7.3.23", - "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-7.3.23.tgz", - "integrity": "sha512-8Wt1rTtyTEs0p47uzsPJ1vAtfAx0jmxPifiNdmo9EOCuUPyQGEbMaik/YkqZ7QUFIEYEQu+Vgfo8tElwOPtx5Q==", - "dev": true, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", "dependencies": { - "@graphql-tools/graphql-tag-pluck": "7.5.2", - "@graphql-tools/utils": "^9.2.1", - "globby": "^11.0.3", - "tslib": "^2.4.0", - "unixify": "^1.0.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/delegate": { - "version": "9.0.35", - "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-9.0.35.tgz", - "integrity": "sha512-jwPu8NJbzRRMqi4Vp/5QX1vIUeUPpWmlQpOkXQD2r1X45YsVceyUUBnktCrlJlDB4jPRVy7JQGwmYo3KFiOBMA==", - "dev": true, - "dependencies": { - "@graphql-tools/batch-execute": "^8.5.22", - "@graphql-tools/executor": "^0.0.20", - "@graphql-tools/schema": "^9.0.19", - "@graphql-tools/utils": "^9.2.1", - "dataloader": "^2.2.2", - "tslib": "^2.5.0", - "value-or-promise": "^1.0.12" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-tools/executor": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-0.0.20.tgz", - "integrity": "sha512-GdvNc4vszmfeGvUqlcaH1FjBoguvMYzxAfT6tDd4/LgwymepHhinqLNA5otqwVLW+JETcDaK7xGENzFomuE6TA==", - "dev": true, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", "dependencies": { - "@graphql-tools/utils": "^9.2.1", - "@graphql-typed-document-node/core": "3.2.0", - "@repeaterjs/repeater": "^3.0.4", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-tools/executor-graphql-ws": { - "version": "0.0.14", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-0.0.14.tgz", - "integrity": "sha512-P2nlkAsPZKLIXImFhj0YTtny5NQVGSsKnhi7PzXiaHSXc6KkzqbWZHKvikD4PObanqg+7IO58rKFpGXP7eeO+w==", + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz", + "integrity": "sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==", "dev": true, "dependencies": { - "@graphql-tools/utils": "^9.2.1", - "@repeaterjs/repeater": "3.0.4", - "@types/ws": "^8.0.0", - "graphql-ws": "5.12.1", - "isomorphic-ws": "5.0.0", - "tslib": "^2.4.0", - "ws": "8.13.0" + "@babel/helper-plugin-utils": "^7.24.0" }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/executor-graphql-ws/node_modules/@repeaterjs/repeater": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.4.tgz", - "integrity": "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==", - "dev": true - }, - "node_modules/@graphql-tools/executor-graphql-ws/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true, "engines": { - "node": ">=10.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-tools/executor-http": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-0.1.10.tgz", - "integrity": "sha512-hnAfbKv0/lb9s31LhWzawQ5hghBfHS+gYWtqxME6Rl0Aufq9GltiiLBcl7OVVOnkLF0KhwgbYP1mB5VKmgTGpg==", + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz", + "integrity": "sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==", "dev": true, "dependencies": { - "@graphql-tools/utils": "^9.2.1", - "@repeaterjs/repeater": "^3.0.4", - "@whatwg-node/fetch": "^0.8.1", - "dset": "^3.1.2", - "extract-files": "^11.0.0", - "meros": "^1.2.1", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-tools/executor-legacy-ws": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-0.0.11.tgz", - "integrity": "sha512-4ai+NnxlNfvIQ4c70hWFvOZlSUN8lt7yc+ZsrwtNFbFPH/EroIzFMapAxM9zwyv9bH38AdO3TQxZ5zNxgBdvUw==", - "dev": true, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", + "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", "dependencies": { - "@graphql-tools/utils": "^9.2.1", - "@types/ws": "^8.0.0", - "isomorphic-ws": "5.0.0", - "tslib": "^2.4.0", - "ws": "8.13.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0" }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/executor-legacy-ws/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true, "engines": { - "node": ">=10.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-tools/git-loader": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-7.3.0.tgz", - "integrity": "sha512-gcGAK+u16eHkwsMYqqghZbmDquh8QaO24Scsxq+cVR+vx1ekRlsEiXvu+yXVDbZdcJ6PBIbeLcQbEu+xhDLmvQ==", - "dev": true, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", "dependencies": { - "@graphql-tools/graphql-tag-pluck": "7.5.2", - "@graphql-tools/utils": "^9.2.1", - "is-glob": "4.0.3", - "micromatch": "^4.0.4", - "tslib": "^2.4.0", - "unixify": "^1.0.0" + "@babel/helper-plugin-utils": "^7.24.0", + "regenerator-transform": "^0.15.2" }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/github-loader": { - "version": "7.3.28", - "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-7.3.28.tgz", - "integrity": "sha512-OK92Lf9pmxPQvjUNv05b3tnVhw0JRfPqOf15jZjyQ8BfdEUrJoP32b4dRQQem/wyRL24KY4wOfArJNqzpsbwCA==", - "dev": true, - "dependencies": { - "@ardatan/sync-fetch": "^0.0.1", - "@graphql-tools/executor-http": "^0.1.9", - "@graphql-tools/graphql-tag-pluck": "^7.4.6", - "@graphql-tools/utils": "^9.2.1", - "@whatwg-node/fetch": "^0.8.0", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-tools/graphql-file-loader": { - "version": "7.5.17", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-7.5.17.tgz", - "integrity": "sha512-hVwwxPf41zOYgm4gdaZILCYnKB9Zap7Ys9OhY1hbwuAuC4MMNY9GpUjoTU3CQc3zUiPoYStyRtUGkHSJZ3HxBw==", - "dev": true, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", + "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", "dependencies": { - "@graphql-tools/import": "6.7.18", - "@graphql-tools/utils": "^9.2.1", - "globby": "^11.0.3", - "tslib": "^2.4.0", - "unixify": "^1.0.0" + "@babel/helper-plugin-utils": "^7.24.0" }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/graphql-tag-pluck": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-7.5.2.tgz", - "integrity": "sha512-RW+H8FqOOLQw0BPXaahYepVSRjuOHw+7IL8Opaa5G5uYGOBxoXR7DceyQ7BcpMgktAOOmpDNQ2WtcboChOJSRA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.16.8", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8", - "@graphql-tools/utils": "^9.2.1", - "tslib": "^2.4.0" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-tools/import": { - "version": "6.7.18", - "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-6.7.18.tgz", - "integrity": "sha512-XQDdyZTp+FYmT7as3xRWH/x8dx0QZA2WZqfMF5EWb36a0PiH7WwlRQYIdyYXj8YCLpiWkeBXgBRHmMnwEYR8iQ==", - "dev": true, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", + "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", "dependencies": { - "@graphql-tools/utils": "^9.2.1", - "resolve-from": "5.0.0", - "tslib": "^2.4.0" + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-plugin-utils": "^7.24.0", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/json-file-loader": { - "version": "7.4.18", - "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-7.4.18.tgz", - "integrity": "sha512-AJ1b6Y1wiVgkwsxT5dELXhIVUPs/u3VZ8/0/oOtpcoyO/vAeM5rOvvWegzicOOnQw8G45fgBRMkkRfeuwVt6+w==", - "dev": true, - "dependencies": { - "@graphql-tools/utils": "^9.2.1", - "globby": "^11.0.3", - "tslib": "^2.4.0", - "unixify": "^1.0.0" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-tools/load": { - "version": "7.8.14", - "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-7.8.14.tgz", - "integrity": "sha512-ASQvP+snHMYm+FhIaLxxFgVdRaM0vrN9wW2BKInQpktwWTXVyk+yP5nQUCEGmn0RTdlPKrffBaigxepkEAJPrg==", - "dev": true, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", "dependencies": { - "@graphql-tools/schema": "^9.0.18", - "@graphql-tools/utils": "^9.2.1", - "p-limit": "3.1.0", - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-tools/load-files": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/load-files/-/load-files-6.6.1.tgz", - "integrity": "sha512-nd4GOjdD68bdJkHfRepILb0gGwF63mJI7uD4oJuuf2Kzeq8LorKa6WfyxUhdMuLmZhnx10zdAlWPfwv1NOAL4Q==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", "dependencies": { - "globby": "11.1.0", - "tslib": "^2.4.0", - "unixify": "1.0.0" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-tools/merge": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.4.2.tgz", - "integrity": "sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", "dependencies": { - "@graphql-tools/utils": "^9.2.1", - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-tools/optimize": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-1.4.0.tgz", - "integrity": "sha512-dJs/2XvZp+wgHH8T5J2TqptT9/6uVzIYvA6uFACha+ufvdMBedkfR4b4GbT8jAKLRARiqRTxy3dctnwkTM2tdw==", - "dev": true, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", "dependencies": { - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-tools/prisma-loader": { - "version": "7.2.72", - "resolved": "https://registry.npmjs.org/@graphql-tools/prisma-loader/-/prisma-loader-7.2.72.tgz", - "integrity": "sha512-0a7uV7Fky6yDqd0tI9+XMuvgIo6GAqiVzzzFV4OSLry4AwiQlI3igYseBV7ZVOGhedOTqj/URxjpiv07hRcwag==", - "dev": true, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", + "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", "dependencies": { - "@graphql-tools/url-loader": "^7.17.18", - "@graphql-tools/utils": "^9.2.1", - "@types/js-yaml": "^4.0.0", - "@types/json-stable-stringify": "^1.0.32", - "@whatwg-node/fetch": "^0.8.2", - "chalk": "^4.1.0", - "debug": "^4.3.1", - "dotenv": "^16.0.0", - "graphql-request": "^6.0.0", - "http-proxy-agent": "^6.0.0", - "https-proxy-agent": "^6.0.0", - "jose": "^4.11.4", - "js-yaml": "^4.0.0", - "json-stable-stringify": "^1.0.1", - "lodash": "^4.17.20", - "scuid": "^1.1.0", - "tslib": "^2.4.0", - "yaml-ast-parser": "^0.0.43" + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-tools/prisma-loader/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.1.tgz", + "integrity": "sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w==", "dependencies": { - "color-convert": "^2.0.1" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-typescript": "^7.24.1" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-tools/prisma-loader/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", + "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@graphql-tools/prisma-loader/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-tools/prisma-loader/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", + "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", "dependencies": { - "has-flag": "^4.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/@graphql-tools/relay-operation-optimizer": { - "version": "6.5.18", - "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.5.18.tgz", - "integrity": "sha512-mc5VPyTeV+LwiM+DNvoDQfPqwQYhPV/cl5jOBjTgSniyaq8/86aODfMkrE2OduhQ5E00hqrkuL2Fdrgk0w1QJg==", - "dev": true, - "dependencies": { - "@ardatan/relay-compiler": "12.0.0", - "@graphql-tools/utils": "^9.2.1", - "tslib": "^2.4.0" + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-tools/schema": { - "version": "9.0.19", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.19.tgz", - "integrity": "sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", "dependencies": { - "@graphql-tools/merge": "^8.4.1", - "@graphql-tools/utils": "^9.2.1", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-tools/url-loader": { - "version": "7.17.18", - "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-7.17.18.tgz", - "integrity": "sha512-ear0CiyTj04jCVAxi7TvgbnGDIN2HgqzXzwsfcqiVg9cvjT40NcMlZ2P1lZDgqMkZ9oyLTV8Bw6j+SyG6A+xPw==", - "dev": true, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", + "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", "dependencies": { - "@ardatan/sync-fetch": "^0.0.1", - "@graphql-tools/delegate": "^9.0.31", - "@graphql-tools/executor-graphql-ws": "^0.0.14", - "@graphql-tools/executor-http": "^0.1.7", - "@graphql-tools/executor-legacy-ws": "^0.0.11", - "@graphql-tools/utils": "^9.2.1", - "@graphql-tools/wrap": "^9.4.2", - "@types/ws": "^8.0.0", - "@whatwg-node/fetch": "^0.8.0", - "isomorphic-ws": "^5.0.0", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.11", - "ws": "^8.12.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "@babel/core": "^7.0.0" } }, - "node_modules/@graphql-tools/utils": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz", - "integrity": "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==", - "dependencies": { - "@graphql-typed-document-node/core": "^3.1.1", - "tslib": "^2.4.0" + "node_modules/@babel/preset-env": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.3.tgz", + "integrity": "sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==", + "dependencies": { + "@babel/compat-data": "^7.24.1", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.1", + "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.1", + "@babel/plugin-transform-async-generator-functions": "^7.24.3", + "@babel/plugin-transform-async-to-generator": "^7.24.1", + "@babel/plugin-transform-block-scoped-functions": "^7.24.1", + "@babel/plugin-transform-block-scoping": "^7.24.1", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/plugin-transform-class-static-block": "^7.24.1", + "@babel/plugin-transform-classes": "^7.24.1", + "@babel/plugin-transform-computed-properties": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.1", + "@babel/plugin-transform-dotall-regex": "^7.24.1", + "@babel/plugin-transform-duplicate-keys": "^7.24.1", + "@babel/plugin-transform-dynamic-import": "^7.24.1", + "@babel/plugin-transform-exponentiation-operator": "^7.24.1", + "@babel/plugin-transform-export-namespace-from": "^7.24.1", + "@babel/plugin-transform-for-of": "^7.24.1", + "@babel/plugin-transform-function-name": "^7.24.1", + "@babel/plugin-transform-json-strings": "^7.24.1", + "@babel/plugin-transform-literals": "^7.24.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", + "@babel/plugin-transform-member-expression-literals": "^7.24.1", + "@babel/plugin-transform-modules-amd": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-modules-systemjs": "^7.24.1", + "@babel/plugin-transform-modules-umd": "^7.24.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.24.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", + "@babel/plugin-transform-numeric-separator": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-object-super": "^7.24.1", + "@babel/plugin-transform-optional-catch-binding": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.1", + "@babel/plugin-transform-parameters": "^7.24.1", + "@babel/plugin-transform-private-methods": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.1", + "@babel/plugin-transform-property-literals": "^7.24.1", + "@babel/plugin-transform-regenerator": "^7.24.1", + "@babel/plugin-transform-reserved-words": "^7.24.1", + "@babel/plugin-transform-shorthand-properties": "^7.24.1", + "@babel/plugin-transform-spread": "^7.24.1", + "@babel/plugin-transform-sticky-regex": "^7.24.1", + "@babel/plugin-transform-template-literals": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.1", + "@babel/plugin-transform-unicode-escapes": "^7.24.1", + "@babel/plugin-transform-unicode-property-regex": "^7.24.1", + "@babel/plugin-transform-unicode-regex": "^7.24.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@graphql-tools/wrap": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-9.4.2.tgz", - "integrity": "sha512-DFcd9r51lmcEKn0JW43CWkkI2D6T9XI1juW/Yo86i04v43O9w2/k4/nx2XTJv4Yv+iXwUw7Ok81PGltwGJSDSA==", - "dev": true, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dependencies": { - "@graphql-tools/delegate": "^9.0.31", - "@graphql-tools/schema": "^9.0.18", - "@graphql-tools/utils": "^9.2.1", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-typed-document-node/core": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", - "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@grpc/grpc-js": { - "version": "1.10.10", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.10.tgz", - "integrity": "sha512-HPa/K5NX6ahMoeBv15njAc/sfF4/jmiXLar9UlC2UfHFKZzsCVLc3wbe7+7qua7w9VPh2/L6EBxyAV7/E8Wftg==", + "node_modules/@babel/preset-react": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", + "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", "dependencies": { - "@grpc/proto-loader": "^0.7.13", - "@js-sdsl/ordered-map": "^4.4.2" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-transform-react-display-name": "^7.24.1", + "@babel/plugin-transform-react-jsx": "^7.23.4", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.24.1" }, "engines": { - "node": ">=12.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", - "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "node_modules/@babel/preset-typescript": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", + "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-syntax-jsx": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-typescript": "^7.24.1" }, "engines": { - "node": ">=6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@grpc/proto-loader/node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "node_modules/@babel/runtime": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", + "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", "dependencies": { - "@hapi/hoek": "^9.0.0" + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@hookform/resolvers": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.3.4.tgz", - "integrity": "sha512-o5cgpGOuJYrd+iMKvkttOclgwRW86EsWJZZRC23prf0uU2i48Htq4PuT73AVb9ionFyZrwYEITuOFGF+BydEtQ==", - "peerDependencies": { - "react-hook-form": "^7.0.0" + "node_modules/@babel/runtime-corejs3": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.1.tgz", + "integrity": "sha512-T9ko/35G+Bkl+win48GduaPlhSlOjjE5s1TeiEcD+QpxlLQnoEfb/nO/T+TQqkm+ipFwORn+rB8w14iJ/uD0bg==", + "dependencies": { + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "devOptional": true, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=6.9.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, + "node_modules/@babel/traverse": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, + "node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dependencies": { - "brace-expansion": "^1.1.7" + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, "engines": { - "node": "*" + "node": ">=6.9.0" } }, - "node_modules/@humanwhocodes/module-importer": { + "node_modules/@base2/pretty-print-object": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "devOptional": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } + "resolved": "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz", + "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==", + "dev": true }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "devOptional": true + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true }, - "node_modules/@internationalized/date": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.2.tgz", - "integrity": "sha512-vo1yOMUt2hzp63IutEaTUxROdvQg1qlMRsbCvbay2AK2Gai7wIgCyK5weEX3nHkiLgo4qCXHijFNC/ILhlRpOQ==", + "node_modules/@braintree/sanitize-url": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz", + "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==", + "dev": true + }, + "node_modules/@bull-board/api": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@bull-board/api/-/api-4.12.2.tgz", + "integrity": "sha512-efF8K1pvfEEft2ELQwCBe/a225vHufCjM2hfcyvmIG/SUX6TlKQFUFZ1+KV0wenD9wxvUVb5wxUu6on+HrZiVg==", "dependencies": { - "@swc/helpers": "^0.5.0" + "redis-info": "^3.0.8" } }, - "node_modules/@internationalized/message": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.2.tgz", - "integrity": "sha512-MHAWsZWz8jf6jFPZqpTudcCM361YMtPIRu9CXkYmKjJ/0R3pQRScV5C0zS+Qi50O5UAm8ecKhkXx6mWDDcF6/g==", + "node_modules/@bull-board/express": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@bull-board/express/-/express-4.12.2.tgz", + "integrity": "sha512-Y/pzCtQoxvLyioiNYLKKgxslccV+7dyTy4qCGAXyUbAuOaav+U4tbfWNcZYaMSkr/1gg0m/6S/qf+xn2vAsDkQ==", "dependencies": { - "@swc/helpers": "^0.5.0", - "intl-messageformat": "^10.1.0" + "@bull-board/api": "4.12.2", + "@bull-board/ui": "4.12.2", + "ejs": "3.1.7", + "express": "4.17.3" } }, - "node_modules/@internationalized/number": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.5.1.tgz", - "integrity": "sha512-N0fPU/nz15SwR9IbfJ5xaS9Ss/O5h1sVXMZf43vc9mxEG48ovglvvzBjF53aHlq20uoR6c+88CrIXipU/LSzwg==", + "node_modules/@bull-board/express/node_modules/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", "dependencies": { - "@swc/helpers": "^0.5.0" + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/@internationalized/string": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.1.tgz", - "integrity": "sha512-vWQOvRIauvFMzOO+h7QrdsJmtN1AXAFVcaLWP9AseRN2o7iHceZ6bIXhBD4teZl8i91A3gxKnWBlGgjCwU6MFQ==", + "node_modules/@bull-board/express/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@bull-board/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "@swc/helpers": "^0.5.0" + "ms": "2.0.0" } }, - "node_modules/@ioredis/commands": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", - "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" + "node_modules/@bull-board/express/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, + "node_modules/@bull-board/express/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "engines": { - "node": ">=12" + "node": ">= 0.6" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" + "node_modules/@bull-board/express/node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + }, + "node_modules/@bull-board/express/node_modules/express": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">= 0.10.0" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, + "node_modules/@bull-board/express/node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dependencies": { - "ansi-regex": "^6.0.1" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">= 0.8" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "devOptional": true, + "node_modules/@bull-board/express/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "devOptional": true, + "node_modules/@bull-board/express/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "dependencies": { - "sprintf-js": "~1.0.2" + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "devOptional": true, + "node_modules/@bull-board/express/node_modules/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", "engines": { - "node": ">=6" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "devOptional": true, + "node_modules/@bull-board/express/node_modules/raw-body": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "devOptional": true, + "node_modules/@bull-board/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/@bull-board/express/node_modules/send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "devOptional": true, + "node_modules/@bull-board/express/node_modules/serve-static": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", "dependencies": { - "p-locate": "^4.1.0" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "devOptional": true, - "dependencies": { - "p-try": "^2.0.0" - }, + "node_modules/@bull-board/express/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "devOptional": true, + "node_modules/@bull-board/ui": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@bull-board/ui/-/ui-4.12.2.tgz", + "integrity": "sha512-jB/OOEhg+DUL6ssmtQYTK+iYd3iy68bbozOp+q2xVUC4V7zeFmYF25sIApYFTNfbjuUMesAVOiX4u0gNEo/J7w==", "dependencies": { - "p-limit": "^2.2.0" + "@bull-board/api": "4.12.2" + } + }, + "node_modules/@chromatic-com/storybook": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-1.9.0.tgz", + "integrity": "sha512-vYQ+TcfktEE3GHnLZXHCzXF/sN9dw+KivH8a5cmPyd9YtQs7fZtHrEgsIjWpYycXiweKMo1Lm1RZsjxk8DH3rA==", + "dev": true, + "dependencies": { + "chromatic": "^11.4.0", + "filesize": "^10.0.12", + "jsonfile": "^6.1.0", + "react-confetti": "^6.1.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=16.0.0", + "yarn": ">=1.22.18" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "devOptional": true - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "devOptional": true, + "node_modules/@chromatic-com/storybook/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "devOptional": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, + "node_modules/@chromatic-com/storybook/node_modules/filesize": { + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", + "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==", + "dev": true, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 10.4.0" } }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "node_modules/@chromatic-com/storybook/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "node_modules/@codegouvfr/react-dsfr": { + "version": "1.13.8", + "resolved": "https://registry.npmjs.org/@codegouvfr/react-dsfr/-/react-dsfr-1.13.8.tgz", + "integrity": "sha512-shZxu0T2czxMRzgzbpyJLqVWZQHqO+8KPdhxYH3Btph+hvBzZD0vE0XChghmIwVd7m71qHkWk0ji1/74iVTxRQ==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "tsafe": "^1.7.2", + "yargs-parser": "^21.1.1" }, - "engines": { - "node": ">=10" + "bin": { + "copy-dsfr-to-public": "bin/copy-dsfr-to-public.js", + "only-include-used-icons": "bin/only-include-used-icons.js", + "react-dsfr": "bin/react-dsfr.js" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@gouvfr/dsfr-chart": "^1.0.0" + }, + "peerDependenciesMeta": { + "@gouvfr/dsfr-chart": { + "optional": true + } } }, - "node_modules/@jest/console/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, "engines": { - "node": ">=8" + "node": ">=0.1.90" } }, - "node_modules/@jest/console/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "devOptional": true, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.1.tgz", + "integrity": "sha512-VtVb5DS+0hRIprU2CO6ZQjK2Zg4QU5HrDM1+ix6rT0umsYvFvatMAnf97NHZlVWDaaLlx7GRfR/7FikANiM2Fg==" + }, + "node_modules/@docsearch/react": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.1.tgz", + "integrity": "sha512-qXZkEPvybVhSXj0K7U3bXc233tk5e8PfhoZ6MhPOiik/qUQxYC+Dn9DnoS7CxHQQhHfCvTiN0eY9M12oRghEXw==", + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.6.1", + "algoliasearch": "^4.19.1" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" }, "peerDependenciesMeta": { - "node-notifier": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { "optional": true } } }, - "node_modules/@jest/core/node_modules/ansi-styles": { + "node_modules/@docusaurus/core": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.5.2.tgz", + "integrity": "sha512-4Z1WkhCSkX4KO0Fw5m/Vuc7Q3NxBG53NE5u59Rs96fWkMPZVSrzEPP16/Nk6cWb/shK7xXPndTmalJtw7twL/w==", + "dependencies": { + "@babel/core": "^7.23.3", + "@babel/generator": "^7.23.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.22.9", + "@babel/preset-env": "^7.22.9", + "@babel/preset-react": "^7.22.5", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@babel/runtime-corejs3": "^7.22.6", + "@babel/traverse": "^7.22.8", + "@docusaurus/cssnano-preset": "3.5.2", + "@docusaurus/logger": "3.5.2", + "@docusaurus/mdx-loader": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-common": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "autoprefixer": "^10.4.14", + "babel-loader": "^9.1.3", + "babel-plugin-dynamic-import-node": "^2.3.3", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "clean-css": "^5.3.2", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "copy-webpack-plugin": "^11.0.0", + "core-js": "^3.31.1", + "css-loader": "^6.8.1", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", + "del": "^6.1.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "html-minifier-terser": "^7.2.0", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.5.3", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "mini-css-extract-plugin": "^2.7.6", + "p-map": "^4.0.0", + "postcss": "^8.4.26", + "postcss-loader": "^7.3.3", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "^1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "rtl-detect": "^1.0.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.5", + "shelljs": "^0.8.5", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "url-loader": "^4.1.1", + "webpack": "^5.88.1", + "webpack-bundle-analyzer": "^4.9.0", + "webpack-dev-server": "^4.15.1", + "webpack-merge": "^5.9.0", + "webpackbar": "^5.0.2" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@mdx-js/react": "^3.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/core/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@docusaurus/core/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/@docusaurus/core/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -7355,11 +7735,26 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/core/node_modules/chalk": { + "node_modules/@docusaurus/core/node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/@docusaurus/core/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -7371,231 +7766,177 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/core/node_modules/has-flag": { + "node_modules/@docusaurus/core/node_modules/find-cache-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/core/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "devOptional": true, + "node_modules/@docusaurus/core/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/core/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "devOptional": true, + "node_modules/@docusaurus/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=8" } }, - "node_modules/@jest/core/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "devOptional": true + "node_modules/@docusaurus/core/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, - "node_modules/@jest/core/node_modules/supports-color": { + "node_modules/@docusaurus/core/node_modules/locate-path": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dependencies": { - "has-flag": "^4.0.0" + "p-locate": "^6.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/create-cache-key-function": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", - "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", - "dev": true, + "node_modules/@docusaurus/core/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "@jest/types": "^29.6.3" + "yallist": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "devOptional": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "devOptional": true, + "node_modules/@docusaurus/core/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" + "yocto-queue": "^1.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "devOptional": true, + "node_modules/@docusaurus/core/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dependencies": { - "jest-get-type": "^29.6.3" + "p-limit": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "devOptional": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, + "node_modules/@docusaurus/core/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "devOptional": true, + "node_modules/@docusaurus/core/node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" + "find-up": "^6.3.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "devOptional": true, + "node_modules/@docusaurus/core/node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "react": ">=15" } }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "node_modules/@docusaurus/core/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dependencies": { - "color-convert": "^2.0.1" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">=8" + "node": ">= 12.13.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "node_modules/@docusaurus/core/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "lru-cache": "^6.0.0" }, - "engines": { - "node": ">=10" + "bin": { + "semver": "bin/semver.js" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/@jest/reporters/node_modules/supports-color": { + "node_modules/@docusaurus/core/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -7603,92 +7944,47 @@ "node": ">=8" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "devOptional": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, + "node_modules/@docusaurus/core/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "devOptional": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "node": ">=12.20" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "devOptional": true, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.5.2.tgz", + "integrity": "sha512-D3KiQXOMA8+O0tqORBrTOEQyQxNIfPm9jEaJoALjjSjc2M/ZAWcUfPQEnwr2JB2TadHw2gqWgpZckQmrVWkytA==", "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.4.38", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18.0" } }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "devOptional": true, + "node_modules/@docusaurus/logger": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.5.2.tgz", + "integrity": "sha512-LHC540SGkeLfyT3RHK3gAMK6aS5TRqOD4R72BEU/DE2M/TY8WwEUAMY576UUc/oNJXv8pGhBmQB6N9p3pt8LQw==", "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" + "chalk": "^4.1.2", + "tslib": "^2.6.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18.0" } }, - "node_modules/@jest/transform/node_modules/ansi-styles": { + "node_modules/@docusaurus/logger/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -7699,11 +7995,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/transform/node_modules/chalk": { + "node_modules/@docusaurus/logger/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -7715,20 +8010,18 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/transform/node_modules/has-flag": { + "node_modules/@docusaurus/logger/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, "engines": { "node": ">=8" } }, - "node_modules/@jest/transform/node_modules/supports-color": { + "node_modules/@docusaurus/logger/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -7736,969 +8029,2139 @@ "node": ">=8" } }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@docusaurus/mdx-loader": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.5.2.tgz", + "integrity": "sha512-ku3xO9vZdwpiMIVd8BzWV0DCqGEbCP5zs1iHfKX50vw6jX8vQo0ylYo1YJMZyz6e+JFJ17HYHT5FzVidz2IflA==", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@docusaurus/logger": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^1.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.5.2.tgz", + "integrity": "sha512-Z+Xu3+2rvKef/YKTMxZHsEXp1y92ac0ngjDiExRdqGTmEKtCUpkbNYH8v5eXo5Ls+dnW88n6WTa+Q54kLOkwPg==", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "@docusaurus/types": "3.5.2", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "react": "*", + "react-dom": "*" } }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.5.2.tgz", + "integrity": "sha512-R7ghWnMvjSf+aeNDH0K4fjyQnt5L0KzUEnUhmf1e3jZrv3wogeytZNN6n7X8yHcMsuZHPOrctQhXWnmxu+IRRg==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@docusaurus/core": "3.5.2", + "@docusaurus/logger": "3.5.2", + "@docusaurus/mdx-loader": "3.5.2", + "@docusaurus/theme-common": "3.5.2", + "@docusaurus/types": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-common": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "cheerio": "1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "reading-time": "^1.5.0", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" }, "engines": { - "node": ">=10" + "node": ">=18.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@jest/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.5.2.tgz", + "integrity": "sha512-Bt+OXn/CPtVqM3Di44vHjE7rPCEsRCB/DMo2qoOuozB9f7+lsdrHvD0QCHdBs0uhz6deYJDppAr2VgqybKPlVQ==", + "dependencies": { + "@docusaurus/core": "3.5.2", + "@docusaurus/logger": "3.5.2", + "@docusaurus/mdx-loader": "3.5.2", + "@docusaurus/module-type-aliases": "3.5.2", + "@docusaurus/theme-common": "3.5.2", + "@docusaurus/types": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-common": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, "engines": { - "node": ">=8" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.5.2.tgz", + "integrity": "sha512-WzhHjNpoQAUz/ueO10cnundRz+VUtkjFhhaQ9jApyv1a46FPURO4cef89pyNIOMny1fjDz/NUN2z6Yi+5WUrCw==", "dependencies": { - "has-flag": "^4.0.0" + "@docusaurus/core": "3.5.2", + "@docusaurus/mdx-loader": "3.5.2", + "@docusaurus/types": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" }, "engines": { - "node": ">=8" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@josephg/resolvable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@josephg/resolvable/-/resolvable-1.0.1.tgz", - "integrity": "sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==" - }, - "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.3.0.tgz", - "integrity": "sha512-2D6y7fNvFmsLmRt6UCOFJPvFoPMJGT0Uh1Wg0RaigUp7kdQPs6yYn8Dmx6GZkOH/NW0yMTwRz/p0SRMMRo50vA==", - "dev": true, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.5.2.tgz", + "integrity": "sha512-kBK6GlN0itCkrmHuCS6aX1wmoWc5wpd5KJlqQ1FyrF0cLDnvsYSnh7+ftdwzt7G6lGBho8lrVwkkL9/iQvaSOA==", "dependencies": { - "glob": "^7.2.0", - "glob-promise": "^4.2.0", - "magic-string": "^0.27.0", - "react-docgen-typescript": "^2.2.2" + "@docusaurus/core": "3.5.2", + "@docusaurus/types": "3.5.2", + "@docusaurus/utils": "3.5.2", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^1.2.0", + "tslib": "^2.6.0" }, - "peerDependencies": { - "typescript": ">= 4.3.x", - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "engines": { + "node": ">=18.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.5.2.tgz", + "integrity": "sha512-rjEkJH/tJ8OXRE9bwhV2mb/WP93V441rD6XnM6MIluu7rk8qg38iSxS43ga2V2Q/2ib53PcqbDEJDG/yWQRJhQ==", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" + "@docusaurus/core": "3.5.2", + "@docusaurus/types": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "tslib": "^2.6.0" }, "engines": { - "node": ">=12" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.5.2.tgz", + "integrity": "sha512-lm8XL3xLkTPHFKKjLjEEAHUrW0SZBSHBE1I+i/tmYMBsjCcUB5UJ52geS5PSiOCFVR74tbPGcPHEV/gaaxFeSA==", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@docusaurus/core": "3.5.2", + "@docusaurus/types": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "@types/gtag.js": "^0.0.12", + "tslib": "^2.6.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.5.2.tgz", + "integrity": "sha512-QkpX68PMOMu10Mvgvr5CfZAzZQFx8WLlOiUQ/Qmmcl6mjGK6H21WLT5x7xDmcpCoKA/3CegsqIqBR+nA137lQg==", + "dependencies": { + "@docusaurus/core": "3.5.2", + "@docusaurus/types": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "tslib": "^2.6.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.5.2.tgz", + "integrity": "sha512-DnlqYyRAdQ4NHY28TfHuVk414ft2uruP4QWCH//jzpHjqvKyXjj2fmDtI8RPUBh9K8iZKFMHRnLtzJKySPWvFA==", + "dependencies": { + "@docusaurus/core": "3.5.2", + "@docusaurus/logger": "3.5.2", + "@docusaurus/types": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-common": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "node_modules/@docusaurus/preset-classic": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.5.2.tgz", + "integrity": "sha512-3ihfXQ95aOHiLB5uCu+9PRy2gZCeSZoDcqpnDvf3B+sTrMvMTr8qRUzBvWkoIqc82yG5prCboRjk1SVILKx6sg==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "@docusaurus/core": "3.5.2", + "@docusaurus/plugin-content-blog": "3.5.2", + "@docusaurus/plugin-content-docs": "3.5.2", + "@docusaurus/plugin-content-pages": "3.5.2", + "@docusaurus/plugin-debug": "3.5.2", + "@docusaurus/plugin-google-analytics": "3.5.2", + "@docusaurus/plugin-google-gtag": "3.5.2", + "@docusaurus/plugin-google-tag-manager": "3.5.2", + "@docusaurus/plugin-sitemap": "3.5.2", + "@docusaurus/theme-classic": "3.5.2", + "@docusaurus/theme-common": "3.5.2", + "@docusaurus/theme-search-algolia": "3.5.2", + "@docusaurus/types": "3.5.2" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "node_modules/@docusaurus/theme-classic": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.5.2.tgz", + "integrity": "sha512-XRpinSix3NBv95Rk7xeMF9k4safMkwnpSgThn0UNQNumKvmcIYjfkwfh2BhwYh/BxMXQHJ/PdmNh22TQFpIaYg==", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@docusaurus/core": "3.5.2", + "@docusaurus/mdx-loader": "3.5.2", + "@docusaurus/module-type-aliases": "3.5.2", + "@docusaurus/plugin-content-blog": "3.5.2", + "@docusaurus/plugin-content-docs": "3.5.2", + "@docusaurus/plugin-content-pages": "3.5.2", + "@docusaurus/theme-common": "3.5.2", + "@docusaurus/theme-translations": "3.5.2", + "@docusaurus/types": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-common": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "copy-text-to-clipboard": "^3.2.0", + "infima": "0.2.0-alpha.44", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.4.26", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "node_modules/@docusaurus/theme-classic/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" } }, - "node_modules/@juggle/resize-observer": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", - "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", - "dev": true - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" - }, - "node_modules/@mapbox/geojson-rewind": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", - "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", + "node_modules/@docusaurus/theme-classic/node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", "dependencies": { - "get-stream": "^6.0.1", - "minimist": "^1.2.6" + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" }, - "bin": { - "geojson-rewind": "geojson-rewind" + "peerDependencies": { + "react": ">=15" } }, - "node_modules/@mapbox/geojson-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz", - "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==" + "node_modules/@docusaurus/theme-common": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.5.2.tgz", + "integrity": "sha512-QXqlm9S6x9Ibwjs7I2yEDgsCocp708DrCrgHgKwg2n2AY0YQ6IjU0gAK35lHRLOvAoJUfCKpQAwUykB0R7+Eew==", + "dependencies": { + "@docusaurus/mdx-loader": "3.5.2", + "@docusaurus/module-type-aliases": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-common": "3.5.2", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0", + "react-dom": "^18.0.0" + } }, - "node_modules/@mapbox/jsonlint-lines-primitives": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", - "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", + "node_modules/@docusaurus/theme-common/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "node_modules/@mapbox/mapbox-gl-supported": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz", - "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==", + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.5.2.tgz", + "integrity": "sha512-qW53kp3VzMnEqZGjakaV90sst3iN1o32PH+nawv1uepROO8aEGxptcq2R5rsv7aBShSRbZwIobdvSYKsZ5pqvA==", + "dependencies": { + "@docsearch/react": "^3.5.2", + "@docusaurus/core": "3.5.2", + "@docusaurus/logger": "3.5.2", + "@docusaurus/plugin-content-docs": "3.5.2", + "@docusaurus/theme-common": "3.5.2", + "@docusaurus/theme-translations": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "algoliasearch": "^4.18.0", + "algoliasearch-helper": "^3.13.3", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, "peerDependencies": { - "mapbox-gl": ">=0.32.1 <2.0.0" + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "node_modules/@docusaurus/theme-search-algolia/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.5.2.tgz", + "integrity": "sha512-GPZLcu4aT1EmqSTmbdpVrDENGR2yObFEX8ssEFYTCiAIVc0EihNSdOIBTazUvgNqwvnoU1A8vIs1xyzc3LITTw==", "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" + "engines": { + "node": ">=18.0" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/@docusaurus/types": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.2.tgz", + "integrity": "sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==", "dependencies": { - "debug": "4" + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" }, - "engines": { - "node": ">= 6.0.0" + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "node_modules/@docusaurus/utils": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.5.2.tgz", + "integrity": "sha512-33QvcNFh+Gv+C2dP9Y9xWEzMgf3JzrpL2nW9PopidiohS1nDcyknKRx2DWaFvyVTTYIkkABVSr073VTj/NITNA==", + "dependencies": { + "@docusaurus/logger": "3.5.2", + "@docusaurus/utils-common": "3.5.2", + "@svgr/webpack": "^8.1.0", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, "engines": { - "node": ">=8" + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/@docusaurus/utils-common": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.5.2.tgz", + "integrity": "sha512-i0AZjHiRgJU6d7faQngIhuHKNrszpL/SHQPgF1zH4H+Ij6E9NBYGy6pkcGWToIv7IVPbs+pQLh1P3whn0gWXVg==", "dependencies": { - "agent-base": "6", - "debug": "4" + "tslib": "^2.6.0" }, "engines": { - "node": ">= 6" + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@docusaurus/utils-validation": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.5.2.tgz", + "integrity": "sha512-m+Foq7augzXqB6HufdS139PFxDC5d5q2QKZy8q0qYYvGdI6nnlNsGH4cIGsgBnV7smz+mopl3g4asbSDvMV0jA==", "dependencies": { - "yallist": "^4.0.0" + "@docusaurus/logger": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-common": "3.5.2", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" }, "engines": { - "node": ">=10" + "node": ">=18.0" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/@elastic/elasticsearch": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-7.13.0.tgz", + "integrity": "sha512-WgwLWo2p9P2tdqzBGX9fHeG8p5IOTXprXNTECQG2mJ7z9n93N5AFBJpEw4d35tWWeCWi9jI13A2wzQZH7XZ/xw==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "debug": "^4.3.1", + "hpagent": "^0.1.1", + "ms": "^2.1.3", + "secure-json-parse": "^2.4.0" }, "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/@mapbox/point-geometry": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", - "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" - }, - "node_modules/@mapbox/tiny-sdf": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", - "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==" - }, - "node_modules/@mapbox/unitbezier": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", - "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" - }, - "node_modules/@mapbox/vector-tile": { + "node_modules/@emnapi/core": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", - "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.3.1.tgz", + "integrity": "sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==", + "dev": true, "dependencies": { - "@mapbox/point-geometry": "~0.1.0" + "@emnapi/wasi-threads": "1.0.1", + "tslib": "^2.4.0" } }, - "node_modules/@mapbox/whoots-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", - "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", - "engines": { - "node": ">=6.0.0" + "node_modules/@emnapi/runtime": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/@mdx-js/mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", - "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", + "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", + "dev": true, "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdx": "^2.0.0", - "collapse-white-space": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-build-jsx": "^3.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-util-to-js": "^2.0.0", - "estree-walker": "^3.0.0", - "hast-util-to-estree": "^3.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "markdown-extensions": "^2.0.0", - "periscopic": "^3.0.0", - "remark-mdx": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "source-map": "^0.7.0", - "unified": "^11.0.0", - "unist-util-position-from-estree": "^2.0.0", - "unist-util-stringify-position": "^4.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "tslib": "^2.4.0" } }, - "node_modules/@mdx-js/react": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.1.tgz", - "integrity": "sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==", + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", "dependencies": { - "@types/mdx": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" } }, - "node_modules/@mole-inc/bin-wrapper": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@mole-inc/bin-wrapper/-/bin-wrapper-8.0.1.tgz", - "integrity": "sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA==", - "dev": true, + "node_modules/@emotion/babel-plugin/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "dependencies": { - "bin-check": "^4.1.0", - "bin-version-check": "^5.0.0", - "content-disposition": "^0.5.4", - "ext-name": "^5.0.0", - "file-type": "^17.1.6", - "filenamify": "^5.0.2", - "got": "^11.8.5", - "os-filter-obj": "^2.0.0" + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10", + "npm": ">=6" } }, - "node_modules/@mongodb-js/saslprep": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.5.tgz", - "integrity": "sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==", - "optional": true, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", "dependencies": { - "sparse-bitfield": "^3.0.3" + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" } }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz", - "integrity": "sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ] + "node_modules/@emotion/cache/node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz", - "integrity": "sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==", + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", + "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", "cpu": [ "x64" ], "optional": true, "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz", - "integrity": "sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==", - "cpu": [ - "arm" + "linux" ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "devOptional": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "devOptional": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, "optional": true, - "os": [ - "linux" - ] + "peer": true, + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz", - "integrity": "sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "optional": true, - "os": [ - "linux" - ] + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz", - "integrity": "sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "optional": true, - "os": [ - "linux" - ] + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/core": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", + "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "devOptional": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "devOptional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "devOptional": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "devOptional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "devOptional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "devOptional": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.1.tgz", + "integrity": "sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@faker-js/faker": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz", + "integrity": "sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==", + "dev": true, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "node_modules/@fast-csv/format/node_modules/@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" + }, + "node_modules/@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/@fast-csv/parse/node_modules/@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" + }, + "node_modules/@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "dependencies": { + "@floating-ui/utils": "^0.2.1" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, + "node_modules/@formatjs/ecma402-abstract": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz", + "integrity": "sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==", + "dependencies": { + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/fast-memoize": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", + "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.6.tgz", + "integrity": "sha512-etVau26po9+eewJKYoiBKP6743I1br0/Ie00Pb/S/PtmYfmjTcOn2YCh2yNkSZI12h6Rg+BOgQYborXk46BvkA==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.18.2", + "@formatjs/icu-skeleton-parser": "1.8.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.0.tgz", + "integrity": "sha512-QWLAYvM0n8hv7Nq5BEs4LKIjevpVpbGLAJgOaYzg9wABEoX1j0JO1q2/jVkO6CVlq0dbsxZCngS5aXbysYueqA==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.18.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-localematcher": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", + "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@fullhuman/postcss-purgecss": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.3.0.tgz", + "integrity": "sha512-qnKm5dIOyPGJ70kPZ5jiz0I9foVOic0j+cOzNDoo8KoCf6HjicIZ99UfO2OmE7vCYSKAAepEwJtNzpiiZAh9xw==", + "dependencies": { + "postcss": "7.0.32", + "purgecss": "^2.3.0" + } + }, + "node_modules/@fullhuman/postcss-purgecss/node_modules/postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + }, + "node_modules/@fullhuman/postcss-purgecss/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@fullhuman/postcss-purgecss/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@graphql-codegen/cli": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-3.3.1.tgz", + "integrity": "sha512-4Es8Y9zFeT0Zx2qRL7L3qXDbbqvXK6aID+8v8lP6gaYD+uWx3Jd4Hsq5vxwVBR+6flm0BW/C85Qm0cvmT7O6LA==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.18.13", + "@babel/template": "^7.18.10", + "@babel/types": "^7.18.13", + "@graphql-codegen/core": "^3.1.0", + "@graphql-codegen/plugin-helpers": "^4.2.0", + "@graphql-tools/apollo-engine-loader": "^7.3.6", + "@graphql-tools/code-file-loader": "^7.3.17", + "@graphql-tools/git-loader": "^7.2.13", + "@graphql-tools/github-loader": "^7.3.20", + "@graphql-tools/graphql-file-loader": "^7.5.0", + "@graphql-tools/json-file-loader": "^7.4.1", + "@graphql-tools/load": "^7.8.0", + "@graphql-tools/prisma-loader": "^7.2.49", + "@graphql-tools/url-loader": "^7.13.2", + "@graphql-tools/utils": "^9.0.0", + "@parcel/watcher": "^2.1.0", + "@whatwg-node/fetch": "^0.8.0", + "chalk": "^4.1.0", + "cosmiconfig": "^7.0.0", + "debounce": "^1.2.0", + "detect-indent": "^6.0.0", + "graphql-config": "^4.5.0", + "inquirer": "^8.0.0", + "is-glob": "^4.0.1", + "jiti": "^1.17.1", + "json-to-pretty-yaml": "^1.2.2", + "listr2": "^4.0.5", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.5", + "shell-quote": "^1.7.3", + "string-env-interpolation": "^1.0.1", + "ts-log": "^2.2.3", + "tslib": "^2.4.0", + "yaml": "^1.10.0", + "yargs": "^17.0.0" + }, + "bin": { + "gql-gen": "cjs/bin.js", + "graphql-code-generator": "cjs/bin.js", + "graphql-codegen": "cjs/bin.js", + "graphql-codegen-esm": "esm/bin.js" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-codegen/core": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-3.1.0.tgz", + "integrity": "sha512-DH1/yaR7oJE6/B+c6ZF2Tbdh7LixF1K8L+8BoSubjNyQ8pNwR4a70mvc1sv6H7qgp6y1bPQ9tKE+aazRRshysw==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^4.1.0", + "@graphql-tools/schema": "^9.0.0", + "@graphql-tools/utils": "^9.1.1", + "tslib": "~2.5.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/core/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dev": true + }, + "node_modules/@graphql-codegen/plugin-helpers": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-4.2.0.tgz", + "integrity": "sha512-THFTCfg+46PXlXobYJ/OoCX6pzjI+9woQqCjdyKtgoI0tn3Xq2HUUCiidndxUpEYVrXb5pRiRXb7b/ZbMQqD0A==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^9.0.0", + "change-case-all": "1.0.15", + "common-tags": "1.8.2", + "import-from": "4.0.0", + "lodash": "~4.17.0", + "tslib": "~2.5.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/plugin-helpers/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dev": true + }, + "node_modules/@graphql-codegen/schema-ast": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-3.0.1.tgz", + "integrity": "sha512-rTKTi4XiW4QFZnrEqetpiYEWVsOFNoiR/v3rY9mFSttXFbIwNXPme32EspTiGWmEEdHY8UuTDtZN3vEcs/31zw==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^4.1.0", + "@graphql-tools/utils": "^9.0.0", + "tslib": "~2.5.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/schema-ast/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dev": true + }, + "node_modules/@graphql-codegen/typescript": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-3.0.4.tgz", + "integrity": "sha512-x4O47447DZrWNtE/l5CU9QzzW4m1RbmCEdijlA3s2flG/y1Ckqdemob4CWfilSm5/tZ3w1junVDY616RDTSvZw==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^4.2.0", + "@graphql-codegen/schema-ast": "^3.0.1", + "@graphql-codegen/visitor-plugin-common": "3.1.1", + "auto-bind": "~4.0.0", + "tslib": "~2.5.0" + }, + "peerDependencies": { + "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-operations": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-3.0.4.tgz", + "integrity": "sha512-6yE2OL2+WJ1vd5MwFEGXpaxsFGzjAGUytPVHDML3Bi3TwP1F3lnQlIko4untwvHW0JhZEGQ7Ck30H9HjcxpdKA==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^4.2.0", + "@graphql-codegen/typescript": "^3.0.4", + "@graphql-codegen/visitor-plugin-common": "3.1.1", + "auto-bind": "~4.0.0", + "tslib": "~2.5.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-operations/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dev": true + }, + "node_modules/@graphql-codegen/typescript-resolvers": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-resolvers/-/typescript-resolvers-3.2.1.tgz", + "integrity": "sha512-2ZIHk5J6HTuylse5ZIxw+aega54prHxvj7vM8hiKJ6vejZ94kvVPAq4aWmSFOkZ5lqU3YnM/ZyWfnhT5CUDj1g==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^4.2.0", + "@graphql-codegen/typescript": "^3.0.4", + "@graphql-codegen/visitor-plugin-common": "3.1.1", + "@graphql-tools/utils": "^9.0.0", + "auto-bind": "~4.0.0", + "tslib": "~2.5.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-resolvers/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dev": true + }, + "node_modules/@graphql-codegen/typescript/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dev": true + }, + "node_modules/@graphql-codegen/visitor-plugin-common": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-3.1.1.tgz", + "integrity": "sha512-uAfp+zu/009R3HUAuTK2AamR1bxIltM6rrYYI6EXSmkM3rFtFsLTuJhjUDj98HcUCszJZrADppz8KKLGRUVlNg==", + "dev": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^4.2.0", + "@graphql-tools/optimize": "^1.3.0", + "@graphql-tools/relay-operation-optimizer": "^6.5.0", + "@graphql-tools/utils": "^9.0.0", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "dependency-graph": "^0.11.0", + "graphql-tag": "^2.11.0", + "parse-filepath": "^1.0.2", + "tslib": "~2.5.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/visitor-plugin-common/node_modules/tslib": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dev": true + }, + "node_modules/@graphql-tools/apollo-engine-loader": { + "version": "7.3.26", + "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-7.3.26.tgz", + "integrity": "sha512-h1vfhdJFjnCYn9b5EY1Z91JTF0KB3hHVJNQIsiUV2mpQXZdeOXQoaWeYEKaiI5R6kwBw5PP9B0fv3jfUIG8LyQ==", + "dev": true, + "dependencies": { + "@ardatan/sync-fetch": "^0.0.1", + "@graphql-tools/utils": "^9.2.1", + "@whatwg-node/fetch": "^0.8.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/batch-execute": { + "version": "8.5.22", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-8.5.22.tgz", + "integrity": "sha512-hcV1JaY6NJQFQEwCKrYhpfLK8frSXDbtNMoTur98u10Cmecy1zrqNKSqhEyGetpgHxaJRqszGzKeI3RuroDN6A==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^9.2.1", + "dataloader": "^2.2.2", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/code-file-loader": { + "version": "7.3.23", + "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-7.3.23.tgz", + "integrity": "sha512-8Wt1rTtyTEs0p47uzsPJ1vAtfAx0jmxPifiNdmo9EOCuUPyQGEbMaik/YkqZ7QUFIEYEQu+Vgfo8tElwOPtx5Q==", + "dev": true, + "dependencies": { + "@graphql-tools/graphql-tag-pluck": "7.5.2", + "@graphql-tools/utils": "^9.2.1", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/delegate": { + "version": "9.0.35", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-9.0.35.tgz", + "integrity": "sha512-jwPu8NJbzRRMqi4Vp/5QX1vIUeUPpWmlQpOkXQD2r1X45YsVceyUUBnktCrlJlDB4jPRVy7JQGwmYo3KFiOBMA==", + "dev": true, + "dependencies": { + "@graphql-tools/batch-execute": "^8.5.22", + "@graphql-tools/executor": "^0.0.20", + "@graphql-tools/schema": "^9.0.19", + "@graphql-tools/utils": "^9.2.1", + "dataloader": "^2.2.2", + "tslib": "^2.5.0", + "value-or-promise": "^1.0.12" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-0.0.20.tgz", + "integrity": "sha512-GdvNc4vszmfeGvUqlcaH1FjBoguvMYzxAfT6tDd4/LgwymepHhinqLNA5otqwVLW+JETcDaK7xGENzFomuE6TA==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^9.2.1", + "@graphql-typed-document-node/core": "3.2.0", + "@repeaterjs/repeater": "^3.0.4", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-graphql-ws": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-0.0.14.tgz", + "integrity": "sha512-P2nlkAsPZKLIXImFhj0YTtny5NQVGSsKnhi7PzXiaHSXc6KkzqbWZHKvikD4PObanqg+7IO58rKFpGXP7eeO+w==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^9.2.1", + "@repeaterjs/repeater": "3.0.4", + "@types/ws": "^8.0.0", + "graphql-ws": "5.12.1", + "isomorphic-ws": "5.0.0", + "tslib": "^2.4.0", + "ws": "8.13.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-graphql-ws/node_modules/@repeaterjs/repeater": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.4.tgz", + "integrity": "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==", + "dev": true + }, + "node_modules/@graphql-tools/executor-graphql-ws/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@graphql-tools/executor-http": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-0.1.10.tgz", + "integrity": "sha512-hnAfbKv0/lb9s31LhWzawQ5hghBfHS+gYWtqxME6Rl0Aufq9GltiiLBcl7OVVOnkLF0KhwgbYP1mB5VKmgTGpg==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^9.2.1", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/fetch": "^0.8.1", + "dset": "^3.1.2", + "extract-files": "^11.0.0", + "meros": "^1.2.1", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-legacy-ws": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-0.0.11.tgz", + "integrity": "sha512-4ai+NnxlNfvIQ4c70hWFvOZlSUN8lt7yc+ZsrwtNFbFPH/EroIzFMapAxM9zwyv9bH38AdO3TQxZ5zNxgBdvUw==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^9.2.1", + "@types/ws": "^8.0.0", + "isomorphic-ws": "5.0.0", + "tslib": "^2.4.0", + "ws": "8.13.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-legacy-ws/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@graphql-tools/git-loader": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-7.3.0.tgz", + "integrity": "sha512-gcGAK+u16eHkwsMYqqghZbmDquh8QaO24Scsxq+cVR+vx1ekRlsEiXvu+yXVDbZdcJ6PBIbeLcQbEu+xhDLmvQ==", + "dev": true, + "dependencies": { + "@graphql-tools/graphql-tag-pluck": "7.5.2", + "@graphql-tools/utils": "^9.2.1", + "is-glob": "4.0.3", + "micromatch": "^4.0.4", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/github-loader": { + "version": "7.3.28", + "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-7.3.28.tgz", + "integrity": "sha512-OK92Lf9pmxPQvjUNv05b3tnVhw0JRfPqOf15jZjyQ8BfdEUrJoP32b4dRQQem/wyRL24KY4wOfArJNqzpsbwCA==", + "dev": true, + "dependencies": { + "@ardatan/sync-fetch": "^0.0.1", + "@graphql-tools/executor-http": "^0.1.9", + "@graphql-tools/graphql-tag-pluck": "^7.4.6", + "@graphql-tools/utils": "^9.2.1", + "@whatwg-node/fetch": "^0.8.0", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-file-loader": { + "version": "7.5.17", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-7.5.17.tgz", + "integrity": "sha512-hVwwxPf41zOYgm4gdaZILCYnKB9Zap7Ys9OhY1hbwuAuC4MMNY9GpUjoTU3CQc3zUiPoYStyRtUGkHSJZ3HxBw==", + "dev": true, + "dependencies": { + "@graphql-tools/import": "6.7.18", + "@graphql-tools/utils": "^9.2.1", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-tag-pluck": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-7.5.2.tgz", + "integrity": "sha512-RW+H8FqOOLQw0BPXaahYepVSRjuOHw+7IL8Opaa5G5uYGOBxoXR7DceyQ7BcpMgktAOOmpDNQ2WtcboChOJSRA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.16.8", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8", + "@graphql-tools/utils": "^9.2.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/import": { + "version": "6.7.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-6.7.18.tgz", + "integrity": "sha512-XQDdyZTp+FYmT7as3xRWH/x8dx0QZA2WZqfMF5EWb36a0PiH7WwlRQYIdyYXj8YCLpiWkeBXgBRHmMnwEYR8iQ==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^9.2.1", + "resolve-from": "5.0.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/json-file-loader": { + "version": "7.4.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-7.4.18.tgz", + "integrity": "sha512-AJ1b6Y1wiVgkwsxT5dELXhIVUPs/u3VZ8/0/oOtpcoyO/vAeM5rOvvWegzicOOnQw8G45fgBRMkkRfeuwVt6+w==", + "dev": true, + "dependencies": { + "@graphql-tools/utils": "^9.2.1", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/load": { + "version": "7.8.14", + "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-7.8.14.tgz", + "integrity": "sha512-ASQvP+snHMYm+FhIaLxxFgVdRaM0vrN9wW2BKInQpktwWTXVyk+yP5nQUCEGmn0RTdlPKrffBaigxepkEAJPrg==", + "dev": true, + "dependencies": { + "@graphql-tools/schema": "^9.0.18", + "@graphql-tools/utils": "^9.2.1", + "p-limit": "3.1.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/load-files": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/load-files/-/load-files-6.6.1.tgz", + "integrity": "sha512-nd4GOjdD68bdJkHfRepILb0gGwF63mJI7uD4oJuuf2Kzeq8LorKa6WfyxUhdMuLmZhnx10zdAlWPfwv1NOAL4Q==", + "dependencies": { + "globby": "11.1.0", + "tslib": "^2.4.0", + "unixify": "1.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz", - "integrity": "sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ] + "node_modules/@graphql-tools/merge": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.4.2.tgz", + "integrity": "sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==", + "dependencies": { + "@graphql-tools/utils": "^9.2.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } }, - "node_modules/@ndelangen/get-tarball": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@ndelangen/get-tarball/-/get-tarball-3.0.9.tgz", - "integrity": "sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==", + "node_modules/@graphql-tools/optimize": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-1.4.0.tgz", + "integrity": "sha512-dJs/2XvZp+wgHH8T5J2TqptT9/6uVzIYvA6uFACha+ufvdMBedkfR4b4GbT8jAKLRARiqRTxy3dctnwkTM2tdw==", "dev": true, "dependencies": { - "gunzip-maybe": "^1.4.2", - "pump": "^3.0.0", - "tar-fs": "^2.1.1" + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@graphql-tools/prisma-loader": { + "version": "7.2.72", + "resolved": "https://registry.npmjs.org/@graphql-tools/prisma-loader/-/prisma-loader-7.2.72.tgz", + "integrity": "sha512-0a7uV7Fky6yDqd0tI9+XMuvgIo6GAqiVzzzFV4OSLry4AwiQlI3igYseBV7ZVOGhedOTqj/URxjpiv07hRcwag==", + "dev": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@graphql-tools/url-loader": "^7.17.18", + "@graphql-tools/utils": "^9.2.1", + "@types/js-yaml": "^4.0.0", + "@types/json-stable-stringify": "^1.0.32", + "@whatwg-node/fetch": "^0.8.2", + "chalk": "^4.1.0", + "debug": "^4.3.1", + "dotenv": "^16.0.0", + "graphql-request": "^6.0.0", + "http-proxy-agent": "^6.0.0", + "https-proxy-agent": "^6.0.0", + "jose": "^4.11.4", + "js-yaml": "^4.0.0", + "json-stable-stringify": "^1.0.1", + "lodash": "^4.17.20", + "scuid": "^1.1.0", + "tslib": "^2.4.0", + "yaml-ast-parser": "^0.0.43" }, - "engines": { - "node": ">= 8" + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@graphql-tools/prisma-loader/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">= 8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@graphql-tools/prisma-loader/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@nrwl/cypress": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nrwl/cypress/-/cypress-18.2.2.tgz", - "integrity": "sha512-sQfFgeVeJtiRTtiHsaSo32JHdhL1ARU64AKRSJFoEjAMml4IVvsKqaKGqE100SMU73Zp9rDEGdyT+SdPmthjFA==", + "node_modules/@graphql-tools/prisma-loader/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "@nx/cypress": "18.2.2" + "engines": { + "node": ">=8" } }, - "node_modules/@nrwl/devkit": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-18.0.7.tgz", - "integrity": "sha512-oUhwGI6JkrH9HHP+Uw8rV7uEV6o4uzrHASnhrRfs4CiaPLvSnO0fheomyIRdEuXWI3/ME9Q7Q5GvrGyqSjk+CA==", + "node_modules/@graphql-tools/prisma-loader/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "@nx/devkit": "18.0.7" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@nrwl/esbuild": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nrwl/esbuild/-/esbuild-18.0.7.tgz", - "integrity": "sha512-2VUNQPdLdE0TRnYR5t4tlbCLApq7wSp1poVG4L4edo0n5gf0iq1W+b01YOKzSr4fcfGmiNr2EyV9eG4CJWK6Lw==", + "node_modules/@graphql-tools/relay-operation-optimizer": { + "version": "6.5.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.5.18.tgz", + "integrity": "sha512-mc5VPyTeV+LwiM+DNvoDQfPqwQYhPV/cl5jOBjTgSniyaq8/86aODfMkrE2OduhQ5E00hqrkuL2Fdrgk0w1QJg==", "dev": true, "dependencies": { - "@nx/esbuild": "18.0.7" + "@ardatan/relay-compiler": "12.0.0", + "@graphql-tools/utils": "^9.2.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@nrwl/eslint-plugin-nx": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-18.0.7.tgz", - "integrity": "sha512-uPHbwQkVvMRt7VNtU+MMXjcOStSwW+IurgjWNFe+K5zF4FhUmZI8i33UynOI1wwYzShie1H7zWHiDlgh3KVRqA==", - "dev": true, + "node_modules/@graphql-tools/schema": { + "version": "9.0.19", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.19.tgz", + "integrity": "sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==", "dependencies": { - "@nx/eslint-plugin": "18.0.7" + "@graphql-tools/merge": "^8.4.1", + "@graphql-tools/utils": "^9.2.1", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@nrwl/jest": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nrwl/jest/-/jest-18.0.7.tgz", - "integrity": "sha512-u+1wdfvRZ+MF5bn2mbj8TUGaxAyrRJZN1xaFEsupfYP5rCHTcAhmvVSWqviB9RxhusxoLm9W2Ne+t/wD1cUsyA==", + "node_modules/@graphql-tools/url-loader": { + "version": "7.17.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-7.17.18.tgz", + "integrity": "sha512-ear0CiyTj04jCVAxi7TvgbnGDIN2HgqzXzwsfcqiVg9cvjT40NcMlZ2P1lZDgqMkZ9oyLTV8Bw6j+SyG6A+xPw==", "dev": true, "dependencies": { - "@nx/jest": "18.0.7" + "@ardatan/sync-fetch": "^0.0.1", + "@graphql-tools/delegate": "^9.0.31", + "@graphql-tools/executor-graphql-ws": "^0.0.14", + "@graphql-tools/executor-http": "^0.1.7", + "@graphql-tools/executor-legacy-ws": "^0.0.11", + "@graphql-tools/utils": "^9.2.1", + "@graphql-tools/wrap": "^9.4.2", + "@types/ws": "^8.0.0", + "@whatwg-node/fetch": "^0.8.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.11", + "ws": "^8.12.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@nrwl/js": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nrwl/js/-/js-18.0.7.tgz", - "integrity": "sha512-YxoyvjeQeQ7zejdZfJyne/xQkov9ifb4czC0JKgWRpfCWyr9YbsOiqEQ+QJDwU2APCpVy3pRjOghHFAAl9QmlQ==", - "dev": true, + "node_modules/@graphql-tools/utils": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz", + "integrity": "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==", "dependencies": { - "@nx/js": "18.0.7" + "@graphql-typed-document-node/core": "^3.1.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@nrwl/node": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nrwl/node/-/node-18.0.7.tgz", - "integrity": "sha512-+AkYlEQcK7CsB0CpEtJ/f3HWhokdKEEzY5+frAYPpWu89YFdDsEcDUEcUa+9uJHgWykJ16ayNPzyRlnl0W3EzA==", + "node_modules/@graphql-tools/wrap": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-9.4.2.tgz", + "integrity": "sha512-DFcd9r51lmcEKn0JW43CWkkI2D6T9XI1juW/Yo86i04v43O9w2/k4/nx2XTJv4Yv+iXwUw7Ok81PGltwGJSDSA==", "dev": true, "dependencies": { - "@nx/node": "18.0.7" + "@graphql-tools/delegate": "^9.0.31", + "@graphql-tools/schema": "^9.0.18", + "@graphql-tools/utils": "^9.2.1", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@nrwl/react": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nrwl/react/-/react-18.0.7.tgz", - "integrity": "sha512-GeiqkK8qPCPyvZudDdheXjf1kHrWX0LAK5732kv3KqRB29eqdLTlGyPNa5/JI2mJtondD1RcxKAU+1QyR7QQ3Q==", - "dev": true, - "dependencies": { - "@nx/react": "18.0.7" + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@nrwl/storybook": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nrwl/storybook/-/storybook-18.2.2.tgz", - "integrity": "sha512-YfUi4mzr3eT+95cxD/EWcx7fJr8NyWRbza2QvXBd6Bt/cvUn8O5g38S3HvJRts/Q8TaDH9+lYQpk50H3PFnCtg==", - "dev": true, + "node_modules/@grpc/grpc-js": { + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.10.tgz", + "integrity": "sha512-HPa/K5NX6ahMoeBv15njAc/sfF4/jmiXLar9UlC2UfHFKZzsCVLc3wbe7+7qua7w9VPh2/L6EBxyAV7/E8Wftg==", "dependencies": { - "@nx/storybook": "18.2.2" + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" } }, - "node_modules/@nrwl/tao": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-18.0.7.tgz", - "integrity": "sha512-oJ1Euo3mxy7BdC4/z/M+UO7RVYrYRs700R/vyGAEaELBj6dv8X7qm+fH4jTAbECHJLsmNp/HYnfAdimsK+rKMQ==", - "dev": true, + "node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", "dependencies": { - "nx": "18.0.7", - "tslib": "^2.3.0" + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" }, "bin": { - "tao": "index.js" + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" } }, - "node_modules/@nrwl/vite": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nrwl/vite/-/vite-18.0.7.tgz", - "integrity": "sha512-bHf3QOt/ErSu0DGw10GHfrF+vYlvFKy4nsChiOIB/yyhTgQWtDi5CALVlfafHRGRnn6d+svGXFevbyEWO0d6nA==", - "dev": true, + "node_modules/@grpc/proto-loader/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "dependencies": { - "@nx/vite": "18.0.7" + "@hapi/hoek": "^9.0.0" } }, - "node_modules/@nrwl/web": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nrwl/web/-/web-18.0.7.tgz", - "integrity": "sha512-zYaGU+IEJMIzRSwJQIPk4TUft929AnnmLJ7HU9D4E4wlzo7grS29WjHWxA1W/qSDwmhnZPTCcZUfiK6YB8A8mw==", - "dev": true, - "dependencies": { - "@nx/web": "18.0.7" + "node_modules/@hookform/resolvers": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.3.4.tgz", + "integrity": "sha512-o5cgpGOuJYrd+iMKvkttOclgwRW86EsWJZZRC23prf0uU2i48Htq4PuT73AVb9ionFyZrwYEITuOFGF+BydEtQ==", + "peerDependencies": { + "react-hook-form": "^7.0.0" } }, - "node_modules/@nrwl/workspace": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-18.0.7.tgz", - "integrity": "sha512-NVF+xNRjpU+11+yhvVKG0q77b31tQGDGCZWQ3a146kRA9wrgEH1LFDs8pQwfQSCaDBWYmoK/XDqCFped9Ty9mw==", + "node_modules/@humanfs/core": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", + "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", "dev": true, - "dependencies": { - "@nx/workspace": "18.0.7" + "optional": true, + "peer": true, + "engines": { + "node": ">=18.18.0" } }, - "node_modules/@nx/cypress": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/cypress/-/cypress-18.2.2.tgz", - "integrity": "sha512-gt/kZN3d3xXuJruY+11DEROA8xK8oxfbKoNE7f53cn0sY5Lsk/CwZ/y+4p4DAyk3bkOzqSK8J6SVud4LQxaODg==", + "node_modules/@humanfs/node": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", + "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@nrwl/cypress": "18.2.2", - "@nx/devkit": "18.2.2", - "@nx/eslint": "18.2.2", - "@nx/js": "18.2.2", - "@phenomnomnominal/tsquery": "~5.0.1", - "detect-port": "^1.5.1", - "semver": "^7.5.3", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "cypress": ">= 3 < 14" + "@humanfs/core": "^0.19.0", + "@humanwhocodes/retry": "^0.3.0" }, - "peerDependenciesMeta": { - "cypress": { - "optional": true - } + "engines": { + "node": ">=18.18.0" } }, - "node_modules/@nx/cypress/node_modules/@nrwl/devkit": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-18.2.2.tgz", - "integrity": "sha512-6RBr1aMzrpY0kk9L9buqT9H7Nv8+QujJPo4ASr6jp/5d5gPBsebeTn6qSvv1xJSB0GhB1ACOeq1nVkbwRQoQCw==", - "dev": true, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "devOptional": true, "dependencies": { - "@nx/devkit": "18.2.2" + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" } }, - "node_modules/@nx/cypress/node_modules/@nrwl/js": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nrwl/js/-/js-18.2.2.tgz", - "integrity": "sha512-+COyT27frMSARYNPyFDL404nOgMmJQ0o5ap24hYond3TUuhYa5LKB0AQvEZZEz6Wb0Z/KdWRi44mw4+Gm+5Beg==", - "dev": true, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "devOptional": true, "dependencies": { - "@nx/js": "18.2.2" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@nx/cypress/node_modules/@nrwl/tao": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-18.2.2.tgz", - "integrity": "sha512-tXjAbbw8Ir3cY/PQVHiC7q10jsU43r5kkEVwa2vzd1rfPtPFvj9WtgwISd+GstuppYtsbNi+UgTNmHX8dRKPYQ==", - "dev": true, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "devOptional": true, "dependencies": { - "nx": "18.2.2", - "tslib": "^2.3.0" + "brace-expansion": "^1.1.7" }, - "bin": { - "tao": "index.js" + "engines": { + "node": "*" } }, - "node_modules/@nx/cypress/node_modules/@nrwl/workspace": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-18.2.2.tgz", - "integrity": "sha512-Vqd6S3IlLtIeSru84T+gX+AtMZYS7qgXTujo2ux0q2gc/AxtHp7etmiUqKuXV4Q9QqBqsxZZg+P6NWzyPJACDg==", - "dev": true, - "dependencies": { - "@nx/workspace": "18.2.2" + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "devOptional": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@nx/cypress/node_modules/@nx/devkit": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-18.2.2.tgz", - "integrity": "sha512-Yz/uLYfy2QLeeCJecgKXuT4z0eGx/yBw3VxkgD0zSvpSIg8p1OGSK/rUQ47n/FibsLRdXa1Me5uE57rNt/FKvA==", + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "devOptional": true + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, - "dependencies": { - "@nrwl/devkit": "18.2.2", - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" + "optional": true, + "peer": true, + "engines": { + "node": ">=18.18" }, - "peerDependencies": { - "nx": ">= 16 <= 18" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@nx/cypress/node_modules/@nx/eslint": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-18.2.2.tgz", - "integrity": "sha512-EHDhystP1y+8LtQfflvbHVrIdMTAoXp/xQrXiH/8U5ESbezBQUT7B75UOiWAzI+lBn9uwailMKhfEiIf4t5uRQ==", - "dev": true, + "node_modules/@internationalized/date": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.2.tgz", + "integrity": "sha512-vo1yOMUt2hzp63IutEaTUxROdvQg1qlMRsbCvbay2AK2Gai7wIgCyK5weEX3nHkiLgo4qCXHijFNC/ILhlRpOQ==", "dependencies": { - "@nx/devkit": "18.2.2", - "@nx/js": "18.2.2", - "@nx/linter": "18.2.2", - "eslint": "^8.0.0", - "tslib": "^2.3.0", - "typescript": "~5.4.2" - }, - "peerDependencies": { - "js-yaml": "4.1.0" - }, - "peerDependenciesMeta": { - "js-yaml": { - "optional": true - } + "@swc/helpers": "^0.5.0" } }, - "node_modules/@nx/cypress/node_modules/@nx/js": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-18.2.2.tgz", - "integrity": "sha512-EQXlUW83w4D2//AXMW4AQUocBs4Nwfl15gPERahpzyTK6CKSOV3nKyORCTnVa5TgtugRXGluTbN3TxamSoWpug==", - "dev": true, + "node_modules/@internationalized/message": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.2.tgz", + "integrity": "sha512-MHAWsZWz8jf6jFPZqpTudcCM361YMtPIRu9CXkYmKjJ/0R3pQRScV5C0zS+Qi50O5UAm8ecKhkXx6mWDDcF6/g==", "dependencies": { - "@babel/core": "^7.23.2", - "@babel/plugin-proposal-decorators": "^7.22.7", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-runtime": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@nrwl/js": "18.2.2", - "@nx/devkit": "18.2.2", - "@nx/workspace": "18.2.2", - "@phenomnomnominal/tsquery": "~5.0.1", - "babel-plugin-const-enum": "^1.0.1", - "babel-plugin-macros": "^2.8.0", - "babel-plugin-transform-typescript-metadata": "^0.3.1", - "chalk": "^4.1.0", - "columnify": "^1.6.0", - "detect-port": "^1.5.1", - "fast-glob": "3.2.7", - "fs-extra": "^11.1.0", - "ignore": "^5.0.4", - "js-tokens": "^4.0.0", - "minimatch": "9.0.3", - "npm-package-arg": "11.0.1", - "npm-run-path": "^4.0.1", - "ora": "5.3.0", - "semver": "^7.5.3", - "source-map-support": "0.5.19", - "ts-node": "10.9.1", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "verdaccio": "^5.0.4" - }, - "peerDependenciesMeta": { - "verdaccio": { - "optional": true - } + "@swc/helpers": "^0.5.0", + "intl-messageformat": "^10.1.0" } }, - "node_modules/@nx/cypress/node_modules/@nx/linter": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/linter/-/linter-18.2.2.tgz", - "integrity": "sha512-uLgqXMhYyomPx0ruhSygPqa9Q7WtDWdwlfOs5Zgrv9xrL+wfSgVqu2sFbBp9fy1P+6BHreiAA0JAr5E/TLv1Ww==", - "dev": true, + "node_modules/@internationalized/number": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.5.1.tgz", + "integrity": "sha512-N0fPU/nz15SwR9IbfJ5xaS9Ss/O5h1sVXMZf43vc9mxEG48ovglvvzBjF53aHlq20uoR6c+88CrIXipU/LSzwg==", "dependencies": { - "@nx/eslint": "18.2.2" + "@swc/helpers": "^0.5.0" } }, - "node_modules/@nx/cypress/node_modules/@nx/nx-darwin-arm64": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.2.2.tgz", - "integrity": "sha512-mZ5X2rmtzmEGnt5ddpKlyQDGRd1wh0HSJtWvjruj6fYLNNpoosnXefI0PQLZUw13hf8OpJNo8J6xKfjIViSa8g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" + "node_modules/@internationalized/string": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.1.tgz", + "integrity": "sha512-vWQOvRIauvFMzOO+h7QrdsJmtN1AXAFVcaLWP9AseRN2o7iHceZ6bIXhBD4teZl8i91A3gxKnWBlGgjCwU6MFQ==", + "dependencies": { + "@swc/helpers": "^0.5.0" } }, - "node_modules/@nx/cypress/node_modules/@nx/nx-darwin-x64": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-18.2.2.tgz", - "integrity": "sha512-FeYvbr0OOIdn9xvuNZlLHQKwdAPN9KcWnmIysJTQZeanvUf6tifkhBUU1cXDduAkdut5iibnnA91JhcEj4x9yg==", - "cpu": [ - "x64" - ], + "node_modules/@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, "engines": { - "node": ">= 10" + "node": ">=8" } }, - "node_modules/@nx/cypress/node_modules/@nx/nx-freebsd-x64": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.2.2.tgz", - "integrity": "sha512-Owt/5jT8IG5I6eRbs8en+bHvi2St+k1Z1S1CLArlnfTzkTgVGz/R39HD4OouEVnr2dQPkfc7ms6+XkhlYx5NLg==", - "cpu": [ - "x64" - ], + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "sprintf-js": "~1.0.2" } }, - "node_modules/@nx/cypress/node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.2.2.tgz", - "integrity": "sha512-6D6ZC4EdBjAE0QgLYXuk7AC5r/LM+XUUOa5tFAV6fsAKn+GjVFsmP8dl/HEHfg+vx619+o+IrVrOA+h6ztmNJA==", - "cpu": [ - "arm" - ], + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10" + "node": ">=6" } }, - "node_modules/@nx/cypress/node_modules/@nx/nx-linux-arm64-gnu": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.2.2.tgz", - "integrity": "sha512-RHZ9nPZ4ivv9p+djO9WqoilMhjlR8/rj7P4sog5OpeRE5EWc65Rb7SFwjek1IovS2gbbK+3P2y8Q4G7lyvbe5w==", - "cpu": [ - "arm64" - ], + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">= 10" + "node": ">=8" } }, - "node_modules/@nx/cypress/node_modules/@nx/nx-linux-arm64-musl": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.2.2.tgz", - "integrity": "sha512-WginA4UHdrRhK40pDV8sv3Izho5aOzWf3iC8WVXi8r850mVbOE88JaWnO7TJ7zNWgiM32/OZeVyaYQ/Wv8pYjw==", - "cpu": [ - "arm64" - ], + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@nx/cypress/node_modules/@nx/nx-linux-x64-gnu": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.2.2.tgz", - "integrity": "sha512-Fekq6TWZAN7T1Yi+IVAPQ3wUmsmtvu3WyvXiVBjVKh8C1H/PKPcNi+4kaG9Ys1BhBZhqiEfTgc44RF9xLM9IAQ==", - "cpu": [ - "x64" - ], + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "p-locate": "^4.1.0" + }, "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/cypress/node_modules/@nx/nx-linux-x64-musl": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.2.2.tgz", - "integrity": "sha512-3Uk7x2/giczRCva7RsWd/KjgeYH9kOQFiqzE4heMrjBEuJQfACDlasjIrTRv9bwLrZ6otkBVeX/zmE9kBo3tOA==", - "cpu": [ - "x64" - ], + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": ">= 10" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nx/cypress/node_modules/@nx/nx-win32-arm64-msvc": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.2.2.tgz", - "integrity": "sha512-y0d79+FYtSEI96KGAjIUrD7/xybAp7aSjqqesM0WP2+DIJBYkdjK6maTKxkB5gb3FBJyhfNYr4A1NqDnvbPtvA==", - "cpu": [ - "arm64" - ], + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "p-limit": "^2.2.0" + }, "engines": { - "node": ">= 10" + "node": ">=8" } }, - "node_modules/@nx/cypress/node_modules/@nx/nx-win32-x64-msvc": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.2.2.tgz", - "integrity": "sha512-17b7hh8VMGWHq0yQDxevLUM0K4ZoNUah3oYVbYe46tp1w7D4u44vDkOOE2SpV2E/alllcDES1etcVsYQSMTGig==", - "cpu": [ - "x64" - ], + "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">= 10" + "node": ">=8" } }, - "node_modules/@nx/cypress/node_modules/@nx/workspace": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-18.2.2.tgz", - "integrity": "sha512-peZQmiibIVNoDYHgTvrd+2k14KfuquarnoDrNT4USpOz36B6usMGEOw8a2kZ+7TZ7xpCGOhDTr3jHYTg8NFBUg==", + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { - "@nrwl/workspace": "18.2.2", - "@nx/devkit": "18.2.2", - "chalk": "^4.1.0", - "enquirer": "~2.3.6", - "nx": "18.2.2", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@nx/cypress/node_modules/ansi-styles": { + "node_modules/@jest/console/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -8713,7 +10176,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@nx/cypress/node_modules/chalk": { + "node_modules/@jest/console/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -8729,25 +10192,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@nx/cypress/node_modules/dotenv": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.2.tgz", - "integrity": "sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" - } - }, - "node_modules/@nx/cypress/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/@nx/cypress/node_modules/has-flag": { + "node_modules/@jest/console/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -8756,125 +10201,138 @@ "node": ">=8" } }, - "node_modules/@nx/cypress/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/@nx/cypress/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/@nx/cypress/node_modules/nx": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/nx/-/nx-18.2.2.tgz", - "integrity": "sha512-ZEnN+2XV6QWI3q6N/I9byjSK2ErxAJJjKIWFQ45RW7+KCFbiwF0zeGnn5zruSHY7nbTrUf5C7MDA80eXam5DTg==", + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, - "hasInstallScript": true, "dependencies": { - "@nrwl/tao": "18.2.2", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.0-rc.46", - "@zkochan/js-yaml": "0.0.6", - "axios": "^1.6.0", - "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^8.0.1", - "dotenv": "~16.3.1", - "dotenv-expand": "~10.0.0", - "enquirer": "~2.3.6", - "figures": "3.2.0", - "flat": "^5.0.2", - "fs-extra": "^11.1.0", - "ignore": "^5.0.4", - "jest-diff": "^29.4.1", - "js-yaml": "4.1.0", - "jsonc-parser": "3.2.0", - "lines-and-columns": "~2.0.3", - "minimatch": "9.0.3", - "node-machine-id": "1.1.12", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "ora": "5.3.0", - "semver": "^7.5.3", - "string-width": "^4.2.3", - "strong-log-transformer": "^2.1.0", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "nx": "bin/nx.js", - "nx-cloud": "bin/nx-cloud.js" + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" }, - "optionalDependencies": { - "@nx/nx-darwin-arm64": "18.2.2", - "@nx/nx-darwin-x64": "18.2.2", - "@nx/nx-freebsd-x64": "18.2.2", - "@nx/nx-linux-arm-gnueabihf": "18.2.2", - "@nx/nx-linux-arm64-gnu": "18.2.2", - "@nx/nx-linux-arm64-musl": "18.2.2", - "@nx/nx-linux-x64-gnu": "18.2.2", - "@nx/nx-linux-x64-musl": "18.2.2", - "@nx/nx-win32-arm64-msvc": "18.2.2", - "@nx/nx-win32-x64-msvc": "18.2.2" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "@swc-node/register": "^1.8.0", - "@swc/core": "^1.3.85" + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { + "node-notifier": { "optional": true } } }, - "node_modules/@nx/cypress/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" + "color-convert": "^2.0.1" }, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@nx/cypress/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@nx/cypress/node_modules/supports-color": { + "node_modules/@jest/core/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/@jest/core/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -8886,90 +10344,134 @@ "node": ">=8" } }, - "node_modules/@nx/cypress/node_modules/typescript": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", - "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", + "node_modules/@jest/create-cache-key-function": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", + "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "dependencies": { + "@jest/types": "^29.6.3" }, "engines": { - "node": ">=14.17" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@nx/devkit": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-18.0.7.tgz", - "integrity": "sha512-Xm+o4pbSNQ5YL0LJk4Gfbws0qIZhqa7H8I6z7rRQuxP9tqei7Q+cTaI4WJG7Y5l8lbgzScM4WeW2sGMvLFtITA==", + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@nrwl/devkit": "18.0.7", - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" }, - "peerDependencies": { - "nx": ">= 16 <= 18" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@nx/devkit/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@nx/devkit/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" + "jest-get-type": "^29.6.3" }, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@nx/esbuild": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/esbuild/-/esbuild-18.0.7.tgz", - "integrity": "sha512-hmyhO0eqr013/g8if7PaFm7nnxDeNor8hy7z7YAXyOJcIESpZfgpXX7gPc6wDVSOdI75/OZWmf2zBv2zAKBN8g==", + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@nrwl/esbuild": "18.0.7", - "@nx/devkit": "18.0.7", - "@nx/js": "18.0.7", - "chalk": "^4.1.0", - "fast-glob": "3.2.7", - "fs-extra": "^11.1.0", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "esbuild": "~0.19.2" + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { - "esbuild": { + "node-notifier": { "optional": true } } }, - "node_modules/@nx/esbuild/node_modules/ansi-styles": { + "node_modules/@jest/reporters/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -8984,7 +10486,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@nx/esbuild/node_modules/chalk": { + "node_modules/@jest/reporters/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -9000,7 +10502,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@nx/esbuild/node_modules/has-flag": { + "node_modules/@jest/reporters/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -9009,7 +10511,7 @@ "node": ">=8" } }, - "node_modules/@nx/esbuild/node_modules/supports-color": { + "node_modules/@jest/reporters/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -9021,157 +10523,88 @@ "node": ">=8" } }, - "node_modules/@nx/eslint": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-18.0.7.tgz", - "integrity": "sha512-+Coo15q99k1jqANrwBDpLRI3+hn9GAR8jze9ynX/EgNCsGUSb6GZSmPqEWZtSXpX7cqekixUF4RfN/DUgn4tCQ==", - "dev": true, - "dependencies": { - "@nx/devkit": "18.0.7", - "@nx/js": "18.0.7", - "@nx/linter": "18.0.7", - "eslint": "^8.0.0", - "tslib": "^2.3.0", - "typescript": "~5.3.2" - }, - "peerDependencies": { - "js-yaml": "4.1.0" - }, - "peerDependenciesMeta": { - "js-yaml": { - "optional": true - } - } - }, - "node_modules/@nx/eslint-plugin": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-18.0.7.tgz", - "integrity": "sha512-Zf1W7FiAdetVa4rlMiEIaQBbfKuayk5p5bp+FZvQoJ4SCrJ9B3eqOiQaNTfD9mOs7jiAGrjY2PHxVHkWdD4eBQ==", - "dev": true, - "dependencies": { - "@nrwl/eslint-plugin-nx": "18.0.7", - "@nx/devkit": "18.0.7", - "@nx/js": "18.0.7", - "@typescript-eslint/type-utils": "^6.13.2", - "@typescript-eslint/utils": "^6.13.2", - "chalk": "^4.1.0", - "confusing-browser-globals": "^1.0.9", - "jsonc-eslint-parser": "^2.1.0", - "semver": "^7.5.3", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.13.2", - "eslint-config-prettier": "^9.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/@nx/eslint-plugin/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dependencies": { - "color-convert": "^2.0.1" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@nx/eslint-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@nx/eslint-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@nx/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@nx/eslint-plugin/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@nx/eslint-plugin/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" }, "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/jest": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-18.0.7.tgz", - "integrity": "sha512-47O97zlQrRlCwLKVJgQsWSYcBoZCRnv1LdyBDyVemZ33UrvVhIEEbyyADXQ1vNXwuPfGpD7FxADUHMtTSikEuA==", - "dev": true, - "dependencies": { - "@jest/reporters": "^29.4.1", - "@jest/test-result": "^29.4.1", - "@nrwl/jest": "18.0.7", - "@nx/devkit": "18.0.7", - "@nx/js": "18.0.7", - "@phenomnomnominal/tsquery": "~5.0.1", - "chalk": "^4.1.0", - "identity-obj-proxy": "3.0.0", - "jest-config": "^29.4.1", - "jest-resolve": "^29.4.1", - "jest-util": "^29.4.1", - "minimatch": "9.0.3", - "resolve.exports": "1.1.0", - "tslib": "^2.3.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@nx/jest/node_modules/ansi-styles": { + "node_modules/@jest/transform/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -9186,7 +10619,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@nx/jest/node_modules/chalk": { + "node_modules/@jest/transform/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -9202,7 +10635,7 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@nx/jest/node_modules/has-flag": { + "node_modules/@jest/transform/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -9211,7 +10644,7 @@ "node": ">=8" } }, - "node_modules/@nx/jest/node_modules/supports-color": { + "node_modules/@jest/transform/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -9223,57 +10656,26 @@ "node": ">=8" } }, - "node_modules/@nx/js": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-18.0.7.tgz", - "integrity": "sha512-ZYtO4KA/2Jf4wGQo8fqmD8wrw2wGlgpDAb1c9e+R9U2gwElz4MxT/Zc5km5/w7gLMoEuxECmnY3Or/sJMe/BSA==", - "dev": true, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dependencies": { - "@babel/core": "^7.23.2", - "@babel/plugin-proposal-decorators": "^7.22.7", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-runtime": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@nrwl/js": "18.0.7", - "@nx/devkit": "18.0.7", - "@nx/workspace": "18.0.7", - "@phenomnomnominal/tsquery": "~5.0.1", - "babel-plugin-const-enum": "^1.0.1", - "babel-plugin-macros": "^2.8.0", - "babel-plugin-transform-typescript-metadata": "^0.3.1", - "chalk": "^4.1.0", - "columnify": "^1.6.0", - "detect-port": "^1.5.1", - "fast-glob": "3.2.7", - "fs-extra": "^11.1.0", - "ignore": "^5.0.4", - "js-tokens": "^4.0.0", - "minimatch": "9.0.3", - "npm-package-arg": "11.0.1", - "npm-run-path": "^4.0.1", - "ora": "5.3.0", - "semver": "^7.5.3", - "source-map-support": "0.5.19", - "ts-node": "10.9.1", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "verdaccio": "^5.0.4" + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, - "peerDependenciesMeta": { - "verdaccio": { - "optional": true - } + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@nx/js/node_modules/ansi-styles": { + "node_modules/@jest/types/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -9284,11 +10686,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@nx/js/node_modules/chalk": { + "node_modules/@jest/types/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9300,255 +10701,404 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@nx/js/node_modules/has-flag": { + "node_modules/@jest/types/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } }, - "node_modules/@nx/js/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "yallist": "^4.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/@nx/js/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/@josephg/resolvable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@josephg/resolvable/-/resolvable-1.0.1.tgz", + "integrity": "sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==" + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.3.0.tgz", + "integrity": "sha512-2D6y7fNvFmsLmRt6UCOFJPvFoPMJGT0Uh1Wg0RaigUp7kdQPs6yYn8Dmx6GZkOH/NW0yMTwRz/p0SRMMRo50vA==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" + "glob": "^7.2.0", + "glob-promise": "^4.2.0", + "magic-string": "^0.27.0", + "react-docgen-typescript": "^2.2.2" }, - "bin": { - "semver": "bin/semver.js" + "peerDependencies": { + "typescript": ">= 4.3.x", + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" }, - "engines": { - "node": ">=10" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@nx/js/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "@jridgewell/sourcemap-codec": "^1.4.13" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@nx/linter": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/linter/-/linter-18.0.7.tgz", - "integrity": "sha512-nuAO28nXktvirkra7bH6jB9MkC9Q5w57kGMoExvnXbYj/rtXN6UlaXS0eEU04elEny+WV3g69VbSFGe4MeorSQ==", - "dev": true, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@nx/eslint": "18.0.7" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@nx/node": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/node/-/node-18.0.7.tgz", - "integrity": "sha512-nHDIbx+aeAti+tima8q4k4gIfS387VkFWlK++Z1eLDhDsEXjz3XiX5dK/+YLS+s3ezmaSEdJSokK6kig7LO6xg==", - "dev": true, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dependencies": { - "@nrwl/node": "18.0.7", - "@nx/devkit": "18.0.7", - "@nx/eslint": "18.0.7", - "@nx/jest": "18.0.7", - "@nx/js": "18.0.7", - "tslib": "^2.3.0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@nx/nx-darwin-arm64": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.0.7.tgz", - "integrity": "sha512-0ZCgalq5NwJy0SPJGisFcT+kHftWoyMyb78yFNFeFCL7dPmLUq2QqbLR2HFo2SIuPFY5+DVv9FBB63ZbdPXTJw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" + }, + "node_modules/@mapbox/geojson-rewind": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", + "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", + "dependencies": { + "get-stream": "^6.0.1", + "minimist": "^1.2.6" + }, + "bin": { + "geojson-rewind": "geojson-rewind" + } + }, + "node_modules/@mapbox/geojson-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz", + "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==" + }, + "node_modules/@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", "engines": { - "node": ">= 10" + "node": ">= 0.6" } }, - "node_modules/@nx/nx-darwin-x64": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-18.0.7.tgz", - "integrity": "sha512-yA5bXhsw0C4YjUcJcsXgsN/Pv8nSM3xo8hJ+RJCjgkh15f3ylXzYvBa+xL6qWTyZqhICULDInfJwsw9x5GTQWg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@mapbox/mapbox-gl-supported": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz", + "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==", + "peerDependencies": { + "mapbox-gl": ">=0.32.1 <2.0.0" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, "engines": { - "node": ">= 10" + "node": ">= 6.0.0" } }, - "node_modules/@nx/nx-freebsd-x64": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.0.7.tgz", - "integrity": "sha512-KplveiJ59HeMLUN6S6dWMVjIgzLYx0v/1W9RdmTJB8EAAiduJdtDip0GLjSj902pEXbIhr3n9p4USPWFnrdL5w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "node_modules/@mapbox/node-pre-gyp/node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "engines": { - "node": ">= 10" + "node": ">=8" } }, - "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.0.7.tgz", - "integrity": "sha512-Uj4OF7yZLK9US/+4a33FiFpyP6SaDB34HLHIht9ROjL6dGxv1iUs8Ut+JaUQ6DaP/XBwV6/+CDBH5uXMfMWLww==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@mapbox/node-pre-gyp/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, "engines": { - "node": ">= 10" + "node": ">= 6" } }, - "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.0.7.tgz", - "integrity": "sha512-hGuM7mtOsZTuxnBTm9uLKNBmkRL0zQs0ZtFomHscSt/reN8WBgduKSPWJ18LLj5D7Z1otxI3ooUf8+5/jwmr3A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">= 10" + "node": ">=10" } }, - "node_modules/@nx/nx-linux-arm64-musl": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.0.7.tgz", - "integrity": "sha512-34Xb5mZT3p2E6mM0D6cFIpPF5hJtF3aDzBnzeitP/lZe70n+S0PUpgB/2Vi9j3IHW2xjci5jU2UYsdF2RIEWTQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">= 10" + "node": ">=10" } }, - "node_modules/@nx/nx-linux-x64-gnu": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.0.7.tgz", - "integrity": "sha512-tn1puRzCk/Sn8f7d1134Zyob1CT25kovPWPvUadvEoqqetMgRgVxMqTr7Ud/2hu61iGSKQEmOlQ2bVM/NMeRvA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + }, + "node_modules/@mapbox/tiny-sdf": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", + "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==" + }, + "node_modules/@mapbox/unitbezier": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", + "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" + }, + "node_modules/@mapbox/vector-tile": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "dependencies": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "node_modules/@mapbox/whoots-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", "engines": { - "node": ">= 10" + "node": ">=6.0.0" } }, - "node_modules/@nx/nx-linux-x64-musl": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.0.7.tgz", - "integrity": "sha512-at1nI9mBMNMCIC5BrY8oJ+7ptknZPhQwu7j4jhRAgcHd2JOZZtgJSo4FI2chBTbzf3SLQL1omts0zKB1syas1w==", - "cpu": [ - "x64" - ], + "node_modules/@mdx-js/mdx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", + "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-to-js": "^2.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-estree": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "periscopic": "^3.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.1.tgz", + "integrity": "sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@module-federation/bridge-react-webpack-plugin": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.6.6.tgz", + "integrity": "sha512-NANaSOKem+1t/Fbd1GjXnStJRe7O33ya+FR/yYkTUd1H5hmlzVDNo/lYxYuUl3O/gH9Lnlr2Gf9unyWoIW0wHw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@module-federation/sdk": "0.6.6", + "@types/semver": "7.5.8", + "semver": "7.6.3" } }, - "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.0.7.tgz", - "integrity": "sha512-DTn5X5NhnjpG1LZgESM0EmBPLnwoeZzOaJfjt92Loib1TmALEHUIdVRcshb8FJfoXY4zNEdNUCmZ+M3us4xb9A==", - "cpu": [ - "arm64" - ], + "node_modules/@module-federation/bridge-react-webpack-plugin/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">= 10" + "node": ">=10" } }, - "node_modules/@nx/nx-win32-x64-msvc": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.0.7.tgz", - "integrity": "sha512-/2Ue0kTuvXQpF0QfJGtBZ5yqhpRVcDTidDcZSgdFdNEkqUXK2GgXG4lPQtw8zf2Ja9Q+93lXwH6NMhQWCB8cNA==", - "cpu": [ - "x64" - ], + "node_modules/@module-federation/data-prefetch": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.6.6.tgz", + "integrity": "sha512-rakEHrg2pqbOqJ3uWT2p3kgTCOxBQdEIqmew3XBAXTZ0NblZtkXeMHupcW/W6+ccvbPdn/T/PSICx9HHSvfEVg==", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@module-federation/runtime": "0.6.6", + "@module-federation/sdk": "0.6.6", + "fs-extra": "9.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, - "node_modules/@nx/react": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/react/-/react-18.0.7.tgz", - "integrity": "sha512-avBPL4otj3bs756A7H5XrzQOOK9NEZJfCwXalnFnVFapX0g9kg4urCIRoMEbb0A8VCJYWjKZmjzcSLhl4o4Oig==", + "node_modules/@module-federation/data-prefetch/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "dependencies": { - "@nrwl/react": "18.0.7", - "@nx/devkit": "18.0.7", - "@nx/eslint": "18.0.7", - "@nx/js": "18.0.7", - "@nx/web": "18.0.7", - "@phenomnomnominal/tsquery": "~5.0.1", - "@svgr/webpack": "^8.0.1", - "chalk": "^4.1.0", - "minimatch": "9.0.3", - "tslib": "^2.3.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@module-federation/dts-plugin": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.6.6.tgz", + "integrity": "sha512-sNCghGgrpCOOVk2xpzgAGAFeo2ONcv6eAnEfe7Q2gD7R6NrGgOrB5KVhN/uWIzFJG8tqNfSSjam+woTyrrayfg==", + "dev": true, + "dependencies": { + "@module-federation/managers": "0.6.6", + "@module-federation/sdk": "0.6.6", + "@module-federation/third-party-dts-extractor": "0.6.6", + "adm-zip": "^0.5.10", + "ansi-colors": "^4.1.3", + "axios": "^1.7.4", + "chalk": "3.0.0", + "fs-extra": "9.1.0", + "isomorphic-ws": "5.0.0", + "koa": "2.15.3", + "lodash.clonedeepwith": "4.5.0", + "log4js": "6.9.1", + "node-schedule": "2.1.1", + "rambda": "^9.1.0", + "ws": "8.17.1" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "vue-tsc": { + "optional": true + } } }, - "node_modules/@nx/react/node_modules/ansi-styles": { + "node_modules/@module-federation/dts-plugin/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -9563,23 +11113,46 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@nx/react/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@module-federation/dts-plugin/node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/@module-federation/dts-plugin/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=10" + "node": ">=8" + } + }, + "node_modules/@module-federation/dts-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=10" } }, - "node_modules/@nx/react/node_modules/has-flag": { + "node_modules/@module-federation/dts-plugin/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -9588,7 +11161,7 @@ "node": ">=8" } }, - "node_modules/@nx/react/node_modules/supports-color": { + "node_modules/@module-federation/dts-plugin/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -9600,488 +11173,344 @@ "node": ">=8" } }, - "node_modules/@nx/storybook": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/storybook/-/storybook-18.2.2.tgz", - "integrity": "sha512-qVyl/0Eesf8nDqzxpmccqBX2+v7QfyZh3HPgjqcVZxWR+CMsUm7xJVHaXQhluQL89DZFtjdmp0ddC3grQ2bvzg==", + "node_modules/@module-federation/enhanced": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.6.6.tgz", + "integrity": "sha512-gGU1tjaksk5Q5X2zpVb/OmlwvKwVVjTXreuFwkK0Z+9QKM9jbu0B/tPSh6sqibPFeu1yM2HOFlOHJhvFs1PmsA==", "dev": true, "dependencies": { - "@nrwl/storybook": "18.2.2", - "@nx/cypress": "18.2.2", - "@nx/devkit": "18.2.2", - "@nx/eslint": "18.2.2", - "@nx/js": "18.2.2", - "@phenomnomnominal/tsquery": "~5.0.1", - "semver": "^7.5.3", - "tslib": "^2.3.0" + "@module-federation/bridge-react-webpack-plugin": "0.6.6", + "@module-federation/data-prefetch": "0.6.6", + "@module-federation/dts-plugin": "0.6.6", + "@module-federation/managers": "0.6.6", + "@module-federation/manifest": "0.6.6", + "@module-federation/rspack": "0.6.6", + "@module-federation/runtime-tools": "0.6.6", + "@module-federation/sdk": "0.6.6", + "btoa": "^1.2.1", + "upath": "2.0.1" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/@nx/storybook/node_modules/@nrwl/devkit": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-18.2.2.tgz", - "integrity": "sha512-6RBr1aMzrpY0kk9L9buqT9H7Nv8+QujJPo4ASr6jp/5d5gPBsebeTn6qSvv1xJSB0GhB1ACOeq1nVkbwRQoQCw==", + "node_modules/@module-federation/managers": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.6.6.tgz", + "integrity": "sha512-ryj2twbQmo2KhwKn1xYivpaW94l5wfplDU9FwVvW0wc8hC2lJnuGhoiZqXKL7lNaBrZXge3b43Zlgx5OnFfr6A==", "dev": true, "dependencies": { - "@nx/devkit": "18.2.2" + "@module-federation/sdk": "0.6.6", + "find-pkg": "2.0.0", + "fs-extra": "9.1.0" } }, - "node_modules/@nx/storybook/node_modules/@nrwl/js": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nrwl/js/-/js-18.2.2.tgz", - "integrity": "sha512-+COyT27frMSARYNPyFDL404nOgMmJQ0o5ap24hYond3TUuhYa5LKB0AQvEZZEz6Wb0Z/KdWRi44mw4+Gm+5Beg==", + "node_modules/@module-federation/managers/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "dependencies": { - "@nx/js": "18.2.2" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@nx/storybook/node_modules/@nrwl/tao": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-18.2.2.tgz", - "integrity": "sha512-tXjAbbw8Ir3cY/PQVHiC7q10jsU43r5kkEVwa2vzd1rfPtPFvj9WtgwISd+GstuppYtsbNi+UgTNmHX8dRKPYQ==", + "node_modules/@module-federation/manifest": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.6.6.tgz", + "integrity": "sha512-45ol0fC8RS2d+0iEt5zdp0vctE2CiOfA2kCmOFz79K33occi8sKmyevfSeZGckZy54NiMnLFteIYBsyIa+g7gg==", "dev": true, "dependencies": { - "nx": "18.2.2", - "tslib": "^2.3.0" - }, - "bin": { - "tao": "index.js" + "@module-federation/dts-plugin": "0.6.6", + "@module-federation/managers": "0.6.6", + "@module-federation/sdk": "0.6.6", + "chalk": "3.0.0", + "find-pkg": "2.0.0" } }, - "node_modules/@nx/storybook/node_modules/@nrwl/workspace": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-18.2.2.tgz", - "integrity": "sha512-Vqd6S3IlLtIeSru84T+gX+AtMZYS7qgXTujo2ux0q2gc/AxtHp7etmiUqKuXV4Q9QqBqsxZZg+P6NWzyPJACDg==", + "node_modules/@module-federation/manifest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@nx/workspace": "18.2.2" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@nx/storybook/node_modules/@nx/devkit": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-18.2.2.tgz", - "integrity": "sha512-Yz/uLYfy2QLeeCJecgKXuT4z0eGx/yBw3VxkgD0zSvpSIg8p1OGSK/rUQ47n/FibsLRdXa1Me5uE57rNt/FKvA==", + "node_modules/@module-federation/manifest/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "dependencies": { - "@nrwl/devkit": "18.2.2", - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "peerDependencies": { - "nx": ">= 16 <= 18" + "engines": { + "node": ">=8" + } + }, + "node_modules/@module-federation/manifest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/@nx/storybook/node_modules/@nx/eslint": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-18.2.2.tgz", - "integrity": "sha512-EHDhystP1y+8LtQfflvbHVrIdMTAoXp/xQrXiH/8U5ESbezBQUT7B75UOiWAzI+lBn9uwailMKhfEiIf4t5uRQ==", + "node_modules/@module-federation/manifest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "@nx/devkit": "18.2.2", - "@nx/js": "18.2.2", - "@nx/linter": "18.2.2", - "eslint": "^8.0.0", - "tslib": "^2.3.0", - "typescript": "~5.4.2" - }, - "peerDependencies": { - "js-yaml": "4.1.0" + "has-flag": "^4.0.0" }, - "peerDependenciesMeta": { - "js-yaml": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "node_modules/@nx/storybook/node_modules/@nx/js": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-18.2.2.tgz", - "integrity": "sha512-EQXlUW83w4D2//AXMW4AQUocBs4Nwfl15gPERahpzyTK6CKSOV3nKyORCTnVa5TgtugRXGluTbN3TxamSoWpug==", + "node_modules/@module-federation/rspack": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.6.6.tgz", + "integrity": "sha512-30X6QPrJ/eCcmUL4GQ06Z9bQwURBnJI0607Fw2ufmAbhDA0PJFtg7NFFfXzsdChms1ACVbgvgfBH8SJg8j3wBg==", "dev": true, "dependencies": { - "@babel/core": "^7.23.2", - "@babel/plugin-proposal-decorators": "^7.22.7", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-runtime": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@nrwl/js": "18.2.2", - "@nx/devkit": "18.2.2", - "@nx/workspace": "18.2.2", - "@phenomnomnominal/tsquery": "~5.0.1", - "babel-plugin-const-enum": "^1.0.1", - "babel-plugin-macros": "^2.8.0", - "babel-plugin-transform-typescript-metadata": "^0.3.1", - "chalk": "^4.1.0", - "columnify": "^1.6.0", - "detect-port": "^1.5.1", - "fast-glob": "3.2.7", - "fs-extra": "^11.1.0", - "ignore": "^5.0.4", - "js-tokens": "^4.0.0", - "minimatch": "9.0.3", - "npm-package-arg": "11.0.1", - "npm-run-path": "^4.0.1", - "ora": "5.3.0", - "semver": "^7.5.3", - "source-map-support": "0.5.19", - "ts-node": "10.9.1", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0" + "@module-federation/bridge-react-webpack-plugin": "0.6.6", + "@module-federation/dts-plugin": "0.6.6", + "@module-federation/managers": "0.6.6", + "@module-federation/manifest": "0.6.6", + "@module-federation/runtime-tools": "0.6.6", + "@module-federation/sdk": "0.6.6" }, "peerDependencies": { - "verdaccio": "^5.0.4" + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" }, "peerDependenciesMeta": { - "verdaccio": { + "typescript": { + "optional": true + }, + "vue-tsc": { "optional": true } } }, - "node_modules/@nx/storybook/node_modules/@nx/linter": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/linter/-/linter-18.2.2.tgz", - "integrity": "sha512-uLgqXMhYyomPx0ruhSygPqa9Q7WtDWdwlfOs5Zgrv9xrL+wfSgVqu2sFbBp9fy1P+6BHreiAA0JAr5E/TLv1Ww==", + "node_modules/@module-federation/runtime": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.6.6.tgz", + "integrity": "sha512-QsKHUV2HALRzL6mPCdJEZTDuPReKC8MMXf+/VMCtQPp6JhLEjZIO06bfEZqXMbTbTYlMzntIwu1tGCbtJRZDOQ==", "dev": true, "dependencies": { - "@nx/eslint": "18.2.2" + "@module-federation/sdk": "0.6.6" } }, - "node_modules/@nx/storybook/node_modules/@nx/nx-darwin-arm64": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.2.2.tgz", - "integrity": "sha512-mZ5X2rmtzmEGnt5ddpKlyQDGRd1wh0HSJtWvjruj6fYLNNpoosnXefI0PQLZUw13hf8OpJNo8J6xKfjIViSa8g==", - "cpu": [ - "arm64" - ], + "node_modules/@module-federation/runtime-tools": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.6.6.tgz", + "integrity": "sha512-w2qHa41p6rADWMS1yBjpqNhaLZ4R5oRy9OYGPe6ywjh+8oqbiBl1CfQglcgEBIpHktEjV/upsgsnjHSdJBdeZw==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@module-federation/runtime": "0.6.6", + "@module-federation/webpack-bundler-runtime": "0.6.6" } }, - "node_modules/@nx/storybook/node_modules/@nx/nx-darwin-x64": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-18.2.2.tgz", - "integrity": "sha512-FeYvbr0OOIdn9xvuNZlLHQKwdAPN9KcWnmIysJTQZeanvUf6tifkhBUU1cXDduAkdut5iibnnA91JhcEj4x9yg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } + "node_modules/@module-federation/sdk": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.6.6.tgz", + "integrity": "sha512-tUv2kPi0FvplcpGi/g4nITAYVAR1RUZ6QvP71T8inmRZSrfcvk1QpGJiL36IjuS67SM3VAoXS0iJ2WX1Rgjvhg==", + "dev": true }, - "node_modules/@nx/storybook/node_modules/@nx/nx-freebsd-x64": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.2.2.tgz", - "integrity": "sha512-Owt/5jT8IG5I6eRbs8en+bHvi2St+k1Z1S1CLArlnfTzkTgVGz/R39HD4OouEVnr2dQPkfc7ms6+XkhlYx5NLg==", - "cpu": [ - "x64" - ], + "node_modules/@module-federation/third-party-dts-extractor": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.6.6.tgz", + "integrity": "sha512-xX9p17PpElzATNEulwlJJT731xST7T7OUIDSkkIghp/ICDmZd6WhYJvNBto7xbpaj5SIB7Ocdj4chNGv0xdYPw==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "find-pkg": "2.0.0", + "fs-extra": "9.1.0", + "resolve": "1.22.8" } }, - "node_modules/@nx/storybook/node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.2.2.tgz", - "integrity": "sha512-6D6ZC4EdBjAE0QgLYXuk7AC5r/LM+XUUOa5tFAV6fsAKn+GjVFsmP8dl/HEHfg+vx619+o+IrVrOA+h6ztmNJA==", - "cpu": [ - "arm" - ], + "node_modules/@module-federation/third-party-dts-extractor/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, "engines": { - "node": ">= 10" + "node": ">=10" } }, - "node_modules/@nx/storybook/node_modules/@nx/nx-linux-arm64-gnu": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.2.2.tgz", - "integrity": "sha512-RHZ9nPZ4ivv9p+djO9WqoilMhjlR8/rj7P4sog5OpeRE5EWc65Rb7SFwjek1IovS2gbbK+3P2y8Q4G7lyvbe5w==", - "cpu": [ - "arm64" - ], + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.6.6.tgz", + "integrity": "sha512-0UnY9m1fBgHwTpacYWbht1jB5X4Iqspiu1q8kfjUrv6y+R224//ydUFYYO8xfWx4V9SGQFKlU8XFH0FP/r0Hng==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "@module-federation/runtime": "0.6.6", + "@module-federation/sdk": "0.6.6" } }, - "node_modules/@nx/storybook/node_modules/@nx/nx-linux-arm64-musl": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.2.2.tgz", - "integrity": "sha512-WginA4UHdrRhK40pDV8sv3Izho5aOzWf3iC8WVXi8r850mVbOE88JaWnO7TJ7zNWgiM32/OZeVyaYQ/Wv8pYjw==", - "cpu": [ - "arm64" - ], + "node_modules/@mole-inc/bin-wrapper": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@mole-inc/bin-wrapper/-/bin-wrapper-8.0.1.tgz", + "integrity": "sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "bin-check": "^4.1.0", + "bin-version-check": "^5.0.0", + "content-disposition": "^0.5.4", + "ext-name": "^5.0.0", + "file-type": "^17.1.6", + "filenamify": "^5.0.2", + "got": "^11.8.5", + "os-filter-obj": "^2.0.0" + }, "engines": { - "node": ">= 10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/@nx/storybook/node_modules/@nx/nx-linux-x64-gnu": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.2.2.tgz", - "integrity": "sha512-Fekq6TWZAN7T1Yi+IVAPQ3wUmsmtvu3WyvXiVBjVKh8C1H/PKPcNi+4kaG9Ys1BhBZhqiEfTgc44RF9xLM9IAQ==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.5.tgz", + "integrity": "sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==", "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "dependencies": { + "sparse-bitfield": "^3.0.3" } }, - "node_modules/@nx/storybook/node_modules/@nx/nx-linux-x64-musl": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.2.2.tgz", - "integrity": "sha512-3Uk7x2/giczRCva7RsWd/KjgeYH9kOQFiqzE4heMrjBEuJQfACDlasjIrTRv9bwLrZ6otkBVeX/zmE9kBo3tOA==", + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz", + "integrity": "sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/storybook/node_modules/@nx/nx-win32-arm64-msvc": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.2.2.tgz", - "integrity": "sha512-y0d79+FYtSEI96KGAjIUrD7/xybAp7aSjqqesM0WP2+DIJBYkdjK6maTKxkB5gb3FBJyhfNYr4A1NqDnvbPtvA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/storybook/node_modules/@nx/nx-win32-x64-msvc": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.2.2.tgz", - "integrity": "sha512-17b7hh8VMGWHq0yQDxevLUM0K4ZoNUah3oYVbYe46tp1w7D4u44vDkOOE2SpV2E/alllcDES1etcVsYQSMTGig==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } + ] }, - "node_modules/@nx/storybook/node_modules/@nx/workspace": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-18.2.2.tgz", - "integrity": "sha512-peZQmiibIVNoDYHgTvrd+2k14KfuquarnoDrNT4USpOz36B6usMGEOw8a2kZ+7TZ7xpCGOhDTr3jHYTg8NFBUg==", + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", + "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", "dev": true, "dependencies": { - "@nrwl/workspace": "18.2.2", - "@nx/devkit": "18.2.2", - "chalk": "^4.1.0", - "enquirer": "~2.3.6", - "nx": "18.2.2", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" + "@emnapi/core": "^1.1.0", + "@emnapi/runtime": "^1.1.0", + "@tybys/wasm-util": "^0.9.0" } }, - "node_modules/@nx/storybook/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dependencies": { - "color-convert": "^2.0.1" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 8" } }, - "node_modules/@nx/storybook/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 8" } }, - "node_modules/@nx/storybook/node_modules/dotenv": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.2.tgz", - "integrity": "sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==", - "dev": true, - "engines": { - "node": ">=12" + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, - "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" - } - }, - "node_modules/@nx/storybook/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/@nx/storybook/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/@nx/storybook/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/@nx/storybook/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@nx/cypress": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/cypress/-/cypress-20.0.3.tgz", + "integrity": "sha512-Bnm3Soa3aEIzmbJMtjmgGko5FVvBWh2I0stV+eMmLC8y9mCOQ3W4i+pXjpD6zVLAfZBF80W9e1ON7kdlfpM2Rw==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "@nx/devkit": "20.0.3", + "@nx/eslint": "20.0.3", + "@nx/js": "20.0.3", + "@phenomnomnominal/tsquery": "~5.0.1", + "detect-port": "^1.5.1", + "tslib": "^2.3.0" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "cypress": ">= 3 < 14" + }, + "peerDependenciesMeta": { + "cypress": { + "optional": true + } } }, - "node_modules/@nx/storybook/node_modules/nx": { - "version": "18.2.2", - "resolved": "https://registry.npmjs.org/nx/-/nx-18.2.2.tgz", - "integrity": "sha512-ZEnN+2XV6QWI3q6N/I9byjSK2ErxAJJjKIWFQ45RW7+KCFbiwF0zeGnn5zruSHY7nbTrUf5C7MDA80eXam5DTg==", + "node_modules/@nx/devkit": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.0.3.tgz", + "integrity": "sha512-tB6iQ2opvipyy+4J0eImW/Nl8SoILPpDodwnThDJ2U2mflHG6/+3Wl6Q1hXieOnjT+ZE++ve91aYDEAi9OMwvA==", "dev": true, - "hasInstallScript": true, "dependencies": { - "@nrwl/tao": "18.2.2", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.0-rc.46", - "@zkochan/js-yaml": "0.0.6", - "axios": "^1.6.0", - "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^8.0.1", - "dotenv": "~16.3.1", - "dotenv-expand": "~10.0.0", + "ejs": "^3.1.7", "enquirer": "~2.3.6", - "figures": "3.2.0", - "flat": "^5.0.2", - "fs-extra": "^11.1.0", "ignore": "^5.0.4", - "jest-diff": "^29.4.1", - "js-yaml": "4.1.0", - "jsonc-parser": "3.2.0", - "lines-and-columns": "~2.0.3", "minimatch": "9.0.3", - "node-machine-id": "1.1.12", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "ora": "5.3.0", "semver": "^7.5.3", - "string-width": "^4.2.3", - "strong-log-transformer": "^2.1.0", - "tar-stream": "~2.2.0", "tmp": "~0.2.1", - "tsconfig-paths": "^4.1.2", "tslib": "^2.3.0", - "yargs": "^17.6.2", "yargs-parser": "21.1.1" }, - "bin": { - "nx": "bin/nx.js", - "nx-cloud": "bin/nx-cloud.js" - }, - "optionalDependencies": { - "@nx/nx-darwin-arm64": "18.2.2", - "@nx/nx-darwin-x64": "18.2.2", - "@nx/nx-freebsd-x64": "18.2.2", - "@nx/nx-linux-arm-gnueabihf": "18.2.2", - "@nx/nx-linux-arm64-gnu": "18.2.2", - "@nx/nx-linux-arm64-musl": "18.2.2", - "@nx/nx-linux-x64-gnu": "18.2.2", - "@nx/nx-linux-x64-musl": "18.2.2", - "@nx/nx-win32-arm64-msvc": "18.2.2", - "@nx/nx-win32-x64-msvc": "18.2.2" - }, "peerDependencies": { - "@swc-node/register": "^1.8.0", - "@swc/core": "^1.3.85" - }, - "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } + "nx": ">= 19 <= 21" } }, - "node_modules/@nx/storybook/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/@nx/devkit/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -10089,147 +11518,168 @@ "node": ">=10" } }, - "node_modules/@nx/storybook/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@nx/esbuild": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/esbuild/-/esbuild-20.0.3.tgz", + "integrity": "sha512-8PM3Rk0JoUBMTCbVxb11cbwpdVnwhKz8cnpva69eyUgZobhXWxq71eqMznw00p8MnJSQSjNXrUUEMGDH1qnnkA==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@nx/devkit": "20.0.3", + "@nx/js": "20.0.3", + "fast-glob": "3.2.7", + "picocolors": "^1.1.0", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "esbuild": "~0.19.2" + }, + "peerDependenciesMeta": { + "esbuild": { + "optional": true + } } }, - "node_modules/@nx/storybook/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@nx/eslint": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-20.0.3.tgz", + "integrity": "sha512-uWS1jvGj5T2GOMRit8HqC0LOo1BxEzQejxEioIfLVaoO8bd67FdZQh2Tz3Qon9V05VXm8pEHQv/1NVNqanzgBQ==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "@nx/devkit": "20.0.3", + "@nx/js": "20.0.3", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "typescript": "~5.4.2" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/storybook/node_modules/typescript": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", - "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "peerDependencies": { + "@zkochan/js-yaml": "0.0.7", + "eslint": "^8.0.0 || ^9.0.0" }, - "engines": { - "node": ">=14.17" + "peerDependenciesMeta": { + "@zkochan/js-yaml": { + "optional": true + } } }, - "node_modules/@nx/vite": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/vite/-/vite-18.0.7.tgz", - "integrity": "sha512-TtXXYAl2rO3LmmEBiLIIKF0+14Xdf/FYLhHps1SlU0fh6XxmwlhRV0aLqlHJUTe24y5urClu251myx7DEIJSVw==", + "node_modules/@nx/eslint-plugin": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-20.0.3.tgz", + "integrity": "sha512-KQi2rHwRQjQDqt7g4666LdKVBUNcHubX1MlXCB/f0ejCJunlybqK4aA+LiM0KIQpieevvIlAHJuTdZQ2M7q2HQ==", "dev": true, "dependencies": { - "@nrwl/vite": "18.0.7", - "@nx/devkit": "18.0.7", - "@nx/js": "18.0.7", - "@phenomnomnominal/tsquery": "~5.0.1", - "@swc/helpers": "~0.5.0", - "enquirer": "~2.3.6", - "tsconfig-paths": "^4.1.2" + "@eslint/compat": "^1.1.1", + "@nx/devkit": "20.0.3", + "@nx/js": "20.0.3", + "@typescript-eslint/type-utils": "^8.0.0", + "@typescript-eslint/utils": "^8.0.0", + "chalk": "^4.1.0", + "confusing-browser-globals": "^1.0.9", + "globals": "^15.9.0", + "jsonc-eslint-parser": "^2.1.0", + "semver": "^7.5.3", + "tslib": "^2.3.0" }, "peerDependencies": { - "vite": "^5.0.0", - "vitest": "^1.3.1" + "@typescript-eslint/parser": "^6.13.2 || ^7.0.0 || ^8.0.0", + "eslint-config-prettier": "^9.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/@nx/web": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/web/-/web-18.0.7.tgz", - "integrity": "sha512-+vRHC7UWBhiLyUgKiu7pS4O3QvlcyxJsRwh7uGmAjyK9yAkCdBh70JX4srFE+E+AfUmU2Uis3Fyj8VkhzH4nBA==", + "node_modules/@nx/eslint-plugin/node_modules/@eslint/compat": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.1.tgz", + "integrity": "sha512-JbHG2TWuCeNzh87fXo+/46Z1LEo9DBA9T188d0fZgGxAD+cNyS6sx9fdiyxjGPBMyQVRlCutTByZ6a5+YMkF7g==", "dev": true, - "dependencies": { - "@nrwl/web": "18.0.7", - "@nx/devkit": "18.0.7", - "@nx/js": "18.0.7", - "chalk": "^4.1.0", - "detect-port": "^1.5.1", - "http-server": "^14.1.0", - "tslib": "^2.3.0" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.10.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/@nx/web/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@nx/eslint-plugin/node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "color-convert": "^2.0.1" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://opencollective.com/eslint" } }, - "node_modules/@nx/web/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "node_modules/@nx/eslint-plugin/node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "optional": true, + "peer": true, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nx/web/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@nx/eslint-plugin/node_modules/@eslint/js": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz", + "integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==", "dev": true, + "optional": true, + "peer": true, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@nx/web/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@nx/eslint-plugin/node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "optional": true, + "peer": true }, - "node_modules/@nx/workspace": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-18.0.7.tgz", - "integrity": "sha512-w+O5T5FLo1kxa7oYvCMIHWbDmc038pdWhrq1l5QGqXeH3a0oND61uOa6NpWufrr6eiuoogwDhHLmnbl2PyUK0g==", + "node_modules/@nx/eslint-plugin/node_modules/acorn": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", + "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", "dev": true, - "dependencies": { - "@nrwl/workspace": "18.0.7", - "@nx/devkit": "18.0.7", - "chalk": "^4.1.0", - "enquirer": "~2.3.6", - "nx": "18.0.7", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" + "optional": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "node_modules/@nx/workspace/node_modules/ansi-styles": { + "node_modules/@nx/eslint-plugin/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -10244,7 +11694,19 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@nx/workspace/node_modules/chalk": { + "node_modules/@nx/eslint-plugin/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@nx/eslint-plugin/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -10260,231 +11722,188 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@nx/workspace/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/workspace/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@nx/eslint-plugin/node_modules/eslint": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz", + "integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.7.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.13.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.5", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.1.0", + "eslint-visitor-keys": "^4.1.0", + "espree": "^10.2.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "text-table": "^0.2.0" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/api-logs": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz", - "integrity": "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==", - "dependencies": { - "@opentelemetry/api": "^1.0.0" + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/context-async-hooks": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.25.1.tgz", - "integrity": "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==", - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.25.1" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "engines": { - "node": ">=14" + "funding": { + "url": "https://eslint.org/donate" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-logs-otlp-http": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.52.1.tgz", - "integrity": "sha512-qKgywId2DbdowPZpOBXQKp0B8DfhfIArmSic15z13Nk/JAOccBUQdPwDjDnjsM5f0ckZFMVR2t/tijTUAqDZoA==", - "dependencies": { - "@opentelemetry/api-logs": "0.52.1", - "@opentelemetry/core": "1.25.1", - "@opentelemetry/otlp-exporter-base": "0.52.1", - "@opentelemetry/otlp-transformer": "0.52.1", - "@opentelemetry/sdk-logs": "0.52.1" - }, - "engines": { - "node": ">=14" + "jiti": "*" }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.52.1.tgz", - "integrity": "sha512-oAHPOy1sZi58bwqXaucd19F/v7+qE2EuVslQOEeLQT94CDuZJJ4tbWzx8DpYBTrOSzKqqrMtx9+PMxkrcbxOyQ==", + "node_modules/@nx/eslint-plugin/node_modules/eslint-scope": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/otlp-exporter-base": "0.52.1", - "@opentelemetry/otlp-transformer": "0.52.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-metrics": "1.25.1" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=14" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.52.1.tgz", - "integrity": "sha512-pVkSH20crBwMTqB3nIN4jpQKUEoB0Z94drIHpYyEqs7UBr+I0cpYyOR3bqjA/UasQUMROb3GX8ZX4/9cVRqGBQ==", - "dependencies": { - "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.25.1", - "@opentelemetry/otlp-grpc-exporter-base": "0.52.1", - "@opentelemetry/otlp-transformer": "0.52.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1" - }, + "node_modules/@nx/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "dev": true, + "optional": true, + "peer": true, "engines": { - "node": ">=14" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-http": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.52.1.tgz", - "integrity": "sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg==", + "node_modules/@nx/eslint-plugin/node_modules/espree": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", + "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/otlp-exporter-base": "0.52.1", - "@opentelemetry/otlp-transformer": "0.52.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1" + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.1.0" }, "engines": { - "node": ">=14" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.52.1.tgz", - "integrity": "sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ==", + "node_modules/@nx/eslint-plugin/node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/otlp-exporter-base": "0.52.1", - "@opentelemetry/otlp-transformer": "0.52.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1" + "flat-cache": "^4.0.0" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "node": ">=16.0.0" } }, - "node_modules/@opentelemetry/exporter-zipkin": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.25.1.tgz", - "integrity": "sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==", + "node_modules/@nx/eslint-plugin/node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "node": ">=16" } }, - "node_modules/@opentelemetry/instrumentation": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz", - "integrity": "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==", + "node_modules/@nx/eslint-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@opentelemetry/api-logs": "0.52.1", - "@types/shimmer": "^1.0.2", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">=10.13.0" } }, - "node_modules/@opentelemetry/instrumentation-dataloader": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.10.0.tgz", - "integrity": "sha512-yoAHGsgXx0YNFJ5XgCAgPo2Wr7Hy4IQX7YTcCulnKuxdfFXybsM9Yz7wiF9X2X2eB6HRLRJRufXT0sujbHaq1g==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0" - }, + "node_modules/@nx/eslint-plugin/node_modules/globals": { + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz", + "integrity": "sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==", + "dev": true, "engines": { - "node": ">=14" + "node": ">=18" }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@opentelemetry/instrumentation-dns": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.37.0.tgz", - "integrity": "sha512-vhIOqqUGq1qwSKS6mF9tpXP7GmVQpQK4zm7bn2UYModpm+YYQzghtf/D8JH6lxXyUMP40zA37xUd2HO6uze/dw==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "semver": "^7.5.4" - }, + "node_modules/@nx/eslint-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">=8" } }, - "node_modules/@opentelemetry/instrumentation-dns/node_modules/lru-cache": { + "node_modules/@nx/eslint-plugin/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -10492,10 +11911,25 @@ "node": ">=10" } }, - "node_modules/@opentelemetry/instrumentation-dns/node_modules/semver": { + "node_modules/@nx/eslint-plugin/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@nx/eslint-plugin/node_modules/semver": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -10506,86 +11940,23 @@ "node": ">=10" } }, - "node_modules/@opentelemetry/instrumentation-express": { - "version": "0.40.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.40.1.tgz", - "integrity": "sha512-+RKMvVe2zw3kIXRup9c1jFu3T4d0fs5aKy015TpiMyoCKX1UMu3Z0lfgYtuyiSTANvg5hZnDbWmQmqSPj9VTvg==", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fs": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.13.0.tgz", - "integrity": "sha512-sZxofhMkul95/Rb4R/Q1eP8mIpgWX8dXNCAOk1jMzl/I8xPJ5tnPgT+PIInPSiDh3kgZDTxK5Up1zMnUh0XqSg==", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-graphql": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.41.0.tgz", - "integrity": "sha512-R/gXeljgIhaRDKquVkKYT5QHPnFouM8ooyePZEP0kqyaVAedtR1V7NfAUJbxfTG5fBQa5wdmLjvu63+tzRXZCA==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.52.1.tgz", - "integrity": "sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/instrumentation": "0.52.1", - "@opentelemetry/semantic-conventions": "1.25.1", - "semver": "^7.5.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@nx/eslint-plugin/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { - "yallist": "^4.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "node_modules/@nx/eslint/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, "bin": { "semver": "bin/semver.js" }, @@ -10593,101 +11964,87 @@ "node": ">=10" } }, - "node_modules/@opentelemetry/instrumentation-ioredis": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.41.0.tgz", - "integrity": "sha512-rxiLloU8VyeJGm5j2fZS8ShVdB82n7VNP8wTwfUQqDwRfHCnkzGr+buKoxuhGD91gtwJ91RHkjHA1Eg6RqsUTg==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.23.0" + "node_modules/@nx/eslint/node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">=14.17" } }, - "node_modules/@opentelemetry/instrumentation-mongodb": { - "version": "0.45.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.45.0.tgz", - "integrity": "sha512-xnZP9+ayeB1JJyNE9cIiwhOJTzNEsRhXVdLgfzmrs48Chhhk026mQdM5CITfyXSCfN73FGAIB8d91+pflJEfWQ==", + "node_modules/@nx/jest": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-20.0.3.tgz", + "integrity": "sha512-ZC9OPSh1htpYEh+kGZAew5r1pLtOCZo3odqW7/DalCti2XOTVit8yuw1DahIqrzZ3BzcTq+q9W9Ng17mMVCaCA==", + "dev": true, "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/sdk-metrics": "^1.9.1", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@jest/reporters": "^29.4.1", + "@jest/test-result": "^29.4.1", + "@nx/devkit": "20.0.3", + "@nx/js": "20.0.3", + "@phenomnomnominal/tsquery": "~5.0.1", + "chalk": "^4.1.0", + "identity-obj-proxy": "3.0.0", + "jest-config": "^29.4.1", + "jest-resolve": "^29.4.1", + "jest-util": "^29.4.1", + "minimatch": "9.0.3", + "resolve.exports": "1.1.0", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" } }, - "node_modules/@opentelemetry/instrumentation-winston": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.38.0.tgz", - "integrity": "sha512-rBAoVkv5HGyKFIpM3Xy5raPNJ/Le1JsAFPbxwbfOZUxpLT2YBB99h/jJYsHm+eNueJ7EBwz2ftqY8rEpVlk3XA==", + "node_modules/@nx/jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "@opentelemetry/api-logs": "^0.52.0", - "@opentelemetry/instrumentation": "^0.52.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation/node_modules/acorn": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", - "bin": { - "acorn": "bin/acorn" + "node": ">=8" }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/@opentelemetry/instrumentation/node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/@opentelemetry/instrumentation/node_modules/import-in-the-middle": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.8.1.tgz", - "integrity": "sha512-yhRwoHtiLGvmSozNOALgjRPFI6uYsds60EoMqqnXyyv+JOIW/BrrLejuTGBt+bq0T5tLzOHrN0T7xYTm4Qt/ng==", - "dependencies": { - "acorn": "^8.8.2", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@opentelemetry/instrumentation/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@nx/jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { - "yallist": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@opentelemetry/instrumentation/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "node_modules/@nx/jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/jest/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, "bin": { "semver": "bin/semver.js" }, @@ -10695,732 +12052,838 @@ "node": ">=10" } }, - "node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.52.1.tgz", - "integrity": "sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ==", + "node_modules/@nx/jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/otlp-transformer": "0.52.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "node": ">=8" } }, - "node_modules/@opentelemetry/otlp-grpc-exporter-base": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.52.1.tgz", - "integrity": "sha512-zo/YrSDmKMjG+vPeA9aBBrsQM9Q/f2zo6N04WMB3yNldJRsgpRBeLLwvAt/Ba7dpehDLOEFBd1i2JCoaFtpCoQ==", + "node_modules/@nx/js": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-20.0.3.tgz", + "integrity": "sha512-UbltxJyfEXL586kk7yxOTNHtigd7rq7atmcOmMphcxbeWk9HzeowVh6j6OA4MAKwYauomjCqsJbvWURI8qf+pg==", + "dev": true, "dependencies": { - "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.25.1", - "@opentelemetry/otlp-exporter-base": "0.52.1", - "@opentelemetry/otlp-transformer": "0.52.1" - }, - "engines": { - "node": ">=14" + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "20.0.3", + "@nx/workspace": "20.0.3", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^2.8.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "minimatch": "9.0.3", + "npm-package-arg": "11.0.1", + "npm-run-path": "^4.0.1", + "ora": "5.3.0", + "semver": "^7.5.3", + "source-map-support": "0.5.19", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.52.1.tgz", - "integrity": "sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg==", - "dependencies": { - "@opentelemetry/api-logs": "0.52.1", - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-logs": "0.52.1", - "@opentelemetry/sdk-metrics": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1", - "protobufjs": "^7.3.0" - }, - "engines": { - "node": ">=14" + "verdaccio": "^5.0.4" }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } } }, - "node_modules/@opentelemetry/propagator-b3": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.25.1.tgz", - "integrity": "sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A==", + "node_modules/@nx/js/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "@opentelemetry/core": "1.25.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=14" + "node": ">=8" }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@opentelemetry/propagator-jaeger": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.25.1.tgz", - "integrity": "sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA==", + "node_modules/@nx/js/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { - "@opentelemetry/core": "1.25.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=14" + "node": ">=10" }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@opentelemetry/redis-common": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", - "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", + "node_modules/@nx/js/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { - "node": ">=14" + "node": ">=8" } }, - "node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } + "node_modules/@nx/js/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true }, - "node_modules/@opentelemetry/sdk-logs": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.52.1.tgz", - "integrity": "sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA==", + "node_modules/@nx/js/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { - "@opentelemetry/api-logs": "0.52.1", - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1" + "yallist": "^4.0.0" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.4.0 <1.10.0" + "node": ">=10" } }, - "node_modules/@opentelemetry/sdk-metrics": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", - "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==", + "node_modules/@nx/js/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "lodash.merge": "^4.6.2" - }, - "engines": { - "node": ">=14" + "lru-cache": "^6.0.0" }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-node": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.52.1.tgz", - "integrity": "sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA==", - "dependencies": { - "@opentelemetry/api-logs": "0.52.1", - "@opentelemetry/core": "1.25.1", - "@opentelemetry/exporter-trace-otlp-grpc": "0.52.1", - "@opentelemetry/exporter-trace-otlp-http": "0.52.1", - "@opentelemetry/exporter-trace-otlp-proto": "0.52.1", - "@opentelemetry/exporter-zipkin": "1.25.1", - "@opentelemetry/instrumentation": "0.52.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-logs": "0.52.1", - "@opentelemetry/sdk-metrics": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1", - "@opentelemetry/sdk-trace-node": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "node": ">=10" } }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", - "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", + "node_modules/@nx/js/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "node": ">=8" } }, - "node_modules/@opentelemetry/sdk-trace-node": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.25.1.tgz", - "integrity": "sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ==", + "node_modules/@nx/node": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/node/-/node-20.0.3.tgz", + "integrity": "sha512-50JqKEVRmh2g9bxBxB0hDVzNae6rf9d5Iu8bTxpF55h6kivdoiYF793/awpxCpE6XPCij9IafeoaT77Ug8dQYA==", + "dev": true, "dependencies": { - "@opentelemetry/context-async-hooks": "1.25.1", - "@opentelemetry/core": "1.25.1", - "@opentelemetry/propagator-b3": "1.25.1", - "@opentelemetry/propagator-jaeger": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1", - "semver": "^7.5.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@nx/devkit": "20.0.3", + "@nx/eslint": "20.0.3", + "@nx/jest": "20.0.3", + "@nx/js": "20.0.3", + "tslib": "^2.3.0" } }, - "node_modules/@opentelemetry/sdk-trace-node/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "bin": { - "semver": "bin/semver.js" - }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "18.0.7", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.0.7.tgz", + "integrity": "sha512-0ZCgalq5NwJy0SPJGisFcT+kHftWoyMyb78yFNFeFCL7dPmLUq2QqbLR2HFo2SIuPFY5+DVv9FBB63ZbdPXTJw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10" + "node": ">= 10" } }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "node_modules/@nx/nx-darwin-x64": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.0.3.tgz", + "integrity": "sha512-Gobgkvsx61P5TI0uuDQTI/D2AXJt3xnBuAWQ4V/NW/OpkvL8j/q8zk81uK0tumVvIc4p5kSlGmQ46/ytSrdqvg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=14" + "node": ">= 10" } }, - "node_modules/@opentelemetry/winston-transport": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/winston-transport/-/winston-transport-0.4.0.tgz", - "integrity": "sha512-pWDLedHxqImrMi622QGBbuV4kMaR+DzJKHQtFHXxHt62koKy7OFqZIrPhTZj5XyAm+nM5Wy9b4YWs5QKUzLvHQ==", - "dependencies": { - "@opentelemetry/api-logs": "^0.52.0", - "winston-transport": "4.*" - }, + "node_modules/@nx/nx-freebsd-x64": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.0.3.tgz", + "integrity": "sha512-nbYp89BP0z0DzuaUH/yVVhCbL96vUUaKmCVmmdlvQRgiaX89BChAMuEdLNSeaDHFrhgTYB87ku3Ok6DRCAIOcg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=14" + "node": ">= 10" } }, - "node_modules/@parcel/watcher": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", - "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.0.3.tgz", + "integrity": "sha512-eKIYJPvXO/N1FjteZHC4DLV0u+2h70RmrDQODPztfl3mI5AjCwFdLf9RPN1D+SuNdfK1WwZIszY+FiVxrpK19A==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.4.1", - "@parcel/watcher-darwin-arm64": "2.4.1", - "@parcel/watcher-darwin-x64": "2.4.1", - "@parcel/watcher-freebsd-x64": "2.4.1", - "@parcel/watcher-linux-arm-glibc": "2.4.1", - "@parcel/watcher-linux-arm64-glibc": "2.4.1", - "@parcel/watcher-linux-arm64-musl": "2.4.1", - "@parcel/watcher-linux-x64-glibc": "2.4.1", - "@parcel/watcher-linux-x64-musl": "2.4.1", - "@parcel/watcher-win32-arm64": "2.4.1", - "@parcel/watcher-win32-ia32": "2.4.1", - "@parcel/watcher-win32-x64": "2.4.1" + "node": ">= 10" } }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", - "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.0.3.tgz", + "integrity": "sha512-CDFy2WNsMZvxshtGdFV/yCux1XkLtcqh0FiitNvGdgNugXXp3CLVEUx6dI3VBuIBNGbfozdr7n+fuXN6F2S4MQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "android" + "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">= 10" } }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", - "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.0.3.tgz", + "integrity": "sha512-BGrSRNPuDyj0yeP2MyzF1MMij1KO4Q/2YSgBbYzVSc8JdrUqf+3rqI8VXNTr3FcAKMTPgFjkFZ3XD3s/62gsdg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "darwin" + "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">= 10" } }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", - "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.0.3.tgz", + "integrity": "sha512-xGGjQ8q5XuF0/432APvAi/OSMdR3LZ1yQ9hYh+JGvM5wh44I3UbgBXRCJlsHp+t2hdlilF6kpaeMSiP1Z9CEbg==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ - "darwin" + "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">= 10" } }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", - "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", + "node_modules/@nx/nx-linux-x64-musl": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.0.3.tgz", + "integrity": "sha512-fTmZNbq3QQF5BLGPB8PGuFuNo3s2F86IQDOUYWpjXiuKjoI1Y5yM14RQpHLwYOGnUNoKYOhlv/JAyFrDX6ALZA==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ - "freebsd" + "linux" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">= 10" } }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", - "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.0.3.tgz", + "integrity": "sha512-hdtfg9pIzhtLqqGvsTemQYwe+kqqL1JGNgrlf3V59HSbbAADYZbHnliujoRybJo7dpeS/DDTNMNeblg99tFQLA==", "cpu": [ - "arm" + "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">= 10" } }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", - "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.0.3.tgz", + "integrity": "sha512-HcqE8AlWuwcsIOj0OnKDQ3q7L0RZsOrBRhDRKbJeUnIFz/t2R3q8Y6trrqTyFAafgW6JNLBp+tgcUyfHPUy/eQ==", "cpu": [ - "arm64" + "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { - "node": ">= 10.0.0" + "node": ">= 10" + } + }, + "node_modules/@nx/react": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/react/-/react-20.0.3.tgz", + "integrity": "sha512-RICOW29hA+apdSOqklDrrw5adfbuV7NEPCFInB02qSgywFjfQ5xShfMyoetXg1Gw5mojmCZeyJFb0g1Y5FaAhQ==", + "dev": true, + "dependencies": { + "@module-federation/enhanced": "0.6.6", + "@nx/devkit": "20.0.3", + "@nx/eslint": "20.0.3", + "@nx/js": "20.0.3", + "@nx/web": "20.0.3", + "@phenomnomnominal/tsquery": "~5.0.1", + "@svgr/webpack": "^8.0.1", + "express": "^4.19.2", + "file-loader": "^6.2.0", + "http-proxy-middleware": "^3.0.0", + "minimatch": "9.0.3", + "picocolors": "^1.1.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@nx/react/node_modules/http-proxy-middleware": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.3.tgz", + "integrity": "sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.15", + "debug": "^4.3.6", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.3", + "is-plain-object": "^5.0.0", + "micromatch": "^4.0.8" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@nx/react/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nx/storybook": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/storybook/-/storybook-20.0.3.tgz", + "integrity": "sha512-Nt5iWUYDEvA+S8I9aFnF5fhODV+H74XR+lS8kza+o0K4kRqhdvzp7WB3SanEuY/k3kbhP7M99dbBRZXJi3Sgdg==", + "dev": true, + "dependencies": { + "@nx/cypress": "20.0.3", + "@nx/devkit": "20.0.3", + "@nx/eslint": "20.0.3", + "@nx/js": "20.0.3", + "@phenomnomnominal/tsquery": "~5.0.1", + "semver": "^7.5.3", + "tslib": "^2.3.0" + } + }, + "node_modules/@nx/storybook/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nx/vite": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/vite/-/vite-20.0.3.tgz", + "integrity": "sha512-+C/nGgsLVNqPifY8DYtw1yM3pG53EoON6kahBR540hVECFcswgymHyTDDS+PUFqmXtANmYnt3eZxwnzCClegXw==", + "dev": true, + "dependencies": { + "@nx/devkit": "20.0.3", + "@nx/js": "20.0.3", + "@phenomnomnominal/tsquery": "~5.0.1", + "@swc/helpers": "~0.5.0", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "tsconfig-paths": "^4.1.2" + }, + "peerDependencies": { + "vite": "^5.0.0", + "vitest": "^1.3.1 || ^2.0.0" + } + }, + "node_modules/@nx/web": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/web/-/web-20.0.3.tgz", + "integrity": "sha512-b3KpUeA0cI9JIpRBYEk/4sIs9nCI6RcXCmxFoyW60vYsr2VtPZjtLKbo3bBT7HLOk3iwAYYWzCY1cu0Xzig3Lg==", + "dev": true, + "dependencies": { + "@nx/devkit": "20.0.3", + "@nx/js": "20.0.3", + "detect-port": "^1.5.1", + "http-server": "^14.1.0", + "picocolors": "^1.1.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@nx/workspace": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-20.0.3.tgz", + "integrity": "sha512-ctStDr9UlXt63v9wC1qS9lqLABSDfcfCH/FtQ6ZF5RjWIkzZS672g29gkT83L9B87dfRJYCH8yGGbvMJzq0qRA==", + "dev": true, + "dependencies": { + "@nx/devkit": "20.0.3", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "20.0.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" } }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", - "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", - "cpu": [ - "arm64" - ], + "node_modules/@nx/workspace/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">= 10.0.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", - "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", - "cpu": [ - "x64" - ], + "node_modules/@nx/workspace/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">= 10.0.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", - "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", - "cpu": [ - "x64" - ], + "node_modules/@nx/workspace/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=8" } }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", - "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", - "cpu": [ - "arm64" - ], + "node_modules/@nx/workspace/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" + "dependencies": { + "has-flag": "^4.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=8" } }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", - "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "engines": { - "node": ">= 10.0.0" + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz", + "integrity": "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==", + "dependencies": { + "@opentelemetry/api": "^1.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=14" } }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", - "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.25.1.tgz", + "integrity": "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==", "engines": { - "node": ">= 10.0.0" + "node": ">=14" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@peculiar/asn1-schema": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.8.tgz", - "integrity": "sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==", - "dev": true, + "node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", "dependencies": { - "asn1js": "^3.0.5", - "pvtsutils": "^1.3.5", - "tslib": "^2.6.2" + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@peculiar/json-schema": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", - "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", - "dev": true, + "node_modules/@opentelemetry/exporter-logs-otlp-http": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.52.1.tgz", + "integrity": "sha512-qKgywId2DbdowPZpOBXQKp0B8DfhfIArmSic15z13Nk/JAOccBUQdPwDjDnjsM5f0ckZFMVR2t/tijTUAqDZoA==", "dependencies": { - "tslib": "^2.0.0" + "@opentelemetry/api-logs": "0.52.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-exporter-base": "0.52.1", + "@opentelemetry/otlp-transformer": "0.52.1", + "@opentelemetry/sdk-logs": "0.52.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@peculiar/webcrypto": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.6.tgz", - "integrity": "sha512-YBcMfqNSwn3SujUJvAaySy5tlYbYm6tVt9SKoXu8BaTdKGROiJDgPR3TXpZdAKUfklzm3lRapJEAltiMQtBgZg==", - "dev": true, + "node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.52.1.tgz", + "integrity": "sha512-oAHPOy1sZi58bwqXaucd19F/v7+qE2EuVslQOEeLQT94CDuZJJ4tbWzx8DpYBTrOSzKqqrMtx9+PMxkrcbxOyQ==", "dependencies": { - "@peculiar/asn1-schema": "^2.3.8", - "@peculiar/json-schema": "^1.1.12", - "pvtsutils": "^1.3.5", - "tslib": "^2.6.2", - "webcrypto-core": "^1.7.9" + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-exporter-base": "0.52.1", + "@opentelemetry/otlp-transformer": "0.52.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-metrics": "1.25.1" }, "engines": { - "node": ">=10.12.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@phenomnomnominal/tsquery": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-5.0.1.tgz", - "integrity": "sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA==", - "dev": true, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.52.1.tgz", + "integrity": "sha512-pVkSH20crBwMTqB3nIN4jpQKUEoB0Z94drIHpYyEqs7UBr+I0cpYyOR3bqjA/UasQUMROb3GX8ZX4/9cVRqGBQ==", "dependencies": { - "esquery": "^1.4.0" + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-grpc-exporter-base": "0.52.1", + "@opentelemetry/otlp-transformer": "0.52.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1" + }, + "engines": { + "node": ">=14" }, "peerDependencies": { - "typescript": "^3 || ^4 || ^5" + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.52.1.tgz", + "integrity": "sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg==", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-exporter-base": "0.52.1", + "@opentelemetry/otlp-transformer": "0.52.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1" + }, "engines": { "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@playwright/test": { - "version": "1.42.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.42.1.tgz", - "integrity": "sha512-Gq9rmS54mjBL/7/MvBaNOBwbfnh7beHvS6oS4srqXFcQHpQCV1+c8JXWE8VLPyRDhgS3H8x8A7hztqI9VnwrAQ==", - "dev": true, + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.52.1.tgz", + "integrity": "sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ==", "dependencies": { - "playwright": "1.42.1" - }, - "bin": { - "playwright": "cli.js" + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-exporter-base": "0.52.1", + "@opentelemetry/otlp-transformer": "0.52.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1" }, "engines": { - "node": ">=16" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.25.1.tgz", + "integrity": "sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, "engines": { - "node": ">=12.22.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "node_modules/@opentelemetry/instrumentation": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz", + "integrity": "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==", "dependencies": { - "graceful-fs": "4.2.10" + "@opentelemetry/api-logs": "0.52.1", + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, "engines": { - "node": ">=12.22.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.10.0.tgz", + "integrity": "sha512-yoAHGsgXx0YNFJ5XgCAgPo2Wr7Hy4IQX7YTcCulnKuxdfFXybsM9Yz7wiF9X2X2eB6HRLRJRufXT0sujbHaq1g==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } }, - "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "node_modules/@opentelemetry/instrumentation-dns": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.37.0.tgz", + "integrity": "sha512-vhIOqqUGq1qwSKS6mF9tpXP7GmVQpQK4zm7bn2UYModpm+YYQzghtf/D8JH6lxXyUMP40zA37xUd2HO6uze/dw==", "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" + "@opentelemetry/instrumentation": "^0.52.0", + "semver": "^7.5.4" }, "engines": { - "node": ">=12" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.25", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", - "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==" + "node_modules/@opentelemetry/instrumentation-dns/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" + "node_modules/@opentelemetry/instrumentation-dns/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@prisma/client": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.7.1.tgz", - "integrity": "sha512-TUSa4nUcC4nf/e7X3jyO1pEd6XcI/TLRCA0KjkA46RDIpxUaRsBYEOqITwXRW2c0bMFyKcCRXrH4f7h4q9oOlg==", - "hasInstallScript": true, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.40.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.40.1.tgz", + "integrity": "sha512-+RKMvVe2zw3kIXRup9c1jFu3T4d0fs5aKy015TpiMyoCKX1UMu3Z0lfgYtuyiSTANvg5hZnDbWmQmqSPj9VTvg==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, "engines": { - "node": ">=16.13" + "node": ">=14" }, "peerDependencies": { - "prisma": "*" - }, - "peerDependenciesMeta": { - "prisma": { - "optional": true - } + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@prisma/debug": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.7.1.tgz", - "integrity": "sha512-yrVSO/YZOxdeIxcBtZ5BaNqUfPrZkNsAKQIQg36cJKMxj/VYK3Vk5jMKkI+gQLl0KReo1YvX8GWKfV788SELjw==" - }, - "node_modules/@prisma/engines": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.7.1.tgz", - "integrity": "sha512-R+Pqbra8tpLP2cvyiUpx+SIKglav3nTCpA+rn6826CThviQ8yvbNG0s8jNpo51vS9FuZO3pOkARqG062vKX7uA==", - "hasInstallScript": true, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.13.0.tgz", + "integrity": "sha512-sZxofhMkul95/Rb4R/Q1eP8mIpgWX8dXNCAOk1jMzl/I8xPJ5tnPgT+PIInPSiDh3kgZDTxK5Up1zMnUh0XqSg==", "dependencies": { - "@prisma/debug": "5.7.1", - "@prisma/engines-version": "5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5", - "@prisma/fetch-engine": "5.7.1", - "@prisma/get-platform": "5.7.1" + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@prisma/engines-version": { - "version": "5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5.tgz", - "integrity": "sha512-dIR5IQK/ZxEoWRBDOHF87r1Jy+m2ih3Joi4vzJRP+FOj5yxCwS2pS5SBR3TWoVnEK1zxtLI/3N7BjHyGF84fgw==" - }, - "node_modules/@prisma/fetch-engine": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.7.1.tgz", - "integrity": "sha512-9ELauIEBkIaEUpMIYPRlh5QELfoC6pyHolHVQgbNxglaINikZ9w9X7r1TIePAcm05pCNp2XPY1ObQIJW5nYfBQ==", + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.41.0.tgz", + "integrity": "sha512-R/gXeljgIhaRDKquVkKYT5QHPnFouM8ooyePZEP0kqyaVAedtR1V7NfAUJbxfTG5fBQa5wdmLjvu63+tzRXZCA==", "dependencies": { - "@prisma/debug": "5.7.1", - "@prisma/engines-version": "5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5", - "@prisma/get-platform": "5.7.1" + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@prisma/get-platform": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.7.1.tgz", - "integrity": "sha512-eDlswr3a1m5z9D/55Iyt/nZqS5UpD+DZ9MooBB3hvrcPhDQrcf9m4Tl7buy4mvAtrubQ626ECtb8c6L/f7rGSQ==", + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.52.1.tgz", + "integrity": "sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==", "dependencies": { - "@prisma/debug": "5.7.1" + "@opentelemetry/core": "1.25.1", + "@opentelemetry/instrumentation": "0.52.1", + "@opentelemetry/semantic-conventions": "1.25.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@prisma/instrumentation": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-5.7.1.tgz", - "integrity": "sha512-X7V3KbtIgWmTfVKIDua9xlhuE1CWRkT0/S+U0XQzj5CfDjwttrAzsjxvMHbNQUTsEuQDe+WHmx8PivyTT7dqBQ==", + "node_modules/@opentelemetry/instrumentation-http/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "@opentelemetry/api": "1.7.0", - "@opentelemetry/instrumentation": "0.45.1", - "@opentelemetry/sdk-trace-base": "1.18.1" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@prisma/instrumentation/node_modules/@opentelemetry/api": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.7.0.tgz", - "integrity": "sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==", + "node_modules/@opentelemetry/instrumentation-http/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=8.0.0" + "node": ">=10" } }, - "node_modules/@prisma/instrumentation/node_modules/@opentelemetry/core": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.18.1.tgz", - "integrity": "sha512-kvnUqezHMhsQvdsnhnqTNfAJs3ox/isB0SVrM1dhVFw7SsB7TstuVa6fgWnN2GdPyilIFLUvvbTZoVRmx6eiRg==", + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.41.0.tgz", + "integrity": "sha512-rxiLloU8VyeJGm5j2fZS8ShVdB82n7VNP8wTwfUQqDwRfHCnkzGr+buKoxuhGD91gtwJ91RHkjHA1Eg6RqsUTg==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.18.1" + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.23.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.8.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@prisma/instrumentation/node_modules/@opentelemetry/instrumentation": { - "version": "0.45.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.45.1.tgz", - "integrity": "sha512-V1Cr0g8hSg35lpW3G/GYVZurrhHrQZJdmP68WyJ83f1FDn3iru+/Vnlto9kiOSm7PHhW+pZGdb9Fbv+mkQ31CA==", - "dependencies": { - "@types/shimmer": "^1.0.2", - "import-in-the-middle": "1.4.2", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.45.0.tgz", + "integrity": "sha512-xnZP9+ayeB1JJyNE9cIiwhOJTzNEsRhXVdLgfzmrs48Chhhk026mQdM5CITfyXSCfN73FGAIB8d91+pflJEfWQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/sdk-metrics": "^1.9.1", + "@opentelemetry/semantic-conventions": "^1.22.0" }, "engines": { "node": ">=14" @@ -11429,46 +12892,52 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@prisma/instrumentation/node_modules/@opentelemetry/resources": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.18.1.tgz", - "integrity": "sha512-JjbcQLYMttXcIabflLRuaw5oof5gToYV9fuXbcsoOeQ0BlbwUn6DAZi++PNsSz2jjPeASfDls10iaO/8BRIPRA==", + "node_modules/@opentelemetry/instrumentation-winston": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.38.0.tgz", + "integrity": "sha512-rBAoVkv5HGyKFIpM3Xy5raPNJ/Le1JsAFPbxwbfOZUxpLT2YBB99h/jJYsHm+eNueJ7EBwz2ftqY8rEpVlk3XA==", "dependencies": { - "@opentelemetry/core": "1.18.1", - "@opentelemetry/semantic-conventions": "1.18.1" + "@opentelemetry/api-logs": "^0.52.0", + "@opentelemetry/instrumentation": "^0.52.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.8.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@prisma/instrumentation/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.18.1.tgz", - "integrity": "sha512-tRHfDxN5dO+nop78EWJpzZwHsN1ewrZRVVwo03VJa3JQZxToRDH29/+MB24+yoa+IArerdr7INFJiX/iN4gjqg==", - "dependencies": { - "@opentelemetry/core": "1.18.1", - "@opentelemetry/resources": "1.18.1", - "@opentelemetry/semantic-conventions": "1.18.1" + "node_modules/@opentelemetry/instrumentation/node_modules/acorn": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=14" - }, + "node": ">=0.4.0" + } + }, + "node_modules/@opentelemetry/instrumentation/node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.8.0" + "acorn": "^8" } }, - "node_modules/@prisma/instrumentation/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.18.1.tgz", - "integrity": "sha512-+NLGHr6VZwcgE/2lw8zDIufOCGnzsA5CbQIMleXZTrgkBd0TanCX+MiDYJ1TOS4KL/Tqk0nFRxawnaYr6pkZkA==", - "engines": { - "node": ">=14" + "node_modules/@opentelemetry/instrumentation/node_modules/import-in-the-middle": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.8.1.tgz", + "integrity": "sha512-yhRwoHtiLGvmSozNOALgjRPFI6uYsds60EoMqqnXyyv+JOIW/BrrLejuTGBt+bq0T5tLzOHrN0T7xYTm4Qt/ng==", + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" } }, - "node_modules/@prisma/instrumentation/node_modules/lru-cache": { + "node_modules/@opentelemetry/instrumentation/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", @@ -11479,7 +12948,7 @@ "node": ">=10" } }, - "node_modules/@prisma/instrumentation/node_modules/semver": { + "node_modules/@opentelemetry/instrumentation/node_modules/semver": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", @@ -11493,723 +12962,648 @@ "node": ">=10" } }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.52.1.tgz", + "integrity": "sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ==", "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-transformer": "0.52.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "node_modules/@radix-ui/number": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz", - "integrity": "sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==", - "dev": true, + "node_modules/@opentelemetry/otlp-grpc-exporter-base": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.52.1.tgz", + "integrity": "sha512-zo/YrSDmKMjG+vPeA9aBBrsQM9Q/f2zo6N04WMB3yNldJRsgpRBeLLwvAt/Ba7dpehDLOEFBd1i2JCoaFtpCoQ==", "dependencies": { - "@babel/runtime": "^7.13.10" + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-exporter-base": "0.52.1", + "@opentelemetry/otlp-transformer": "0.52.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@radix-ui/primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", - "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", - "dev": true, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.52.1.tgz", + "integrity": "sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg==", "dependencies": { - "@babel/runtime": "^7.13.10" + "@opentelemetry/api-logs": "0.52.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-logs": "0.52.1", + "@opentelemetry/sdk-metrics": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", + "protobufjs": "^7.3.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", - "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==", - "dev": true, + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.25.1.tgz", + "integrity": "sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A==", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" + "@opentelemetry/core": "1.25.1" }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "engines": { + "node": ">=14" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@radix-ui/react-collection": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", - "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==", - "dev": true, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.25.1.tgz", + "integrity": "sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA==", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2" + "@opentelemetry/core": "1.25.1" }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "engines": { + "node": ">=14" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", - "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", - "dev": true, + "node_modules/@opentelemetry/redis-common": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", + "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", + "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", "dependencies": { - "@babel/runtime": "^7.13.10" + "@opentelemetry/core": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" + "engines": { + "node": ">=14" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@radix-ui/react-context": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", - "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", - "dev": true, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.52.1.tgz", + "integrity": "sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA==", "dependencies": { - "@babel/runtime": "^7.13.10" + "@opentelemetry/api-logs": "0.52.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1" }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" + "engines": { + "node": ">=14" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, - "node_modules/@radix-ui/react-direction": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz", - "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==", - "dev": true, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", + "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==", "dependencies": { - "@babel/runtime": "^7.13.10" + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "lodash.merge": "^4.6.2" }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" + "engines": { + "node": ">=14" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz", - "integrity": "sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==", - "dev": true, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.52.1.tgz", + "integrity": "sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA==", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-escape-keydown": "1.0.3" + "@opentelemetry/api-logs": "0.52.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/exporter-trace-otlp-grpc": "0.52.1", + "@opentelemetry/exporter-trace-otlp-http": "0.52.1", + "@opentelemetry/exporter-trace-otlp-proto": "0.52.1", + "@opentelemetry/exporter-zipkin": "1.25.1", + "@opentelemetry/instrumentation": "0.52.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-logs": "0.52.1", + "@opentelemetry/sdk-metrics": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", + "@opentelemetry/sdk-trace-node": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "engines": { + "node": ">=14" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", - "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", - "dev": true, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", + "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", "dependencies": { - "@babel/runtime": "^7.13.10" + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" + "engines": { + "node": ">=14" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.3.tgz", - "integrity": "sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==", - "dev": true, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.25.1.tgz", + "integrity": "sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ==", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1" + "@opentelemetry/context-async-hooks": "1.25.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/propagator-b3": "1.25.1", + "@opentelemetry/propagator-jaeger": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": ">=10" } }, - "node_modules/@radix-ui/react-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", - "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", - "dev": true, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/winston-transport": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/winston-transport/-/winston-transport-0.4.0.tgz", + "integrity": "sha512-pWDLedHxqImrMi622QGBbuV4kMaR+DzJKHQtFHXxHt62koKy7OFqZIrPhTZj5XyAm+nM5Wy9b4YWs5QKUzLvHQ==", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" + "@opentelemetry/api-logs": "^0.52.0", + "winston-transport": "4.*" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": ">=14" } }, - "node_modules/@radix-ui/react-popper": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.2.tgz", - "integrity": "sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==", + "node_modules/@parcel/watcher": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", + "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", "dev": true, "dependencies": { - "@babel/runtime": "^7.13.10", - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1", - "@radix-ui/react-use-rect": "1.0.1", - "@radix-ui/react-use-size": "1.0.1", - "@radix-ui/rect": "1.0.1" + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "engines": { + "node": ">= 10.0.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.4.1", + "@parcel/watcher-darwin-arm64": "2.4.1", + "@parcel/watcher-darwin-x64": "2.4.1", + "@parcel/watcher-freebsd-x64": "2.4.1", + "@parcel/watcher-linux-arm-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-musl": "2.4.1", + "@parcel/watcher-linux-x64-glibc": "2.4.1", + "@parcel/watcher-linux-x64-musl": "2.4.1", + "@parcel/watcher-win32-arm64": "2.4.1", + "@parcel/watcher-win32-ia32": "2.4.1", + "@parcel/watcher-win32-x64": "2.4.1" } }, - "node_modules/@radix-ui/react-portal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.3.tgz", - "integrity": "sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==", + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", + "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", + "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@radix-ui/react-primitive": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", - "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", + "node_modules/@peculiar/asn1-schema": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.8.tgz", + "integrity": "sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==", "dev": true, "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-slot": "1.0.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "asn1js": "^3.0.5", + "pvtsutils": "^1.3.5", + "tslib": "^2.6.2" } }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz", - "integrity": "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==", + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", "dev": true, "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "tslib": "^2.0.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@radix-ui/react-select": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-1.2.2.tgz", - "integrity": "sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/number": "1.0.1", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.4", - "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.3", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-popper": "1.1.2", - "@radix-ui/react-portal": "1.0.3", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-controllable-state": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1", - "@radix-ui/react-use-previous": "1.0.1", - "@radix-ui/react-visually-hidden": "1.0.3", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "node_modules/@peculiar/webcrypto": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.6.tgz", + "integrity": "sha512-YBcMfqNSwn3SujUJvAaySy5tlYbYm6tVt9SKoXu8BaTdKGROiJDgPR3TXpZdAKUfklzm3lRapJEAltiMQtBgZg==", + "dev": true, + "dependencies": { + "@peculiar/asn1-schema": "^2.3.8", + "@peculiar/json-schema": "^1.1.12", + "pvtsutils": "^1.3.5", + "tslib": "^2.6.2", + "webcrypto-core": "^1.7.9" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": ">=10.12.0" } }, - "node_modules/@radix-ui/react-separator": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.0.3.tgz", - "integrity": "sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==", + "node_modules/@phenomnomnominal/tsquery": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-5.0.1.tgz", + "integrity": "sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA==", "dev": true, "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" + "esquery": "^1.4.0" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "typescript": "^3 || ^4 || ^5" } }, - "node_modules/@radix-ui/react-slot": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", - "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", + "node_modules/@playwright/test": { + "version": "1.42.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.42.1.tgz", + "integrity": "sha512-Gq9rmS54mjBL/7/MvBaNOBwbfnh7beHvS6oS4srqXFcQHpQCV1+c8JXWE8VLPyRDhgS3H8x8A7hztqI9VnwrAQ==", "dev": true, "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1" + "playwright": "1.42.1" }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" + "bin": { + "playwright": "cli.js" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": ">=16" } }, - "node_modules/@radix-ui/react-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.0.3.tgz", - "integrity": "sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==", - "dev": true, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "graceful-fs": "4.2.10" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": ">=12.22.0" } }, - "node_modules/@radix-ui/react-toggle-group": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.4.tgz", - "integrity": "sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==", - "dev": true, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", + "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-roving-focus": "1.0.4", - "@radix-ui/react-toggle": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": ">=12" } }, - "node_modules/@radix-ui/react-toolbar": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.0.4.tgz", - "integrity": "sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-roving-focus": "1.0.4", - "@radix-ui/react-separator": "1.0.3", - "@radix-ui/react-toggle-group": "1.0.4" + "node_modules/@polka/url": { + "version": "1.0.0-next.25", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", + "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==" + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@prisma/client": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.7.1.tgz", + "integrity": "sha512-TUSa4nUcC4nf/e7X3jyO1pEd6XcI/TLRCA0KjkA46RDIpxUaRsBYEOqITwXRW2c0bMFyKcCRXrH4f7h4q9oOlg==", + "hasInstallScript": true, + "engines": { + "node": ">=16.13" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "prisma": "*" }, "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { + "prisma": { "optional": true } } }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", - "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==", - "dev": true, + "node_modules/@prisma/debug": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.7.1.tgz", + "integrity": "sha512-yrVSO/YZOxdeIxcBtZ5BaNqUfPrZkNsAKQIQg36cJKMxj/VYK3Vk5jMKkI+gQLl0KReo1YvX8GWKfV788SELjw==" + }, + "node_modules/@prisma/engines": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.7.1.tgz", + "integrity": "sha512-R+Pqbra8tpLP2cvyiUpx+SIKglav3nTCpA+rn6826CThviQ8yvbNG0s8jNpo51vS9FuZO3pOkARqG062vKX7uA==", + "hasInstallScript": true, "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@prisma/debug": "5.7.1", + "@prisma/engines-version": "5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5", + "@prisma/fetch-engine": "5.7.1", + "@prisma/get-platform": "5.7.1" } }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", - "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==", - "dev": true, + "node_modules/@prisma/engines-version": { + "version": "5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5.tgz", + "integrity": "sha512-dIR5IQK/ZxEoWRBDOHF87r1Jy+m2ih3Joi4vzJRP+FOj5yxCwS2pS5SBR3TWoVnEK1zxtLI/3N7BjHyGF84fgw==" + }, + "node_modules/@prisma/fetch-engine": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.7.1.tgz", + "integrity": "sha512-9ELauIEBkIaEUpMIYPRlh5QELfoC6pyHolHVQgbNxglaINikZ9w9X7r1TIePAcm05pCNp2XPY1ObQIJW5nYfBQ==", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@prisma/debug": "5.7.1", + "@prisma/engines-version": "5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5", + "@prisma/get-platform": "5.7.1" } }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", - "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", - "dev": true, + "node_modules/@prisma/get-platform": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.7.1.tgz", + "integrity": "sha512-eDlswr3a1m5z9D/55Iyt/nZqS5UpD+DZ9MooBB3hvrcPhDQrcf9m4Tl7buy4mvAtrubQ626ECtb8c6L/f7rGSQ==", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "@prisma/debug": "5.7.1" } }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", - "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==", - "dev": true, + "node_modules/@prisma/instrumentation": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-5.7.1.tgz", + "integrity": "sha512-X7V3KbtIgWmTfVKIDua9xlhuE1CWRkT0/S+U0XQzj5CfDjwttrAzsjxvMHbNQUTsEuQDe+WHmx8PivyTT7dqBQ==", + "dependencies": { + "@opentelemetry/api": "1.7.0", + "@opentelemetry/instrumentation": "0.45.1", + "@opentelemetry/sdk-trace-base": "1.18.1" + } + }, + "node_modules/@prisma/instrumentation/node_modules/@opentelemetry/api": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.7.0.tgz", + "integrity": "sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@prisma/instrumentation/node_modules/@opentelemetry/core": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.18.1.tgz", + "integrity": "sha512-kvnUqezHMhsQvdsnhnqTNfAJs3ox/isB0SVrM1dhVFw7SsB7TstuVa6fgWnN2GdPyilIFLUvvbTZoVRmx6eiRg==", "dependencies": { - "@babel/runtime": "^7.13.10" + "@opentelemetry/semantic-conventions": "1.18.1" }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" + "engines": { + "node": ">=14" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" } }, - "node_modules/@radix-ui/react-use-previous": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz", - "integrity": "sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==", - "dev": true, + "node_modules/@prisma/instrumentation/node_modules/@opentelemetry/instrumentation": { + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.45.1.tgz", + "integrity": "sha512-V1Cr0g8hSg35lpW3G/GYVZurrhHrQZJdmP68WyJ83f1FDn3iru+/Vnlto9kiOSm7PHhW+pZGdb9Fbv+mkQ31CA==", "dependencies": { - "@babel/runtime": "^7.13.10" + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "1.4.2", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" + "engines": { + "node": ">=14" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz", - "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==", - "dev": true, + "node_modules/@prisma/instrumentation/node_modules/@opentelemetry/resources": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.18.1.tgz", + "integrity": "sha512-JjbcQLYMttXcIabflLRuaw5oof5gToYV9fuXbcsoOeQ0BlbwUn6DAZi++PNsSz2jjPeASfDls10iaO/8BRIPRA==", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/rect": "1.0.1" + "@opentelemetry/core": "1.18.1", + "@opentelemetry/semantic-conventions": "1.18.1" }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" + "engines": { + "node": ">=14" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" } }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz", - "integrity": "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==", - "dev": true, + "node_modules/@prisma/instrumentation/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.18.1.tgz", + "integrity": "sha512-tRHfDxN5dO+nop78EWJpzZwHsN1ewrZRVVwo03VJa3JQZxToRDH29/+MB24+yoa+IArerdr7INFJiX/iN4gjqg==", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.1" + "@opentelemetry/core": "1.18.1", + "@opentelemetry/resources": "1.18.1", + "@opentelemetry/semantic-conventions": "1.18.1" + }, + "engines": { + "node": ">=14" }, "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@prisma/instrumentation/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.18.1.tgz", + "integrity": "sha512-+NLGHr6VZwcgE/2lw8zDIufOCGnzsA5CbQIMleXZTrgkBd0TanCX+MiDYJ1TOS4KL/Tqk0nFRxawnaYr6pkZkA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@prisma/instrumentation/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": ">=10" } }, - "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz", - "integrity": "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==", - "dev": true, + "node_modules/@prisma/instrumentation/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" + "lru-cache": "^6.0.0" }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "bin": { + "semver": "bin/semver.js" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": ">=10" } }, - "node_modules/@radix-ui/rect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz", - "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==", - "dev": true, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "dependencies": { - "@babel/runtime": "^7.13.10" + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" } }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, "node_modules/@react-aria/breadcrumbs": { "version": "3.5.11", "resolved": "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.5.11.tgz", @@ -13669,6 +15063,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -13682,18 +15077,20 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.0.tgz", - "integrity": "sha512-BcnSPRM76/cD2gQC+rQNGBN6GStBs2pl/FpweW8JYuz5J/IEa0Fr4AtrPv766DB/6b2MZ/AfSIOSGw3nEIP8SA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", + "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -13707,6 +15104,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -13720,6 +15118,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -13733,6 +15132,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -13746,6 +15146,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -13759,6 +15160,7 @@ "ppc64le" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -13772,6 +15174,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -13785,6 +15188,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -13824,6 +15228,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -13837,6 +15242,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -13850,11 +15256,18 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, "node_modules/@sentry/browser": { "version": "6.19.7", "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.19.7.tgz", @@ -14058,7 +15471,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "devOptional": true, + "dev": true, "dependencies": { "type-detect": "4.0.8" } @@ -14067,7 +15480,7 @@ "version": "10.3.0", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "devOptional": true, + "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -14086,6 +15499,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.2.0.tgz", "integrity": "sha512-wRlta7GuLWpTqtFfGo+nZyOO1vEvewdNR1R4rTxpC8XU6vG/NDyrFBhwLZsqg1NUoR1noVaXJPC/7ZK47QCySw==", + "optional": true, "dependencies": { "@smithy/types": "^2.12.0", "tslib": "^2.6.2" @@ -14095,26 +15509,81 @@ } }, "node_modules/@smithy/chunked-blob-reader": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.2.0.tgz", - "integrity": "sha512-3GJNvRwXBGdkDZZOGiziVYzDpn4j6zfyULHMDKAGIUo72yHALpE9CbhfQp/XcLNVoc1byfMpn6uW5H2BqPjgaQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-4.0.0.tgz", + "integrity": "sha512-jSqRnZvkT4egkq/7b6/QRCNXmmYVcHwnJldqJ3IhVpQE2atObVJ137xmGeuGFhjFUr8gCEVAOKwSY79OvpbDaQ==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" } }, "node_modules/@smithy/chunked-blob-reader-native": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.2.0.tgz", - "integrity": "sha512-VNB5+1oCgX3Fzs072yuRsUoC2N4Zg/LJ11DTxX3+Qu+Paa6AmbIF0E9sc2wthz9Psrk/zcOlTCyuposlIhPjZQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-3.0.1.tgz", + "integrity": "sha512-VEYtPvh5rs/xlyqpm5NRnfYLZn+q0SRPELbvBV+C/G7IQ+ouTuo+NKKa3ShG5OaFR8NYVMXls9hPYLTvIKKDrQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/util-base64": "^2.3.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/chunked-blob-reader-native/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader-native/node_modules/@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader-native/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader-native/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/@smithy/config-resolver": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.2.0.tgz", "integrity": "sha512-fsiMgd8toyUba6n1WRmr+qACzXltpdDkPTAaDqc8QqPBUzO+/JKwL6bUBseHVi8tu9l+3JOK+tSf7cay+4B3LA==", + "optional": true, "dependencies": { "@smithy/node-config-provider": "^2.3.0", "@smithy/types": "^2.12.0", @@ -14130,6 +15599,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.4.1.tgz", "integrity": "sha512-jCnbEQHvTOUQXxXOS110FIMc83dCXUlrqiG/q0QzUSYhglDj9bJVPFjXmxc6qUfARe0mEb8h9LeVoh7FUYHuUg==", + "optional": true, "dependencies": { "@smithy/middleware-endpoint": "^2.5.0", "@smithy/middleware-retry": "^2.3.0", @@ -14148,6 +15618,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.3.0.tgz", "integrity": "sha512-BWB9mIukO1wjEOo1Ojgl6LrG4avcaC7T/ZP6ptmAaW4xluhSIPZhY+/PI5YKzlk+jsm+4sQZB45Bt1OfMeQa3w==", + "optional": true, "dependencies": { "@smithy/node-config-provider": "^2.3.0", "@smithy/property-provider": "^2.2.0", @@ -14163,6 +15634,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.2.0.tgz", "integrity": "sha512-8janZoJw85nJmQZc4L8TuePp2pk1nxLgkxIR0TUjKJ5Dkj5oelB9WtiSSGXCQvNsJl0VSTvK/2ueMXxvpa9GVw==", + "optional": true, "dependencies": { "@aws-crypto/crc32": "3.0.0", "@smithy/types": "^2.12.0", @@ -14171,60 +15643,162 @@ } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.2.0.tgz", - "integrity": "sha512-UaPf8jKbcP71BGiO0CdeLmlg+RhWnlN8ipsMSdwvqBFigl5nil3rHOI/5GE3tfiuX8LvY5Z9N0meuU7Rab7jWw==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.11.tgz", + "integrity": "sha512-Pd1Wnq3CQ/v2SxRifDUihvpXzirJYbbtXfEnnLV/z0OGCTx/btVX74P86IgrZkjOydOASBGXdPpupYQI+iO/6A==", + "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^2.2.0", - "@smithy/types": "^2.12.0", + "@smithy/eventstream-serde-universal": "^3.0.10", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.2.0.tgz", - "integrity": "sha512-RHhbTw/JW3+r8QQH7PrganjNCiuiEZmpi6fYUAetFfPLfZ6EkiA08uN3EFfcyKubXQxOwTeJRZSQmDDCdUshaA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.8.tgz", + "integrity": "sha512-zkFIG2i1BLbfoGQnf1qEeMqX0h5qAznzaZmMVNnvPZz9J5AWBPkOMckZWPedGUPcVITacwIdQXoPcdIQq5FRcg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.2.0.tgz", - "integrity": "sha512-zpQMtJVqCUMn+pCSFcl9K/RPNtQE0NuMh8sKpCdEHafhwRsjP50Oq/4kMmvxSRy6d8Jslqd8BLvDngrUtmN9iA==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.10.tgz", + "integrity": "sha512-hjpU1tIsJ9qpcoZq9zGHBJPBOeBGYt+n8vfhDwnITPhEre6APrvqq/y3XMDEGUT2cWQ4ramNqBPRbx3qn55rhw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^2.2.0", - "@smithy/types": "^2.12.0", + "@smithy/eventstream-serde-universal": "^3.0.10", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.2.0.tgz", - "integrity": "sha512-pvoe/vvJY0mOpuF84BEtyZoYfbehiFj8KKWk1ds2AT0mTLYFVs+7sBJZmioOFdBXKd48lfrx1vumdPdmGlCLxA==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.10.tgz", + "integrity": "sha512-ewG1GHbbqsFZ4asaq40KmxCmXO+AFSM1b+DcO2C03dyJj/ZH71CiTg853FSE/3SHK9q3jiYQIFjlGSwfxQ9kww==", + "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^2.2.0", - "@smithy/types": "^2.12.0", + "@smithy/eventstream-codec": "^3.1.7", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal/node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal/node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/eventstream-serde-universal/node_modules/@smithy/eventstream-codec": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.7.tgz", + "integrity": "sha512-kVSXScIiRN7q+s1x7BrQtZ1Aa9hvvP9FeCqCdBxv37GimIHgBCOnZ5Ip80HLt0DhnAKpiobFdGqTFgbaJNrazA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^3.6.0", + "@smithy/util-hex-encoding": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/eventstream-serde-universal/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal/node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/@smithy/fetch-http-handler": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.5.0.tgz", "integrity": "sha512-BOWEBeppWhLn/no/JxUL/ghTfANTjT7kg3Ww2rPqTUY9R4yHPXxJ9JhMe3Z03LN3aPwiwlpDIUcVw1xDyHqEhw==", + "optional": true, "dependencies": { "@smithy/protocol-http": "^3.3.0", "@smithy/querystring-builder": "^2.2.0", @@ -14234,20 +15808,34 @@ } }, "node_modules/@smithy/hash-blob-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.2.0.tgz", - "integrity": "sha512-SGPoVH8mdXBqrkVCJ1Hd1X7vh1zDXojNN1yZyZTZsCno99hVue9+IYzWDjq/EQDDXxmITB0gBmuyPh8oAZSTcg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.7.tgz", + "integrity": "sha512-4yNlxVNJifPM5ThaA5HKnHkn7JhctFUHvcaz6YXxHlYOSIrzI6VKQPTN8Gs1iN5nqq9iFcwIR9THqchUCouIfg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/chunked-blob-reader": "^4.0.0", + "@smithy/chunked-blob-reader-native": "^3.0.1", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/hash-blob-browser/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", "dependencies": { - "@smithy/chunked-blob-reader": "^2.2.0", - "@smithy/chunked-blob-reader-native": "^2.2.0", - "@smithy/types": "^2.12.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/@smithy/hash-node": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.2.0.tgz", "integrity": "sha512-zLWaC/5aWpMrHKpoDF6nqpNtBhlAYKF/7+9yMN7GpdR8CzohnWfGtMznPybnwSS8saaXBMxIGwJqR4HmRp6b3g==", + "optional": true, "dependencies": { "@smithy/types": "^2.12.0", "@smithy/util-buffer-from": "^2.2.0", @@ -14259,22 +15847,74 @@ } }, "node_modules/@smithy/hash-stream-node": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.2.0.tgz", - "integrity": "sha512-aT+HCATOSRMGpPI7bi7NSsTNVZE/La9IaxLXWoVAYMxHT5hGO3ZOGEMZQg8A6nNL+pdFGtZQtND1eoY084HgHQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-3.1.7.tgz", + "integrity": "sha512-xMAsvJ3hLG63lsBVi1Hl6BBSfhd8/Qnp8fC06kjOpJvyyCEXdwHITa5Kvdsk6gaAXLhbZMhQMIGvgUbfnJDP6Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.6.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/hash-stream-node/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/hash-stream-node/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/hash-stream-node/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/hash-stream-node/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^2.12.0", - "@smithy/util-utf8": "^2.3.0", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/invalid-dependency": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.2.0.tgz", "integrity": "sha512-nEDASdbKFKPXN2O6lOlTgrEEOO9NHIeO+HVvZnkqc8h5U9g3BIhWsvzFo+UcUbliMHvKNPD/zVxDrkP1Sbgp8Q==", + "optional": true, "dependencies": { "@smithy/types": "^2.12.0", "tslib": "^2.6.2" @@ -14292,19 +15932,71 @@ } }, "node_modules/@smithy/md5-js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.2.0.tgz", - "integrity": "sha512-M26XTtt9IIusVMOWEAhIvFIr9jYj4ISPPGJROqw6vXngO3IYJCnVVSMFn4Tx1rUTG5BiKJNg9u2nxmBiZC5IlQ==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-3.0.8.tgz", + "integrity": "sha512-LwApfTK0OJ/tCyNUXqnWCKoE2b4rDSr4BJlDAVCkiWYeHESr+y+d5zlAanuLW6fnitVJRD/7d9/kN/ZM9Su4mA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^2.12.0", - "@smithy/util-utf8": "^2.3.0", + "@smithy/types": "^3.6.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/md5-js/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/md5-js/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/md5-js/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/md5-js/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/@smithy/middleware-content-length": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.2.0.tgz", "integrity": "sha512-5bl2LG1Ah/7E5cMSC+q+h3IpVHMeOkG0yLRyQT1p2aMJkSrZG7RlXHPuAgb7EyaFeidKEnnd/fNaLLaKlHGzDQ==", + "optional": true, "dependencies": { "@smithy/protocol-http": "^3.3.0", "@smithy/types": "^2.12.0", @@ -14318,6 +16010,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.5.0.tgz", "integrity": "sha512-OBhI9ZEAG8Xen0xsFJwwNOt44WE2CWkfYIxTognC8x42Lfsdf0VN/wCMqpdkySMDio/vts10BiovAxQp0T0faA==", + "optional": true, "dependencies": { "@smithy/middleware-serde": "^2.3.0", "@smithy/node-config-provider": "^2.3.0", @@ -14335,6 +16028,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.3.0.tgz", "integrity": "sha512-5H7kD0My2RkZryvYIWA4C9w6t/pdJfbgEdq+fcZhbnZsqHm/4vYFVjDsOzb5pC7PEpksuijoM9fGbM6eN4rLSg==", + "optional": true, "dependencies": { "@smithy/node-config-provider": "^2.3.0", "@smithy/protocol-http": "^3.3.0", @@ -14354,6 +16048,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.3.0.tgz", "integrity": "sha512-sIADe7ojwqTyvEQBe1nc/GXB9wdHhi9UwyX0lTyttmUWDJLP655ZYE1WngnNyXREme8I27KCaUhyhZWRXL0q7Q==", + "optional": true, "dependencies": { "@smithy/types": "^2.12.0", "tslib": "^2.6.2" @@ -14366,6 +16061,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.2.0.tgz", "integrity": "sha512-Qntc3jrtwwrsAC+X8wms8zhrTr0sFXnyEGhZd9sLtsJ/6gGQKFzNB+wWbOcpJd7BR8ThNCoKt76BuQahfMvpeA==", + "optional": true, "dependencies": { "@smithy/types": "^2.12.0", "tslib": "^2.6.2" @@ -14378,6 +16074,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.3.0.tgz", "integrity": "sha512-0elK5/03a1JPWMDPaS726Iw6LpQg80gFut1tNpPfxFuChEEklo2yL823V94SpTZTxmKlXFtFgsP55uh3dErnIg==", + "optional": true, "dependencies": { "@smithy/property-provider": "^2.2.0", "@smithy/shared-ini-file-loader": "^2.4.0", @@ -14392,6 +16089,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.5.0.tgz", "integrity": "sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==", + "optional": true, "dependencies": { "@smithy/abort-controller": "^2.2.0", "@smithy/protocol-http": "^3.3.0", @@ -14407,6 +16105,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.2.0.tgz", "integrity": "sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg==", + "optional": true, "dependencies": { "@smithy/types": "^2.12.0", "tslib": "^2.6.2" @@ -14419,6 +16118,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.3.0.tgz", "integrity": "sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==", + "optional": true, "dependencies": { "@smithy/types": "^2.12.0", "tslib": "^2.6.2" @@ -14431,6 +16131,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.2.0.tgz", "integrity": "sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==", + "optional": true, "dependencies": { "@smithy/types": "^2.12.0", "@smithy/util-uri-escape": "^2.2.0", @@ -14444,6 +16145,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.2.0.tgz", "integrity": "sha512-BvHCDrKfbG5Yhbpj4vsbuPV2GgcpHiAkLeIlcA1LtfpMz3jrqizP1+OguSNSj1MwBHEiN+jwNisXLGdajGDQJA==", + "optional": true, "dependencies": { "@smithy/types": "^2.12.0", "tslib": "^2.6.2" @@ -14456,6 +16158,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.1.5.tgz", "integrity": "sha512-uBDTIBBEdAQryvHdc5W8sS5YX7RQzF683XrHePVdFmAgKiMofU15FLSM0/HU03hKTnazdNRFa0YHS7+ArwoUSQ==", + "optional": true, "dependencies": { "@smithy/types": "^2.12.0" }, @@ -14467,6 +16170,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.4.0.tgz", "integrity": "sha512-WyujUJL8e1B6Z4PBfAqC/aGY1+C7T0w20Gih3yrvJSk97gpiVfB+y7c46T4Nunk+ZngLq0rOIdeVeIklk0R3OA==", + "optional": true, "dependencies": { "@smithy/types": "^2.12.0", "tslib": "^2.6.2" @@ -14479,6 +16183,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.2.0.tgz", "integrity": "sha512-+B5TNzj/fRZzVW3z8UUJOkNx15+4E0CLuvJmJUA1JUIZFp3rdJ/M2H5r2SqltaVPXL0oIxv/6YK92T9TsFGbFg==", + "optional": true, "dependencies": { "@smithy/eventstream-codec": "^2.2.0", "@smithy/is-array-buffer": "^2.2.0", @@ -14497,6 +16202,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.5.0.tgz", "integrity": "sha512-DDXWHWdimtS3y/Kw1Jo46KQ0ZYsDKcldFynQERUGBPDpkW1lXOTHy491ALHjwfiBQvzsVKVxl5+ocXNIgJuX4g==", + "optional": true, "dependencies": { "@smithy/middleware-endpoint": "^2.5.0", "@smithy/middleware-stack": "^2.2.0", @@ -14524,6 +16230,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.2.0.tgz", "integrity": "sha512-hoA4zm61q1mNTpksiSWp2nEl1dt3j726HdRhiNgVJQMj7mLp7dprtF57mOB6JvEk/x9d2bsuL5hlqZbBuHQylQ==", + "optional": true, "dependencies": { "@smithy/querystring-parser": "^2.2.0", "@smithy/types": "^2.12.0", @@ -14534,6 +16241,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.3.0.tgz", "integrity": "sha512-s3+eVwNeJuXUwuMbusncZNViuhv2LjVJ1nMwTqSA0XAC7gjKhqqxRdJPhR8+YrkoZ9IiIbFk/yK6ACe/xlF+hw==", + "optional": true, "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "@smithy/util-utf8": "^2.3.0", @@ -14547,6 +16255,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.2.0.tgz", "integrity": "sha512-dtpw9uQP7W+n3vOtx0CfBD5EWd7EPdIdsQnWTDoFf77e3VUf05uA7R7TGipIo8e4WL2kuPdnsr3hMQn9ziYj5w==", + "optional": true, "dependencies": { "tslib": "^2.6.2" } @@ -14555,6 +16264,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.3.0.tgz", "integrity": "sha512-ITWT1Wqjubf2CJthb0BuT9+bpzBfXeMokH/AAa5EJQgbv9aPMVfnM76iFIZVFf50hYXGbtiV71BHAthNWd6+dw==", + "optional": true, "dependencies": { "tslib": "^2.6.2" }, @@ -14578,6 +16288,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.3.0.tgz", "integrity": "sha512-HZkzrRcuFN1k70RLqlNK4FnPXKOpkik1+4JaBoHNJn+RnJGYqaa3c5/+XtLOXhlKzlRgNvyaLieHTW2VwGN0VQ==", + "optional": true, "dependencies": { "tslib": "^2.6.2" }, @@ -14589,6 +16300,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.2.0.tgz", "integrity": "sha512-2okTdZaCBvOJszAPU/KSvlimMe35zLOKbQpHhamFJmR7t95HSe0K3C92jQPjKY3PmDBD+7iMkOnuW05F5OlF4g==", + "optional": true, "dependencies": { "@smithy/property-provider": "^2.2.0", "@smithy/smithy-client": "^2.5.0", @@ -14604,6 +16316,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.3.0.tgz", "integrity": "sha512-hfKXnNLmsW9cmLb/JXKIvtuO6Cf4SuqN5PN1C2Ru/TBIws+m1wSgb+A53vo0r66xzB6E82inKG2J7qtwdi+Kkw==", + "optional": true, "dependencies": { "@smithy/config-resolver": "^2.2.0", "@smithy/credential-provider-imds": "^2.3.0", @@ -14621,6 +16334,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.2.0.tgz", "integrity": "sha512-BuDHv8zRjsE5zXd3PxFXFknzBG3owCpjq8G3FcsXW3CykYXuEqM3nTSsmLzw5q+T12ZYuDlVUZKBdpNbhVtlrQ==", + "optional": true, "dependencies": { "@smithy/node-config-provider": "^2.3.0", "@smithy/types": "^2.12.0", @@ -14634,6 +16348,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.2.0.tgz", "integrity": "sha512-7iKXR+/4TpLK194pVjKiasIyqMtTYJsgKgM242Y9uzt5dhHnUDvMNb+3xIhRJ9QhvqGii/5cRUt4fJn3dtXNHQ==", + "optional": true, "dependencies": { "tslib": "^2.6.2" }, @@ -14645,6 +16360,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.2.0.tgz", "integrity": "sha512-L1qpleXf9QD6LwLCJ5jddGkgWyuSvWBkJwWAZ6kFkdifdso+sk3L3O1HdmPvCdnCK3IS4qWyPxev01QMnfHSBw==", + "optional": true, "dependencies": { "@smithy/types": "^2.12.0", "tslib": "^2.6.2" @@ -14657,6 +16373,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.2.0.tgz", "integrity": "sha512-q9+pAFPTfftHXRytmZ7GzLFFrEGavqapFc06XxzZFcSIGERXMerXxCitjOG1prVDR9QdjqotF40SWvbqcCpf8g==", + "optional": true, "dependencies": { "@smithy/service-error-classification": "^2.1.5", "@smithy/types": "^2.12.0", @@ -14670,6 +16387,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.2.0.tgz", "integrity": "sha512-17faEXbYWIRst1aU9SvPZyMdWmqIrduZjVOqCPMIsWFNxs5yQQgFrJL6b2SdiCzyW9mJoDjFtgi53xx7EH+BXA==", + "optional": true, "dependencies": { "@smithy/fetch-http-handler": "^2.5.0", "@smithy/node-http-handler": "^2.5.0", @@ -14681,1141 +16399,470 @@ "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/util-uri-escape": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.2.0.tgz", - "integrity": "sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/util-waiter": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.2.0.tgz", - "integrity": "sha512-IHk53BVw6MPMi2Gsn+hCng8rFA3ZmR3Rk7GllxDUW9qFJl/hiSvskn7XldkECapQVkIg/1dHpMAxI9xSTaLLSA==", - "dependencies": { - "@smithy/abort-controller": "^2.2.0", - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@storybook/addon-a11y": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-8.0.5.tgz", - "integrity": "sha512-QWMbFyZ3Cs859OZ4hoidfZBVHpQ+BAsyu88g/o+AKh5hP3/SRu8g+D/ZVtt2vkwN4jvIQzNDpzjIYKp1zRDczQ==", - "dev": true, - "dependencies": { - "@storybook/addon-highlight": "8.0.5", - "axe-core": "^4.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-actions": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.0.5.tgz", - "integrity": "sha512-l1UBvD61DRcfuBTkdqMp2K+60M1QpvhNpYxMmJ/JEYQjzWTg/s9gLmX8eSjgA5bi0sjjJ5i1ddr9d8nHrmwfPA==", - "dev": true, - "dependencies": { - "@storybook/core-events": "8.0.5", - "@storybook/global": "^5.0.0", - "@types/uuid": "^9.0.1", - "dequal": "^2.0.2", - "polished": "^4.2.2", - "uuid": "^9.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-backgrounds": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.0.5.tgz", - "integrity": "sha512-XKSnJm6bGVkG9hv6VSK+djz7ZbxEHwVpsSEUKtOEt/ScLFxU0mlsH8dd5aMy9/MAYuB93Y+bJ2SR5kyOjmi1zQ==", - "dev": true, - "dependencies": { - "@storybook/global": "^5.0.0", - "memoizerific": "^1.11.3", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-controls": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.0.5.tgz", - "integrity": "sha512-iUL89OJQse9DlZkwY8jhyl12L/qziUkwbdSgQJxRIEceW6vrHAmc5VGwneS7N3pBuiOIKQQmMhAQ660JXHM7eQ==", - "dev": true, - "dependencies": { - "@storybook/blocks": "8.0.5", - "lodash": "^4.17.21", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-docs": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.0.5.tgz", - "integrity": "sha512-FMlJLPjyNpqY68/9SJH7350/ncySKMGBQQAQnPrMtGVBld8eeOo3DB+GSffOSbmitomq+t16HOprvPSekTMlPw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@mdx-js/react": "^3.0.0", - "@storybook/blocks": "8.0.5", - "@storybook/client-logger": "8.0.5", - "@storybook/components": "8.0.5", - "@storybook/csf-plugin": "8.0.5", - "@storybook/csf-tools": "8.0.5", - "@storybook/global": "^5.0.0", - "@storybook/node-logger": "8.0.5", - "@storybook/preview-api": "8.0.5", - "@storybook/react-dom-shim": "8.0.5", - "@storybook/theming": "8.0.5", - "@storybook/types": "8.0.5", - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "fs-extra": "^11.1.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", - "rehype-external-links": "^3.0.0", - "rehype-slug": "^6.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-essentials": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.0.5.tgz", - "integrity": "sha512-1yjwf9ibKn2rVqv+fqxACoIjsaUsimSEx8QwjIl2krDNhMULXzFeVubTQ09gXSVEnHUR1nKX3X9qOXJQ2bOFlQ==", - "dev": true, - "dependencies": { - "@storybook/addon-actions": "8.0.5", - "@storybook/addon-backgrounds": "8.0.5", - "@storybook/addon-controls": "8.0.5", - "@storybook/addon-docs": "8.0.5", - "@storybook/addon-highlight": "8.0.5", - "@storybook/addon-measure": "8.0.5", - "@storybook/addon-outline": "8.0.5", - "@storybook/addon-toolbars": "8.0.5", - "@storybook/addon-viewport": "8.0.5", - "@storybook/core-common": "8.0.5", - "@storybook/manager-api": "8.0.5", - "@storybook/node-logger": "8.0.5", - "@storybook/preview-api": "8.0.5", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-highlight": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.0.5.tgz", - "integrity": "sha512-z4Aad6Dcf9gQIEPkR8WVIdRj/5RARI6SeIX3JRJoZ4l6fu7AvTZKDWPRpwLXSpEQqdeOb7l7FrZHISmXdrPoiQ==", - "dev": true, - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-interactions": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.0.5.tgz", - "integrity": "sha512-o0wcWAeQR8pN5T1l87i+CH/xSp70/0uyQAmJ9xPxg/60dHbDgjTvn/pwg+hhKu+olrFVpt85yQPzQ4pNhAFlUw==", - "dev": true, - "dependencies": { - "@storybook/global": "^5.0.0", - "@storybook/instrumenter": "8.0.5", - "@storybook/test": "8.0.5", - "@storybook/types": "8.0.5", - "polished": "^4.2.2", - "ts-dedent": "^2.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-links": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.0.5.tgz", - "integrity": "sha512-B5EAs0+LxgYH59GSVVAfgW8rAzGUmzdAAR3XJKbTXp3/d9e27uXwpLVYhi/VQHKLIsshDQRbc0s109APHs/SjQ==", - "dev": true, - "dependencies": { - "@storybook/csf": "^0.1.2", - "@storybook/global": "^5.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - } - }, - "node_modules/@storybook/addon-mdx-gfm": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/addon-mdx-gfm/-/addon-mdx-gfm-8.0.5.tgz", - "integrity": "sha512-YbKbCJRITN60lptQGGmiQjdLJjyyIoy4kqEuV2p7gIqSCwa9djgI2+aQ1DzDEo8qLDY/DGdZUQVKlZ8TfVuJcA==", - "dev": true, - "dependencies": { - "@storybook/node-logger": "8.0.5", - "remark-gfm": "^4.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-measure": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.0.5.tgz", - "integrity": "sha512-B5c33aREHbTA+An7Q5Q1yEXUB0ETE5yPnGgsXuxVl6LyYqyqjai1qE48vcmkA7S+vt5MR6Sf9Lmy3UL+kkyYzQ==", - "dev": true, - "dependencies": { - "@storybook/global": "^5.0.0", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-outline": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.0.5.tgz", - "integrity": "sha512-ouQ4IOBw7AAyukkaQwNe2MRTpDbCv+j4z76BRE7qvu9PckifsWsm00pTQwvbNdjiogS8c3EPMV5aBGIPoK/zAQ==", - "dev": true, - "dependencies": { - "@storybook/global": "^5.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-toolbars": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.0.5.tgz", - "integrity": "sha512-1QrvHtsQI1RNzDrkTMUFaEzZRRKHYrkj/rYpf6B2QyFvaZ6XY4urxSrmssLENuPsoDF4ABU2j6j4BAUgWjIe4A==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addon-viewport": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.0.5.tgz", - "integrity": "sha512-Y2sTsNeQctfLBPQYuOjMGSQY4lUycZRZblToU0q6siJ030QjgpuEMcu1yDt654T6jnp/s4VwRS6yaZHnqZ97Mw==", - "dev": true, - "dependencies": { - "memoizerific": "^1.11.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addons": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-7.6.17.tgz", - "integrity": "sha512-Ok18Y698Ccyg++MoUNJNHY0cXUvo8ETFIRLJk1g9ElJ70j6kPgNnzW2pAtZkBNmswHtofZ7pT156cj96k/LgfA==", - "dev": true, - "peer": true, - "dependencies": { - "@storybook/manager-api": "7.6.17", - "@storybook/preview-api": "7.6.17", - "@storybook/types": "7.6.17" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addons/node_modules/@storybook/channels": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", - "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", - "dev": true, - "peer": true, - "dependencies": { - "@storybook/client-logger": "7.6.17", - "@storybook/core-events": "7.6.17", - "@storybook/global": "^5.0.0", - "qs": "^6.10.0", - "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addons/node_modules/@storybook/client-logger": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", - "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", - "dev": true, - "peer": true, - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addons/node_modules/@storybook/core-events": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", - "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", - "dev": true, - "peer": true, - "dependencies": { - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addons/node_modules/@storybook/manager-api": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.6.17.tgz", - "integrity": "sha512-IJIV1Yc6yw1dhCY4tReHCfBnUKDqEBnMyHp3mbXpsaHxnxJZrXO45WjRAZIKlQKhl/Ge1CrnznmHRCmYgqmrWg==", - "dev": true, - "peer": true, - "dependencies": { - "@storybook/channels": "7.6.17", - "@storybook/client-logger": "7.6.17", - "@storybook/core-events": "7.6.17", - "@storybook/csf": "^0.1.2", - "@storybook/global": "^5.0.0", - "@storybook/router": "7.6.17", - "@storybook/theming": "7.6.17", - "@storybook/types": "7.6.17", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "store2": "^2.14.2", - "telejson": "^7.2.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addons/node_modules/@storybook/preview-api": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.17.tgz", - "integrity": "sha512-wLfDdI9RWo1f2zzFe54yRhg+2YWyxLZvqdZnSQ45mTs4/7xXV5Wfbv3QNTtcdw8tT3U5KRTrN1mTfTCiRJc0Kw==", - "dev": true, - "peer": true, - "dependencies": { - "@storybook/channels": "7.6.17", - "@storybook/client-logger": "7.6.17", - "@storybook/core-events": "7.6.17", - "@storybook/csf": "^0.1.2", - "@storybook/global": "^5.0.0", - "@storybook/types": "7.6.17", - "@types/qs": "^6.9.5", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addons/node_modules/@storybook/router": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.6.17.tgz", - "integrity": "sha512-GnyC0j6Wi5hT4qRhSyT8NPtJfGmf82uZw97LQRWeyYu5gWEshUdM7aj40XlNiScd5cZDp0owO1idduVF2k2l2A==", - "dev": true, - "peer": true, - "dependencies": { - "@storybook/client-logger": "7.6.17", - "memoizerific": "^1.11.3", - "qs": "^6.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/addons/node_modules/@storybook/theming": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.6.17.tgz", - "integrity": "sha512-ZbaBt3KAbmBtfjNqgMY7wPMBshhSJlhodyMNQypv+95xLD/R+Az6aBYbpVAOygLaUQaQk4ar7H/Ww6lFIoiFbA==", - "dev": true, - "peer": true, - "dependencies": { - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.6.17", - "@storybook/global": "^5.0.0", - "memoizerific": "^1.11.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/addons/node_modules/@storybook/types": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", - "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", - "dev": true, - "peer": true, - "dependencies": { - "@storybook/channels": "7.6.17", - "@types/babel__core": "^7.0.0", - "@types/express": "^4.7.0", - "file-system-cache": "2.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/blocks": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.0.5.tgz", - "integrity": "sha512-zfcwJ0yE5HM28BxZeNU4SYF8zxq2PEqLP1aWCdRuZT9k8lgnBwAKzlvt50LtPzOfGtKuGnvIEriELx/i+Qh4Sw==", - "dev": true, - "dependencies": { - "@storybook/channels": "8.0.5", - "@storybook/client-logger": "8.0.5", - "@storybook/components": "8.0.5", - "@storybook/core-events": "8.0.5", - "@storybook/csf": "^0.1.2", - "@storybook/docs-tools": "8.0.5", - "@storybook/global": "^5.0.0", - "@storybook/icons": "^1.2.5", - "@storybook/manager-api": "8.0.5", - "@storybook/preview-api": "8.0.5", - "@storybook/theming": "8.0.5", - "@storybook/types": "8.0.5", - "@types/lodash": "^4.14.167", - "color-convert": "^2.0.1", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "markdown-to-jsx": "7.3.2", - "memoizerific": "^1.11.3", - "polished": "^4.2.2", - "react-colorful": "^5.1.2", - "telejson": "^7.2.0", - "tocbot": "^4.20.1", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@storybook/builder-manager": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-8.0.5.tgz", - "integrity": "sha512-63gIHfgdhpL3rcHkOcGm29PbIkgx2bLRxi2RYa0osGMtfBIePFXJh7nol+4KpaRkNR8RZg+N9omVGjyhLj7IWg==", - "dev": true, - "dependencies": { - "@fal-works/esbuild-plugin-global-externals": "^2.1.2", - "@storybook/core-common": "8.0.5", - "@storybook/manager": "8.0.5", - "@storybook/node-logger": "8.0.5", - "@types/ejs": "^3.1.1", - "@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10", - "browser-assert": "^1.2.1", - "ejs": "^3.1.8", - "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0", - "esbuild-plugin-alias": "^0.2.1", - "express": "^4.17.3", - "fs-extra": "^11.1.0", - "process": "^0.11.10", - "util": "^0.12.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/builder-manager/node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", - "dev": true, - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/builder-vite": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.0.5.tgz", - "integrity": "sha512-tKNxobC9tlYyUAayxoiOOnoMbg4RxoAwPOpPLnQYUfHLw1ecp/g8sGD6tisyFONyOIv7uF9gbzWLUfMjn9F2sw==", - "dev": true, - "dependencies": { - "@storybook/channels": "8.0.5", - "@storybook/client-logger": "8.0.5", - "@storybook/core-common": "8.0.5", - "@storybook/core-events": "8.0.5", - "@storybook/csf-plugin": "8.0.5", - "@storybook/node-logger": "8.0.5", - "@storybook/preview": "8.0.5", - "@storybook/preview-api": "8.0.5", - "@storybook/types": "8.0.5", - "@types/find-cache-dir": "^3.2.1", - "browser-assert": "^1.2.1", - "es-module-lexer": "^0.9.3", - "express": "^4.17.3", - "find-cache-dir": "^3.0.0", - "fs-extra": "^11.1.0", - "magic-string": "^0.30.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "@preact/preset-vite": "*", - "typescript": ">= 4.3.x", - "vite": "^4.0.0 || ^5.0.0", - "vite-plugin-glimmerx": "*" - }, - "peerDependenciesMeta": { - "@preact/preset-vite": { - "optional": true - }, - "typescript": { - "optional": true - }, - "vite-plugin-glimmerx": { - "optional": true - } - } - }, - "node_modules/@storybook/channels": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-8.0.5.tgz", - "integrity": "sha512-UWzjt4STzBgg28Q6FxqyJWwXLWYM6oSz9gGKMUJbn2vRAlEJaG3XwvpT39YFVDUIuiFSHguV5cisXY5Be4nOZw==", - "dependencies": { - "@storybook/client-logger": "8.0.5", - "@storybook/core-events": "8.0.5", - "@storybook/global": "^5.0.0", - "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/cli": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-8.0.5.tgz", - "integrity": "sha512-6t0d2ILXonC7bsq6Dx6tFTls2a/JeOR7lr3UgoVaiFu5l1M5pOB6uI9JG14F+UmsCifXGJdvxR38CBwVSKtg/Q==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.0", - "@babel/types": "^7.23.0", - "@ndelangen/get-tarball": "^3.0.7", - "@storybook/codemod": "8.0.5", - "@storybook/core-common": "8.0.5", - "@storybook/core-events": "8.0.5", - "@storybook/core-server": "8.0.5", - "@storybook/csf-tools": "8.0.5", - "@storybook/node-logger": "8.0.5", - "@storybook/telemetry": "8.0.5", - "@storybook/types": "8.0.5", - "@types/semver": "^7.3.4", - "@yarnpkg/fslib": "2.10.3", - "@yarnpkg/libzip": "2.3.0", - "chalk": "^4.1.0", - "commander": "^6.2.1", - "cross-spawn": "^7.0.3", - "detect-indent": "^6.1.0", - "envinfo": "^7.7.3", - "execa": "^5.0.0", - "find-up": "^5.0.0", - "fs-extra": "^11.1.0", - "get-npm-tarball-url": "^2.0.3", - "giget": "^1.0.0", - "globby": "^11.0.2", - "jscodeshift": "^0.15.1", - "leven": "^3.1.0", - "ora": "^5.4.1", - "prettier": "^3.1.1", - "prompts": "^2.4.0", - "read-pkg-up": "^7.0.1", - "semver": "^7.3.7", - "strip-json-comments": "^3.0.1", - "tempy": "^1.0.1", - "tiny-invariant": "^1.3.1", - "ts-dedent": "^2.0.0" - }, - "bin": { - "getstorybook": "bin/index.js", - "sb": "bin/index.js" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@storybook/cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@storybook/cli/node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@storybook/cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "node_modules/@storybook/cli/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, + "node_modules/@smithy/util-uri-escape": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.2.0.tgz", + "integrity": "sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==", + "optional": true, "dependencies": { - "yallist": "^4.0.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=10" + "node": ">=14.0.0" } }, - "node_modules/@storybook/cli/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, + "node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=14.0.0" } }, - "node_modules/@storybook/cli/node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" + "node_modules/@smithy/util-waiter": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.7.tgz", + "integrity": "sha512-d5yGlQtmN/z5eoTtIYgkvOw27US2Ous4VycnXatyoImIF9tzlcpnKqQ/V7qhvJmb2p6xZne1NopCLakdTnkBBQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^3.1.6", + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">=16.0.0" } }, - "node_modules/@storybook/cli/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, + "node_modules/@smithy/util-waiter/node_modules/@smithy/abort-controller": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.6.tgz", + "integrity": "sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==", + "license": "Apache-2.0", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@smithy/types": "^3.6.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=10" + "node": ">=16.0.0" } }, - "node_modules/@storybook/cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "node_modules/@smithy/util-waiter/node_modules/@smithy/types": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", + "license": "Apache-2.0", "dependencies": { - "has-flag": "^4.0.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, - "node_modules/@storybook/client-logger": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-8.0.5.tgz", - "integrity": "sha512-6D7zvPPnLuTVlBNpZSdzEbk5xfWKhEG0gejtPnhjG9R5YzC/dFckdUI0gtvwGWUVMWhL3H/0gjRjhKujUMRY1Q==", + "node_modules/@storybook/addon-a11y": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-8.3.6.tgz", + "integrity": "sha512-EeVzUN+WaLtz/DXVBL3rIGvP8+pTuJXA3lEz9CbTQXRO7QMhzTTXLKmp8xmSA2w5H01a8XpjLcZ5LYjdKrvw0g==", + "dev": true, "dependencies": { - "@storybook/global": "^5.0.0" + "@storybook/addon-highlight": "8.3.6", + "axe-core": "^4.2.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.6" } }, - "node_modules/@storybook/codemod": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-8.0.5.tgz", - "integrity": "sha512-1ub3RRT+/ziJUdS2rz5UkQWu6teGULxHDMDRFhTrGYHVOgkc/lLnFuF0rgrLxsFdTmKIBTKN2xFfSE7z9Palsg==", + "node_modules/@storybook/addon-actions": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.3.6.tgz", + "integrity": "sha512-nOqgl0WoZK2KwjaABaXMoIgrIHOQl9inOzJvqQau0HOtsvnXGXYfJXYnpjZenoZDoZXKbUDl0U2haDFx2a2fJw==", "dev": true, "dependencies": { - "@babel/core": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/types": "^7.23.0", - "@storybook/csf": "^0.1.2", - "@storybook/csf-tools": "8.0.5", - "@storybook/node-logger": "8.0.5", - "@storybook/types": "8.0.5", - "@types/cross-spawn": "^6.0.2", - "cross-spawn": "^7.0.3", - "globby": "^11.0.2", - "jscodeshift": "^0.15.1", - "lodash": "^4.17.21", - "prettier": "^3.1.1", - "recast": "^0.23.5", - "tiny-invariant": "^1.3.1" + "@storybook/global": "^5.0.0", + "@types/uuid": "^9.0.1", + "dequal": "^2.0.2", + "polished": "^4.2.2", + "uuid": "^9.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.6" } }, - "node_modules/@storybook/codemod/node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "node_modules/@storybook/addon-backgrounds": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.3.6.tgz", + "integrity": "sha512-yBn+a8i5OJzJaX6Bx5MAkfei7c2nvq+RRmvuyvxw11rtDGR6Nz4OBBe56reWxo868wVUggpRTPJCMVe5tDYgVg==", "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" + "dependencies": { + "@storybook/global": "^5.0.0", + "memoizerific": "^1.11.3", + "ts-dedent": "^2.0.0" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.6" } }, - "node_modules/@storybook/components": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.0.5.tgz", - "integrity": "sha512-trBWV9gc4YhFhMKUevkBY9Mdk9WmYmthpBfmF0Y2vgrJQidUqkkQqfAMQThSJ0KLpV8k3fB27s5d93rgrr50Rg==", + "node_modules/@storybook/addon-controls": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.3.6.tgz", + "integrity": "sha512-9IMLHgtWPuFoRCt3hDsIk1FbkK5SlCMDW1DDwtTBIeWYYZLvptS42+vGVTeQ8v5SejmVzZkzuUdzu3p4sb3IcA==", "dev": true, "dependencies": { - "@radix-ui/react-slot": "^1.0.2", - "@storybook/client-logger": "8.0.5", - "@storybook/csf": "^0.1.2", "@storybook/global": "^5.0.0", - "@storybook/icons": "^1.2.5", - "@storybook/theming": "8.0.5", - "@storybook/types": "8.0.5", - "memoizerific": "^1.11.3", - "util-deprecate": "^1.0.2" + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "ts-dedent": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "storybook": "^8.3.6" } }, - "node_modules/@storybook/core-common": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-8.0.5.tgz", - "integrity": "sha512-WCu2ZPMq1FuO33tYuCPb9joWaZGtJgfKvXXVGLYYg6LufpbWOI+IB7OWmHahtEdKuaNoIr3CEf1p3zm12NNiYA==", + "node_modules/@storybook/addon-docs": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.3.6.tgz", + "integrity": "sha512-31Rk1TOhDIzGM2wNCUIB1xKuWtArW0D2Puua9warEXlQ3FtvwmxnPrwbIzw6ufYZDWPwl9phDYTcRh8WqZIoGg==", "dev": true, "dependencies": { - "@storybook/core-events": "8.0.5", - "@storybook/csf-tools": "8.0.5", - "@storybook/node-logger": "8.0.5", - "@storybook/types": "8.0.5", - "@yarnpkg/fslib": "2.10.3", - "@yarnpkg/libzip": "2.3.0", - "chalk": "^4.1.0", - "cross-spawn": "^7.0.3", - "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0", - "esbuild-register": "^3.5.0", - "execa": "^5.0.0", - "file-system-cache": "2.3.0", - "find-cache-dir": "^3.0.0", - "find-up": "^5.0.0", + "@mdx-js/react": "^3.0.0", + "@storybook/blocks": "8.3.6", + "@storybook/csf-plugin": "8.3.6", + "@storybook/global": "^5.0.0", + "@storybook/react-dom-shim": "8.3.6", + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", "fs-extra": "^11.1.0", - "glob": "^10.0.0", - "handlebars": "^4.7.7", - "lazy-universal-dotenv": "^4.0.0", - "node-fetch": "^2.0.0", - "picomatch": "^2.3.0", - "pkg-dir": "^5.0.0", - "pretty-hrtime": "^1.0.3", - "resolve-from": "^5.0.0", - "semver": "^7.3.7", - "tempy": "^1.0.1", - "tiny-invariant": "^1.3.1", - "ts-dedent": "^2.0.0", - "util": "^0.12.4" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "rehype-external-links": "^3.0.0", + "rehype-slug": "^6.0.0", + "ts-dedent": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.6" } }, - "node_modules/@storybook/core-common/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "node_modules/@storybook/addon-essentials": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.3.6.tgz", + "integrity": "sha512-MQPFvThlGU7wlda1xhBPQCmDh90cSSZ31OsVs1uC5kJh0aLbY2gYXPurq1G54kzrYo8SMfBxsXrCplz8Ir6UTg==", + "dev": true, + "dependencies": { + "@storybook/addon-actions": "8.3.6", + "@storybook/addon-backgrounds": "8.3.6", + "@storybook/addon-controls": "8.3.6", + "@storybook/addon-docs": "8.3.6", + "@storybook/addon-highlight": "8.3.6", + "@storybook/addon-measure": "8.3.6", + "@storybook/addon-outline": "8.3.6", + "@storybook/addon-toolbars": "8.3.6", + "@storybook/addon-viewport": "8.3.6", + "ts-dedent": "^2.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.6" } }, - "node_modules/@storybook/core-common/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@storybook/addon-highlight": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.3.6.tgz", + "integrity": "sha512-A7uU+1OPVXGpkklEUJjSl2VEEDLCSNvmffUJlvW1GjajsNFIHOW2CSD+KnfFlQyPxyVbnWAYLqUP4XJxoqrvDw==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "@storybook/global": "^5.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.6" } }, - "node_modules/@storybook/core-common/node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "node_modules/@storybook/addon-interactions": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.3.6.tgz", + "integrity": "sha512-Y0YUJj0oE1+6DFkaTPXM/8+dwTSoy0ltj2Sn2KOTJYzxKQYXBp8TlUv0QOQiGH7o/GKXIWek/VlTuvG/JEeiWw==", "dev": true, "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" + "@storybook/global": "^5.0.0", + "@storybook/instrumenter": "8.3.6", + "@storybook/test": "8.3.6", + "polished": "^4.2.2", + "ts-dedent": "^2.2.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.6" } }, - "node_modules/@storybook/core-common/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@storybook/addon-links": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.3.6.tgz", + "integrity": "sha512-EGEH/kEjndEldbqyiJ8XSASkxqwzL/lgA/+6mHpa6Ljxhk1s5IMGcdA1ymJYJ2BpNdkUxRj/uxAa38eGcQiJ/g==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "@storybook/csf": "^0.1.11", + "@storybook/global": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.3.6" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } } }, - "node_modules/@storybook/core-common/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@storybook/addon-mdx-gfm": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-mdx-gfm/-/addon-mdx-gfm-8.3.6.tgz", + "integrity": "sha512-5Q/0YT/i9xdLyq7QvXvVfrcGVFHvJ3GEPM+XgGaX9C67ch3pYllAGDKJMtq3eDhgzxHkPT8NnjXb/9VLVYr75w==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "remark-gfm": "^4.0.0", + "ts-dedent": "^2.0.0" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.6" } }, - "node_modules/@storybook/core-common/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "node_modules/@storybook/addon-measure": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.3.6.tgz", + "integrity": "sha512-VHWeGgYjhzhwb2WAqYW/qyEPqg5pwKR/XqFfd+3tEirUs/64olL1l3lzLwZ8Cm07cJ81T8Z4myywb9kObZfQlw==", "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" + "dependencies": { + "@storybook/global": "^5.0.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.6" } }, - "node_modules/@storybook/core-common/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/@storybook/addon-outline": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.3.6.tgz", + "integrity": "sha512-+VXpM8SIHX2cn30qLlMvER9/6iioFRSn2sAfLniqy4RrcQmcMP+qgE7ZzbzExt7cneJh3VFsYqBS/HElu14Vgg==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" + "@storybook/global": "^5.0.0", + "ts-dedent": "^2.0.0" }, - "bin": { - "semver": "bin/semver.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "storybook": "^8.3.6" } }, - "node_modules/@storybook/core-common/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@storybook/addon-toolbars": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.3.6.tgz", + "integrity": "sha512-FJH+lRoZXENfpMR/G09ZqB0TmL/k6bv07GN1ysoVs420tKRgjfz6uXaZz5COrhcdISr5mTNmG+mw9x7xXTfX3Q==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "storybook": "^8.3.6" } }, - "node_modules/@storybook/core-events": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-8.0.5.tgz", - "integrity": "sha512-26c0m7P7qt9zUKcD1noWLPJmZ+iS6MKXNngUgNBSxTtG20NFV3nxD0/tx9FzNfDVZDF6cHINkWj+FVBAaVuBVQ==", + "node_modules/@storybook/addon-viewport": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.3.6.tgz", + "integrity": "sha512-bL51v837W1cng/+0pypkoLsWKWmvux96zLOzqLCpcWAQ4OSMhW3foIWpCiFwMG/KY+GanoOocTx6i7j5hLtuTA==", + "dev": true, "dependencies": { - "ts-dedent": "^2.0.0" + "memoizerific": "^1.11.3" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.6" } }, - "node_modules/@storybook/core-server": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-8.0.5.tgz", - "integrity": "sha512-aQGHRQZF4jbMqBT0sGptql+S3hiNksi4n6pPJPxGf6TE8TyRA1x7USjmvXHwv59vpmMm9HaRpGWzWCo4SqwNqw==", + "node_modules/@storybook/blocks": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.3.6.tgz", + "integrity": "sha512-Oc5jU6EzfsENjrd91KcKyEKBh60RT+8uyLi1RIrymC2C/mzZMTEoNIrbnQt0eIqbjlHxn6y9JMJxHu4NJ4EmZg==", "dev": true, "dependencies": { - "@aw-web-design/x-default-browser": "1.4.126", - "@babel/core": "^7.23.9", - "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-manager": "8.0.5", - "@storybook/channels": "8.0.5", - "@storybook/core-common": "8.0.5", - "@storybook/core-events": "8.0.5", - "@storybook/csf": "^0.1.2", - "@storybook/csf-tools": "8.0.5", - "@storybook/docs-mdx": "3.0.0", + "@storybook/csf": "^0.1.11", "@storybook/global": "^5.0.0", - "@storybook/manager": "8.0.5", - "@storybook/manager-api": "8.0.5", - "@storybook/node-logger": "8.0.5", - "@storybook/preview-api": "8.0.5", - "@storybook/telemetry": "8.0.5", - "@storybook/types": "8.0.5", - "@types/detect-port": "^1.3.0", - "@types/node": "^18.0.0", - "@types/pretty-hrtime": "^1.0.0", - "@types/semver": "^7.3.4", - "better-opn": "^3.0.2", - "chalk": "^4.1.0", - "cli-table3": "^0.6.1", - "compression": "^1.7.4", - "detect-port": "^1.3.0", - "express": "^4.17.3", - "fs-extra": "^11.1.0", - "globby": "^11.0.2", - "ip": "^2.0.1", + "@storybook/icons": "^1.2.10", + "@types/lodash": "^4.14.167", + "color-convert": "^2.0.1", + "dequal": "^2.0.2", "lodash": "^4.17.21", - "open": "^8.4.0", - "pretty-hrtime": "^1.0.3", - "prompts": "^2.4.0", - "read-pkg-up": "^7.0.1", - "semver": "^7.3.7", + "markdown-to-jsx": "^7.4.5", + "memoizerific": "^1.11.3", + "polished": "^4.2.2", + "react-colorful": "^5.1.2", "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1", "ts-dedent": "^2.0.0", - "util": "^0.12.4", - "util-deprecate": "^1.0.2", - "watchpack": "^2.2.0", - "ws": "^8.2.3" + "util-deprecate": "^1.0.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-server/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.3.6" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } } }, - "node_modules/@storybook/core-server/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@storybook/builder-vite": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.3.6.tgz", + "integrity": "sha512-AF4+oFe1mvIHrLvaYsv8B0YSlXQtSlKTKwrXnUbcAbeGRwMmFKA1t3VyAcXV0yB9MtZ8YJsA/uKRkgGEaN7wJQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "@storybook/csf-plugin": "8.3.6", + "@types/find-cache-dir": "^3.2.1", + "browser-assert": "^1.2.1", + "es-module-lexer": "^1.5.0", + "express": "^4.19.2", + "find-cache-dir": "^3.0.0", + "fs-extra": "^11.1.0", + "magic-string": "^0.30.0", + "ts-dedent": "^2.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@preact/preset-vite": "*", + "storybook": "^8.3.6", + "typescript": ">= 4.3.x", + "vite": "^4.0.0 || ^5.0.0", + "vite-plugin-glimmerx": "*" + }, + "peerDependenciesMeta": { + "@preact/preset-vite": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vite-plugin-glimmerx": { + "optional": true + } } }, - "node_modules/@storybook/core-server/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@storybook/components": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.3.6.tgz", + "integrity": "sha512-TXuoGZY7X3iixF45lXkYOFk8k2q9OHcqHyHyem1gATLLQXgyOvDgzm+VB7uKBNzssRQPEE+La70nfG8bq/viRw==", "dev": true, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.6" } }, - "node_modules/@storybook/core-server/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, + "node_modules/@storybook/core": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.3.6.tgz", + "integrity": "sha512-frwfgf0EJ7QL29DWZ5bla/g0eOOWqJGd14t+VUBlpP920zB6sdDfo7+p9JoCjD9u08lGeFDqbPNKayUk+0qDag==", "dependencies": { - "yallist": "^4.0.0" + "@storybook/csf": "^0.1.11", + "@types/express": "^4.17.21", + "better-opn": "^3.0.2", + "browser-assert": "^1.2.1", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0", + "esbuild-register": "^3.5.0", + "express": "^4.19.2", + "jsdoc-type-pratt-parser": "^4.0.0", + "process": "^0.11.10", + "recast": "^0.23.5", + "semver": "^7.6.2", + "util": "^0.12.5", + "ws": "^8.2.3" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/core-server/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/@storybook/core-server": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-8.3.6.tgz", + "integrity": "sha512-jDaeIQQ7hiltfR/krqhkTu2XUMRDHbWATOV2tkf92yRKfESqMhs4ZxwkFZbP4DQda+zBPK6sXYeI1lenWpUlgA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, + "peerDependencies": { + "storybook": "^8.3.6" + } + }, + "node_modules/@storybook/core/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -15823,84 +16870,28 @@ "node": ">=10" } }, - "node_modules/@storybook/core-server/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@storybook/csf": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.3.tgz", - "integrity": "sha512-IPZvXXo4b3G+gpmgBSBqVM81jbp2ePOKsvhgJdhyZJtkYQCII7rg9KKLQhvBQM5sLaF1eU6r0iuwmyynC9d9SA==", + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.11.tgz", + "integrity": "sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==", "dependencies": { "type-fest": "^2.19.0" } }, "node_modules/@storybook/csf-plugin": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.0.5.tgz", - "integrity": "sha512-R6VjQl+I9k4oc3OfOHOFzz5T20WROHOZ5/zkkFKM/1YUa6QNpMcuStOtr/qcAx+QizmQqmxgJwTFapFBP5yWjg==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.3.6.tgz", + "integrity": "sha512-TJyJPFejO6Gyr3+bXqE/+LomQbivvfHEbee/GwtlRj0XF4KQlqnvuEdEdcK25JbD0NXT8AbyncEUmjoxE7ojQw==", "dev": true, "dependencies": { - "@storybook/csf-tools": "8.0.5", "unplugin": "^1.3.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/csf-tools": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-8.0.5.tgz", - "integrity": "sha512-fW2hAO57ayq7eHjpS5jXy/AKm3oZxApngd9QU/bC800EyTWENwLPxFnHLAE86N57Dc3bcE4PTFCyqpxzE4Uc7g==", - "dev": true, - "dependencies": { - "@babel/generator": "^7.23.0", - "@babel/parser": "^7.23.0", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", - "@storybook/csf": "^0.1.2", - "@storybook/types": "8.0.5", - "fs-extra": "^11.1.0", - "recast": "^0.23.5", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/docs-mdx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-3.0.0.tgz", - "integrity": "sha512-NmiGXl2HU33zpwTv1XORe9XG9H+dRUC1Jl11u92L4xr062pZtrShLmD4VKIsOQujxhhOrbxpwhNOt+6TdhyIdQ==", - "dev": true - }, - "node_modules/@storybook/docs-tools": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-8.0.5.tgz", - "integrity": "sha512-IzQMlsumiBgHAh5TTZTinNcedU98l0S0hczbTgjXQWgTp3//RHO36LYowAeFrB6V9SACYs/Q47iB15K4b2dqUg==", - "dev": true, - "dependencies": { - "@storybook/core-common": "8.0.5", - "@storybook/preview-api": "8.0.5", - "@storybook/types": "8.0.5", - "@types/doctrine": "^0.0.3", - "assert": "^2.1.0", - "doctrine": "^3.0.0", - "lodash": "^4.17.21" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "peerDependencies": { + "storybook": "^8.3.6" } }, "node_modules/@storybook/global": { @@ -15909,9 +16900,9 @@ "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==" }, "node_modules/@storybook/icons": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.2.9.tgz", - "integrity": "sha512-cOmylsz25SYXaJL/gvTk/dl3pyk7yBFRfeXTsHvTA3dfhoU/LWSq0NKL9nM7WBasJyn6XPSGnLS4RtKXLw5EUg==", + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.2.12.tgz", + "integrity": "sha512-UxgyK5W3/UV4VrI3dl6ajGfHM4aOqMAkFLWe2KibeQudLf6NJpDrDMSHwZj+3iKC4jFU7dkKbbtH2h/al4sW3Q==", "dev": true, "engines": { "node": ">=14.0.0" @@ -15922,126 +16913,55 @@ } }, "node_modules/@storybook/instrumenter": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.0.5.tgz", - "integrity": "sha512-ccGFGSquIPZBcf3dP+I5kwSblAOlQNH7+4vunYJtUrlXN+VROS9LAf87W/btwxQVI1Zj17BUH9CoBrDxWbJ2VA==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.3.6.tgz", + "integrity": "sha512-0RowbKwoB/s7rtymlnKNiyWN1Z3ZK5mwgzVjlRmzxDL8hrdi5KDjTNExuJTRR3ZaBP2RR0/I3m/n0p9JhHAZvg==", "dependencies": { - "@storybook/channels": "8.0.5", - "@storybook/client-logger": "8.0.5", - "@storybook/core-events": "8.0.5", "@storybook/global": "^5.0.0", - "@storybook/preview-api": "8.0.5", - "@vitest/utils": "^1.3.1", + "@vitest/utils": "^2.0.5", "util": "^0.12.4" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/manager": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-8.0.5.tgz", - "integrity": "sha512-eJtf2SaAzOmRV03zn/pFRTqBua8/qy+VDtgaaCFmAyrjsUHO/bcHpbu9vnwP8a+C8ojJnthooi3yz755UTDYYg==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/manager-api": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.0.5.tgz", - "integrity": "sha512-2Q+DI9XU1U4EBrihnyfo+kuRK7T3Ce2eSlWEHHkTZ3OYSf+EhFxLUA6AOfMoA1B0nzNEr6SUkW8DBvMrtdTQMA==", - "dev": true, - "dependencies": { - "@storybook/channels": "8.0.5", - "@storybook/client-logger": "8.0.5", - "@storybook/core-events": "8.0.5", - "@storybook/csf": "^0.1.2", - "@storybook/global": "^5.0.0", - "@storybook/icons": "^1.2.5", - "@storybook/router": "8.0.5", - "@storybook/theming": "8.0.5", - "@storybook/types": "8.0.5", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "store2": "^2.14.2", - "telejson": "^7.2.0", - "ts-dedent": "^2.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/node-logger": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-8.0.5.tgz", - "integrity": "sha512-ssT8YCcCqgc89ee+EeExCxcOpueOsU05iek2roR+NCZnoCL1DmzcUp8H9t0utLaK/ngPV8zatlzSDVgKTHSIJw==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "peerDependencies": { + "storybook": "^8.3.6" } }, - "node_modules/@storybook/preview": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-8.0.5.tgz", - "integrity": "sha512-D2uY0LTjkGbpNwJJeqtv1NieBTtvt0IEEKH+srMNXOOM+KascTYGbBlEPkYSf5bZdMft5c1GXglVIhJIqTZntg==", + "node_modules/@storybook/manager-api": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.3.6.tgz", + "integrity": "sha512-Xt5VFZcL+G/9uzaHjzWFhxRNrP+4rPhSRKEvCZorAbC9+Hv+ZDs1JSZS5wMb4WKpXBZ0rwDVOLwngqbVtfRHuQ==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/preview-api": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.0.5.tgz", - "integrity": "sha512-BSDVTR9/X6DHVA4rIhN6d/SB6PiaRdns8ky/TKTzwFEyO3NOASHe8051O+uNtXzgCtMUj/8imNrTdMTYgUm1LA==", - "dependencies": { - "@storybook/channels": "8.0.5", - "@storybook/client-logger": "8.0.5", - "@storybook/core-events": "8.0.5", - "@storybook/csf": "^0.1.2", - "@storybook/global": "^5.0.0", - "@storybook/types": "8.0.5", - "@types/qs": "^6.9.5", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "tiny-invariant": "^1.3.1", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "peerDependencies": { + "storybook": "^8.3.6" } }, "node_modules/@storybook/react": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.0.5.tgz", - "integrity": "sha512-Vwq4xt8eSKE/PLPvunOFDlzBki6L3mP7LNVWCLkQba7vzuCOPjSZ0+95v/K8XQn3jVRXAMUnlPW1SKg21aKJdw==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.3.6.tgz", + "integrity": "sha512-s3COryqIOYK7urgZaCPb77zlxGjPKr6dIsYmblQJcsFY2ZlG2x0Ysm8b5oRgD8Pv71hCJ0PKYA4RzDgBVYJS9A==", "dev": true, "dependencies": { - "@storybook/client-logger": "8.0.5", - "@storybook/docs-tools": "8.0.5", + "@storybook/components": "^8.3.6", "@storybook/global": "^5.0.0", - "@storybook/preview-api": "8.0.5", - "@storybook/react-dom-shim": "8.0.5", - "@storybook/types": "8.0.5", + "@storybook/manager-api": "^8.3.6", + "@storybook/preview-api": "^8.3.6", + "@storybook/react-dom-shim": "8.3.6", + "@storybook/theming": "^8.3.6", "@types/escodegen": "^0.0.6", "@types/estree": "^0.0.51", - "@types/node": "^18.0.0", + "@types/node": "^22.0.0", "acorn": "^7.4.1", "acorn-jsx": "^5.3.1", "acorn-walk": "^7.2.0", "escodegen": "^2.1.0", "html-tags": "^3.1.0", - "lodash": "^4.17.21", "prop-types": "^15.7.2", "react-element-to-jsx-string": "^15.0.0", "semver": "^7.3.7", @@ -16057,41 +16977,46 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "@storybook/test": "8.3.6", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.3.6", "typescript": ">= 4.2.x" }, "peerDependenciesMeta": { + "@storybook/test": { + "optional": true + }, "typescript": { "optional": true } } }, "node_modules/@storybook/react-dom-shim": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.0.5.tgz", - "integrity": "sha512-KIcLkCml5dIiVeChMyudz8Q/pZ/T86Y1LrHZvYD/t3iXH+HOOvg6KNsY6TZFM93Rqhk10AIEUNCgYzj2/QjddA==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.3.6.tgz", + "integrity": "sha512-9BO6VXIdli4GHSfiP/Z0gwAf7oQig3D/yWK2U1+91UWDV8nIAgnNBAi76U4ORC6MiK5MdkDfIikIxnLLeLnahA==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.3.6" } }, "node_modules/@storybook/react-vite": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-8.0.5.tgz", - "integrity": "sha512-VXxoyb3Zw5ReQwWoP64qMIy/iIS6B9PuLIEPDt7wM/5IMFljQozvNaarPQf0mNJxPkGT6zmiBn9WS06wPLPF0w==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-8.3.6.tgz", + "integrity": "sha512-KXi4ZT4X7DsB4OOIWeR1XMH/Oz6Rp4TlWBNx/TgSEDGYEkPooqZK/O0S+G+VIsrRGQUf/57YqO73mP6kNluxTA==", "dev": true, "dependencies": { "@joshwooding/vite-plugin-react-docgen-typescript": "0.3.0", "@rollup/pluginutils": "^5.0.2", - "@storybook/builder-vite": "8.0.5", - "@storybook/node-logger": "8.0.5", - "@storybook/react": "8.0.5", + "@storybook/builder-vite": "8.3.6", + "@storybook/react": "8.3.6", "find-up": "^5.0.0", "magic-string": "^0.30.0", "react-docgen": "^7.0.0", @@ -16106,17 +17031,40 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.3.6", "vite": "^4.0.0 || ^5.0.0" } }, + "node_modules/@storybook/react/node_modules/@storybook/preview-api": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.3.6.tgz", + "integrity": "sha512-/Wxvb7wbI2O2iH63arRQQyyojA630vibdshkFjuC/u1nYdptEV1jkxa0OYmbZbKCn4/ze6uH4hfsKOpDPV9SWg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.6" + } + }, "node_modules/@storybook/react/node_modules/@types/estree": { "version": "0.0.51", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "dev": true }, + "node_modules/@storybook/react/node_modules/@types/node": { + "version": "22.7.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.9.tgz", + "integrity": "sha512-jrTfRC7FM6nChvU7X2KqcrgquofrWLFDeYC1hKfwNWomVvrn7JIksqf344WN2X/y8xrgqBd2dJATZV4GbatBfg==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, "node_modules/@storybook/react/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -16144,175 +17092,70 @@ "node": ">=10" } }, - "node_modules/@storybook/router": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-8.0.5.tgz", - "integrity": "sha512-1d4CqNJB5sA25HCd7jZ4eVqMsdlD4r4SuFA/eR6fas0lk7yjVCpG1zWfvSSk5tKoVcNLSptc/TYBiSr2rcGRvw==", - "dev": true, - "dependencies": { - "@storybook/client-logger": "8.0.5", - "memoizerific": "^1.11.3", - "qs": "^6.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/telemetry": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-8.0.5.tgz", - "integrity": "sha512-KTt6wP78dn9hfsc0sR2CcFT/DWJgYqYuFBhc3NDgtT41ATLGgGniCQW9PtKLQc+FMofKejz1S+XXk0W322Pjxg==", - "dev": true, - "dependencies": { - "@storybook/client-logger": "8.0.5", - "@storybook/core-common": "8.0.5", - "@storybook/csf-tools": "8.0.5", - "chalk": "^4.1.0", - "detect-package-manager": "^2.0.1", - "fetch-retry": "^5.0.2", - "fs-extra": "^11.1.0", - "read-pkg-up": "^7.0.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/telemetry/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@storybook/telemetry/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@storybook/telemetry/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/telemetry/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/@storybook/react/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true }, "node_modules/@storybook/test": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.0.5.tgz", - "integrity": "sha512-XpiRLsmZlkjoAGf3d7zcInByR25evYIzm3W4ST8+EPoI4Tcd/U+dGUQ9A6aNUuC6fJQ8Jh0M+EqNAZtcDT8lrA==", - "dependencies": { - "@storybook/client-logger": "8.0.5", - "@storybook/core-events": "8.0.5", - "@storybook/instrumenter": "8.0.5", - "@storybook/preview-api": "8.0.5", - "@testing-library/dom": "^9.3.4", - "@testing-library/jest-dom": "^6.4.2", - "@testing-library/user-event": "^14.5.2", - "@vitest/expect": "1.3.1", - "@vitest/spy": "^1.3.1", - "chai": "^4.4.1", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.3.6.tgz", + "integrity": "sha512-WIc8LzK9jaEw+e3OiweEM2j3cppPzsWod59swuf6gDBf176EQLIyjtVc+Kh3qO4NNkcL+lwmqaLPjOxlBLaDbg==", + "dependencies": { + "@storybook/csf": "^0.1.11", + "@storybook/global": "^5.0.0", + "@storybook/instrumenter": "8.3.6", + "@testing-library/dom": "10.4.0", + "@testing-library/jest-dom": "6.5.0", + "@testing-library/user-event": "14.5.2", + "@vitest/expect": "2.0.5", + "@vitest/spy": "2.0.5", "util": "^0.12.4" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.6" } }, "node_modules/@storybook/test/node_modules/@testing-library/dom": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", - "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", + "aria-query": "5.3.0", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "pretty-format": "^27.0.2" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@storybook/test/node_modules/@testing-library/jest-dom": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.2.tgz", - "integrity": "sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz", + "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==", "dependencies": { - "@adobe/css-tools": "^4.3.2", - "@babel/runtime": "^7.9.2", + "@adobe/css-tools": "^4.4.0", "aria-query": "^5.0.0", "chalk": "^3.0.0", "css.escape": "^1.5.1", "dom-accessibility-api": "^0.6.3", - "lodash": "^4.17.15", + "lodash": "^4.17.21", "redent": "^3.0.0" }, "engines": { "node": ">=14", "npm": ">=6", "yarn": ">=1" - }, - "peerDependencies": { - "@jest/globals": ">= 28", - "@types/bun": "latest", - "@types/jest": ">= 28", - "jest": ">= 28", - "vitest": ">= 0.32" - }, - "peerDependenciesMeta": { - "@jest/globals": { - "optional": true - }, - "@types/bun": { - "optional": true - }, - "@types/jest": { - "optional": true - }, - "jest": { - "optional": true - }, - "vitest": { - "optional": true - } } }, "node_modules/@storybook/test/node_modules/@testing-library/jest-dom/node_modules/chalk": { @@ -16332,6 +17175,17 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==" }, + "node_modules/@storybook/test/node_modules/@vitest/spy": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", + "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", + "dependencies": { + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/@storybook/test/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -16346,6 +17200,14 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/@storybook/test/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dependencies": { + "dequal": "^2.0.3" + } + }, "node_modules/@storybook/test/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -16381,45 +17243,16 @@ } }, "node_modules/@storybook/theming": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.0.5.tgz", - "integrity": "sha512-Hy4hJaKg6UUyivkUM77nCHccv4/lO++ZG9F88qBFVPdBlCwMHHnUrR7Hgje5cCVAy0jK6LyYlD3cWO6nS9OR8w==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.3.6.tgz", + "integrity": "sha512-LQjUk6GXRW9ELkoBKuqzQKFUW+ajfGPfVELcfs3/VQX61VhthJ4olov4bGPc04wsmmFMgN/qODxT485IwOHfPQ==", "dev": true, - "dependencies": { - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@storybook/client-logger": "8.0.5", - "@storybook/global": "^5.0.0", - "memoizerific": "^1.11.3" - }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@storybook/types": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-8.0.5.tgz", - "integrity": "sha512-lYXwYF9qooQhYJkg3HWr6PD/vnQK+iO8fSKS8jtntwgJUKJvTbGZKAhNnS8WzNEI9jIp5QXFsSA367NjIDPaeQ==", - "dependencies": { - "@storybook/channels": "8.0.5", - "@types/express": "^4.7.0", - "file-system-cache": "2.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "storybook": "^8.3.6" } }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { @@ -16890,12 +17723,13 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.11.tgz", - "integrity": "sha512-C1j1Qp/IHSelVWdEnT7f0iONWxQz6FAqzjCF2iaL+0vFg4V5f2nlgrueY8vj5pNNzSGhrAlxsMxEIp4dj1MXkg==", + "version": "1.7.39", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.39.tgz", + "integrity": "sha512-o2nbEL6scMBMCTvY9OnbyVXtepLuNbdblV9oNJEFia5v5eGj9WMrnRQiylH3Wp/G2NYkW7V1/ZVW+kfvIeYe9A==", "cpu": [ "arm64" ], + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "darwin" @@ -16905,12 +17739,13 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.11.tgz", - "integrity": "sha512-0TTy3Ni8ncgaMCchSQ7FK8ZXQLlamy0FXmGWbR58c+pVZWYZltYPTmheJUvVcR0H2+gPAymRKyfC0iLszDALjg==", + "version": "1.7.39", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.39.tgz", + "integrity": "sha512-qMlv3XPgtPi/Fe11VhiPDHSLiYYk2dFYl747oGsHZPq+6tIdDQjIhijXPcsUHIXYDyG7lNpODPL8cP/X1sc9MA==", "cpu": [ "x64" ], + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "darwin" @@ -16927,6 +17762,7 @@ "arm" ], "dev": true, + "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -16943,6 +17779,7 @@ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -16959,6 +17796,7 @@ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -17007,6 +17845,7 @@ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -17023,6 +17862,7 @@ "ia32" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -17039,6 +17879,7 @@ "x64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -17055,6 +17896,7 @@ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "darwin" @@ -17071,6 +17913,7 @@ "x64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "darwin" @@ -17308,7 +18151,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "devOptional": true, + "dev": true, "engines": { "node": ">= 10" } @@ -17350,6 +18193,15 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", @@ -17376,7 +18228,7 @@ "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -17389,7 +18241,7 @@ "version": "7.6.8", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/types": "^7.0.0" } @@ -17398,7 +18250,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -17408,7 +18260,7 @@ "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/types": "^7.20.7" } @@ -17548,15 +18400,6 @@ "moment": ">=2.14.0" } }, - "node_modules/@types/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/d3-scale": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", @@ -17586,29 +18429,14 @@ "@types/ms": "*" } }, - "node_modules/@types/detect-port": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/detect-port/-/detect-port-1.3.5.tgz", - "integrity": "sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==", - "dev": true - }, - "node_modules/@types/doctrine": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz", - "integrity": "sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==", - "dev": true - }, - "node_modules/@types/ejs": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.5.tgz", - "integrity": "sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==", - "dev": true - }, - "node_modules/@types/emscripten": { - "version": "1.39.10", - "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.10.tgz", - "integrity": "sha512-TB/6hBkYQJxsZHSqyeuO1Jt0AB/bW6G7rHt9g7lML7SOF6lbgcHvw/Lr+69iqN0qxgXLhWKScAon73JNnptuDw==", - "dev": true + "node_modules/@types/duplexify": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/@types/duplexify/-/duplexify-3.6.4.tgz", + "integrity": "sha512-2eahVPsd+dy3CL6FugAzJcxoraWhUghZGEQJns1kTKfCXWKJ5iG/VkaB05wRVrDKHfOFKqb0X0kXh91eE99RZg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/escodegen": { "version": "0.0.6", @@ -17713,7 +18541,7 @@ "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "devOptional": true, + "dev": true, "dependencies": { "@types/node": "*" } @@ -17758,9 +18586,9 @@ "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" }, "node_modules/@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "dependencies": { "@types/node": "*" } @@ -17799,7 +18627,7 @@ "version": "29.5.12", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", - "devOptional": true, + "dev": true, "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -17809,7 +18637,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=10" }, @@ -17821,7 +18649,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -17835,7 +18663,7 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "devOptional": true + "dev": true }, "node_modules/@types/js-yaml": { "version": "4.0.9", @@ -18002,12 +18830,6 @@ "integrity": "sha512-M9HRtJSB64wfV9ZFOBHBKT67cV+rCjo3Rbc9A4Fv/CxHcjcXnVMEh2vUpRcqzO6Tx0TEbDq8Xzt6009SkG5Z+w==", "dev": true }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, "node_modules/@types/oauth2orize": { "version": "1.8.10", "resolved": "https://registry.npmjs.org/@types/oauth2orize/-/oauth2orize-1.8.10.tgz", @@ -18090,12 +18912,6 @@ "@types/passport": "*" } }, - "node_modules/@types/pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==", - "dev": true - }, "node_modules/@types/prismjs": { "version": "1.26.3", "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.3.tgz", @@ -18341,7 +19157,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "devOptional": true + "dev": true }, "node_modules/@types/superagent": { "version": "8.1.6", @@ -18397,12 +19213,14 @@ "node_modules/@types/webidl-conversions": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", - "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", + "license": "MIT" }, "node_modules/@types/whatwg-url": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "license": "MIT", "dependencies": { "@types/node": "*", "@types/webidl-conversions": "*" @@ -18436,33 +19254,32 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.11.0.tgz", + "integrity": "sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/type-utils": "8.11.0", + "@typescript-eslint/utils": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", "graphemer": "^1.4.0", - "ignore": "^5.2.4", + "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -18470,54 +19287,28 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.11.0.tgz", + "integrity": "sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/typescript-estree": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", "debug": "^4.3.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -18526,16 +19317,17 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.11.0.tgz", + "integrity": "sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -18543,26 +19335,23 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.11.0.tgz", + "integrity": "sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/typescript-estree": "8.11.0", + "@typescript-eslint/utils": "8.11.0", "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -18570,12 +19359,13 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.11.0.tgz", + "integrity": "sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==", "dev": true, + "license": "MIT", "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -18583,22 +19373,23 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.11.0.tgz", + "integrity": "sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -18610,26 +19401,45 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": ">=10" + "node": ">=8.6.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -18638,68 +19448,39 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.11.0.tgz", + "integrity": "sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/typescript-estree": "8.11.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "eslint": "^8.57.0 || ^9.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.11.0.tgz", + "integrity": "sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "8.11.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -18731,220 +19512,149 @@ } }, "node_modules/@vitest/expect": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.3.1.tgz", - "integrity": "sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", + "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", "dependencies": { - "@vitest/spy": "1.3.1", - "@vitest/utils": "1.3.1", - "chai": "^4.3.10" + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/expect/node_modules/@vitest/spy": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.3.1.tgz", - "integrity": "sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==", + "node_modules/@vitest/expect/node_modules/@vitest/pretty-format": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", + "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", "dependencies": { - "tinyspy": "^2.2.0" + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/expect/node_modules/@vitest/utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.3.1.tgz", - "integrity": "sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==", + "node_modules/@vitest/expect/node_modules/@vitest/spy": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", + "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" + "tinyspy": "^3.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/expect/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@vitest/expect/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@vitest/expect/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/@vitest/runner": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.4.0.tgz", - "integrity": "sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==", - "devOptional": true, - "peer": true, + "node_modules/@vitest/expect/node_modules/@vitest/utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", + "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", "dependencies": { - "@vitest/utils": "1.4.0", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" + "@vitest/pretty-format": "2.0.5", + "estree-walker": "^3.0.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "devOptional": true, + "node_modules/@vitest/mocker": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.3.tgz", + "integrity": "sha512-eSpdY/eJDuOvuTA3ASzCjdithHa+GIF1L4PqtEELl6Qa3XafdMLBpBlZCIUCX2J+Q6sNmjmxtosAG62fK4BlqQ==", + "dev": true, "peer": true, "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" + "@vitest/spy": "2.1.3", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.11" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "devOptional": true, - "peer": true, - "engines": { - "node": ">=12.20" + "url": "https://opencollective.com/vitest" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@vitest/spy": "2.1.3", + "msw": "^2.3.5", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/@vitest/snapshot": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.4.0.tgz", - "integrity": "sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==", - "devOptional": true, - "peer": true, + "node_modules/@vitest/pretty-format": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.3.tgz", + "integrity": "sha512-XH1XdtoLZCpqV59KRbPrIhFCOO0hErxrQCMcvnQete3Vibb9UeIOX02uFPfVn3Z9ZXsq78etlfyhnkmIZSzIwQ==", "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/snapshot/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "devOptional": true, + "node_modules/@vitest/runner": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.3.tgz", + "integrity": "sha512-JGzpWqmFJ4fq5ZKHtVO3Xuy1iF2rHGV4d/pdzgkYHm1+gOzNZtqjvyiaDGJytRyMU54qkxpNzCx+PErzJ1/JqQ==", + "dev": true, "peer": true, - "engines": { - "node": ">=10" + "dependencies": { + "@vitest/utils": "2.1.3", + "pathe": "^1.1.2" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/snapshot/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "devOptional": true, + "node_modules/@vitest/snapshot": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.3.tgz", + "integrity": "sha512-qWC2mWc7VAXmjAkEKxrScWHWFyCQx/cmiZtuGqMi+WwqQJ2iURsVY4ZfAK6dVo6K2smKRU6l3BPwqEBvhnpQGg==", + "dev": true, "peer": true, "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "@vitest/pretty-format": "2.1.3", + "magic-string": "^0.30.11", + "pathe": "^1.1.2" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/snapshot/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "devOptional": true, - "peer": true - }, "node_modules/@vitest/spy": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.4.0.tgz", - "integrity": "sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.3.tgz", + "integrity": "sha512-Nb2UzbcUswzeSP7JksMDaqsI43Sj5+Kry6ry6jQJT4b5gAK+NS9NED6mDb8FlMRCX8m5guaHCDZmqYMMWRy5nQ==", + "dev": true, + "peer": true, "dependencies": { - "tinyspy": "^2.2.0" + "tinyspy": "^3.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.4.0.tgz", - "integrity": "sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.3.tgz", + "integrity": "sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==", "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" + "@vitest/pretty-format": "2.1.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/utils/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@vitest/utils/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@vitest/utils/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, "node_modules/@webassemblyjs/ast": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", @@ -19170,59 +19880,6 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, - "node_modules/@yarnpkg/esbuild-plugin-pnp": { - "version": "3.0.0-rc.15", - "resolved": "https://registry.npmjs.org/@yarnpkg/esbuild-plugin-pnp/-/esbuild-plugin-pnp-3.0.0-rc.15.tgz", - "integrity": "sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==", - "dev": true, - "dependencies": { - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "esbuild": ">=0.10.0" - } - }, - "node_modules/@yarnpkg/fslib": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@yarnpkg/fslib/-/fslib-2.10.3.tgz", - "integrity": "sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==", - "dev": true, - "dependencies": { - "@yarnpkg/libzip": "^2.3.0", - "tslib": "^1.13.0" - }, - "engines": { - "node": ">=12 <14 || 14.2 - 14.9 || >14.10.0" - } - }, - "node_modules/@yarnpkg/fslib/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@yarnpkg/libzip": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/libzip/-/libzip-2.3.0.tgz", - "integrity": "sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==", - "dev": true, - "dependencies": { - "@types/emscripten": "^1.39.6", - "tslib": "^1.13.0" - }, - "engines": { - "node": ">=12 <14 || 14.2 - 14.9 || >14.10.0" - } - }, - "node_modules/@yarnpkg/libzip/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", @@ -19271,9 +19928,9 @@ "dev": true }, "node_modules/@zkochan/js-yaml": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", - "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", + "integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==", "dev": true, "dependencies": { "argparse": "^2.0.1" @@ -19287,7 +19944,7 @@ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "deprecated": "Use your platform's native atob() and btoa() methods instead", - "devOptional": true + "dev": true }, "node_modules/abbrev": { "version": "1.1.1", @@ -19382,6 +20039,15 @@ "node": ">= 10.0.0" } }, + "node_modules/adm-zip": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "dev": true, + "engines": { + "node": ">=12.0" + } + }, "node_modules/agent-base": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", @@ -19572,7 +20238,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "devOptional": true, + "dev": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -19587,7 +20253,7 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "devOptional": true, + "dev": true, "engines": { "node": ">=10" }, @@ -19650,12 +20316,6 @@ "node": ">= 8" } }, - "node_modules/app-root-dir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", - "integrity": "sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==", - "dev": true - }, "node_modules/app-root-path": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", @@ -19784,18 +20444,6 @@ "node": ">=6.0.0" } }, - "node_modules/aria-hidden": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", - "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", - "dev": true, - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/aria-query": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", @@ -19970,32 +20618,18 @@ "node": ">=12.0.0" } }, - "node_modules/assert": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", - "dev": true, - "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" - } - }, "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "engines": { - "node": "*" + "node": ">=12" } }, "node_modules/ast-types": { "version": "0.16.1", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", - "dev": true, "dependencies": { "tslib": "^2.0.1" }, @@ -20153,20 +20787,11 @@ "dequal": "^2.0.3" } }, - "node_modules/babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "dev": true, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -20187,7 +20812,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -20202,7 +20827,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -20218,7 +20843,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -20227,7 +20852,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -20280,7 +20905,7 @@ "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -20296,7 +20921,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -20312,7 +20937,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -20405,7 +21030,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -20466,7 +21091,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "devOptional": true, + "dev": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -20550,7 +21175,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", - "dev": true, "dependencies": { "open": "^8.0.4" }, @@ -20948,18 +21572,6 @@ "node": ">=8" } }, - "node_modules/bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "dev": true, - "dependencies": { - "big-integer": "^1.6.44" - }, - "engines": { - "node": ">= 5.10.0" - } - }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -20969,11 +21581,11 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -20982,23 +21594,7 @@ "node_modules/browser-assert": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz", - "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", - "dev": true - }, - "node_modules/browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", - "dev": true, - "dependencies": { - "pako": "~0.2.0" - } - }, - "node_modules/browserify-zlib/node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", - "dev": true + "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==" }, "node_modules/browserslist": { "version": "4.23.3", @@ -21126,7 +21722,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "devOptional": true, + "dev": true, "dependencies": { "node-int64": "^0.4.0" } @@ -21135,6 +21731,7 @@ "version": "4.7.2", "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==", + "license": "Apache-2.0", "dependencies": { "buffer": "^5.6.0" }, @@ -21142,6 +21739,18 @@ "node": ">=6.9.0" } }, + "node_modules/btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "dev": true, + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/buffer": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", @@ -21321,12 +21930,25 @@ "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "devOptional": true, + "dev": true, "peer": true, "engines": { "node": ">=8" } }, + "node_modules/cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "dev": true, + "dependencies": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", @@ -21488,20 +22110,18 @@ } }, "node_modules/chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=12" } }, "node_modules/chainsaw": { @@ -21625,14 +22245,11 @@ "dev": true }, "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dependencies": { - "get-func-name": "^2.0.2" - }, + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "engines": { - "node": "*" + "node": ">= 16" } }, "node_modules/cheerio": { @@ -21702,6 +22319,29 @@ "node": ">=10" } }, + "node_modules/chromatic": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-11.14.0.tgz", + "integrity": "sha512-qt7xXpdrwssBtXWv30aW46HAK10bF4Ep7SMjtMQhD61Fg4IS9aImT0WFeig7utpXYHOx0eSysjwhz0cgYz9SDg==", + "dev": true, + "bin": { + "chroma": "dist/bin.js", + "chromatic": "dist/bin.js", + "chromatic-cli": "dist/bin.js" + }, + "peerDependencies": { + "@chromatic-com/cypress": "^0.*.* || ^1.0.0", + "@chromatic-com/playwright": "^0.*.* || ^1.0.0" + }, + "peerDependenciesMeta": { + "@chromatic-com/cypress": { + "optional": true + }, + "@chromatic-com/playwright": { + "optional": true + } + } + }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -21724,15 +22364,6 @@ "node": ">=8" } }, - "node_modules/citty": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", - "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", - "dev": true, - "dependencies": { - "consola": "^3.2.3" - } - }, "node_modules/cjs-module-lexer": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", @@ -22001,7 +22632,7 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "devOptional": true, + "dev": true, "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -22020,7 +22651,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "devOptional": true + "dev": true }, "node_modules/color": { "version": "3.2.1", @@ -22347,15 +22978,6 @@ "node": ">=12" } }, - "node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "dev": true, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -22439,6 +23061,19 @@ "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", "dev": true }, + "node_modules/cookies": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", + "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", + "dev": true, + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/copy-text-to-clipboard": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", @@ -22828,7 +23463,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -22849,7 +23484,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -22864,7 +23499,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -22880,7 +23515,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -22889,7 +23524,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -22969,15 +23604,6 @@ "node": ">= 8" } }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/css-declaration-sorter": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", @@ -23342,7 +23968,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", - "devOptional": true, + "dev": true, "dependencies": { "rrweb-cssom": "^0.6.0" }, @@ -23913,7 +24539,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", - "devOptional": true, + "dev": true, "dependencies": { "abab": "^2.0.6", "whatwg-mimetype": "^3.0.0", @@ -23994,6 +24620,15 @@ "url": "https://opencollective.com/date-fns" } }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/dayjs": { "version": "1.11.10", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", @@ -24005,11 +24640,11 @@ "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -24020,11 +24655,6 @@ } } }, - "node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -24090,12 +24720,9 @@ "dev": true }, "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dependencies": { - "type-detect": "^4.0.0" - }, + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "engines": { "node": ">=6" } @@ -24153,22 +24780,6 @@ "node": ">=0.10.0" } }, - "node_modules/default-browser-id": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", - "dev": true, - "dependencies": { - "bplist-parser": "^0.2.0", - "untildify": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/default-gateway": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", @@ -24247,12 +24858,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "dev": true - }, "node_modules/del": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", @@ -24372,7 +24977,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -24382,24 +24987,6 @@ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "dev": true - }, - "node_modules/detect-package-manager": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-2.0.1.tgz", - "integrity": "sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==", - "dev": true, - "dependencies": { - "execa": "^5.1.1" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/detect-port": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", @@ -24498,6 +25085,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -24625,7 +25213,7 @@ "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", "deprecated": "Use your platform's native DOMException instead", - "devOptional": true, + "dev": true, "dependencies": { "webidl-conversions": "^7.0.0" }, @@ -24709,15 +25297,6 @@ "url": "https://dotenvx.com" } }, - "node_modules/dotenv-expand": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", - "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/dset": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.3.tgz", @@ -24768,45 +25347,14 @@ } }, "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/duplexify/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/duplexify/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "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" - } - }, - "node_modules/duplexify/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", "dependencies": { - "safe-buffer": "~5.1.0" + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" } }, "node_modules/earcut": { @@ -24865,7 +25413,7 @@ "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=12" }, @@ -24961,18 +25509,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/envinfo": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz", - "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -25080,10 +25616,9 @@ } }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, "node_modules/es-object-atoms": { "version": "1.0.0", @@ -25141,7 +25676,6 @@ "version": "0.19.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", - "devOptional": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -25174,17 +25708,10 @@ "@esbuild/win32-x64": "0.19.5" } }, - "node_modules/esbuild-plugin-alias": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/esbuild-plugin-alias/-/esbuild-plugin-alias-0.2.1.tgz", - "integrity": "sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==", - "dev": true - }, "node_modules/esbuild-register": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.5.0.tgz", "integrity": "sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==", - "dev": true, "dependencies": { "debug": "^4.3.4" }, @@ -25259,16 +25786,17 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "devOptional": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -25313,20 +25841,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -25348,9 +25862,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -25374,34 +25888,36 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { @@ -26045,16 +26561,28 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">= 0.8.0" } }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -26408,6 +26936,7 @@ "url": "https://github.com/sponsors/NaturalIntelligence" } ], + "optional": true, "dependencies": { "strnum": "^1.0.5" }, @@ -26450,7 +26979,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "devOptional": true, + "dev": true, "dependencies": { "bser": "2.1.1" } @@ -26492,12 +27021,6 @@ "node": ">=0.4.0" } }, - "node_modules/fetch-retry": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.6.tgz", - "integrity": "sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==", - "dev": true - }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -26570,28 +27093,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/file-system-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-2.3.0.tgz", - "integrity": "sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==", - "dependencies": { - "fs-extra": "11.1.1", - "ramda": "0.29.0" - } - }, - "node_modules/file-system-cache/node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/file-type": { "version": "17.1.6", "resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.6.tgz", @@ -26666,9 +27167,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -26795,6 +27296,30 @@ "node": ">=8" } }, + "node_modules/find-file-up": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-2.0.1.tgz", + "integrity": "sha512-qVdaUhYO39zmh28/JLQM5CoYN9byEOKEH4qfa8K1eNV17W0UUMJ9WgbR/hHFH+t5rcl+6RTb5UC7ck/I+uRkpQ==", + "dev": true, + "dependencies": { + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-2.0.0.tgz", + "integrity": "sha512-WgZ+nKbELDa6N3i/9nrHeNznm+lY3z4YfhDDWgW+5P0pdmMj26bxaxU11ookgY3NyP9GC7HvZ9etp0jRFqGEeQ==", + "dev": true, + "dependencies": { + "find-file-up": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", @@ -26858,15 +27383,6 @@ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "devOptional": true }, - "node_modules/flow-parser": { - "version": "0.232.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.232.0.tgz", - "integrity": "sha512-U8vcKyYdM+Kb0tPzfPJ5JyPMU0uXKwHxp0L6BcEc+wBlbTW9qRhOqV5DeGXclgclVvtqQNGEG8Strj/b6c/IxA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/fn.name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", @@ -26921,34 +27437,6 @@ "is-callable": "^1.1.3" } }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", @@ -27230,6 +27718,43 @@ "node": ">= 0.6" } }, + "node_modules/front-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", + "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", + "dev": true, + "dependencies": { + "js-yaml": "^3.13.1" + } + }, + "node_modules/front-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/front-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/front-matter/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -27285,6 +27810,7 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -27421,14 +27947,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "engines": { - "node": "*" - } - }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -27447,24 +27965,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/get-npm-tarball-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/get-npm-tarball-url/-/get-npm-tarball-url-2.1.0.tgz", - "integrity": "sha512-ro+DiMu5DXgRBabqXupW38h7WPZ9+Ad8UjwhvsmmN8w1sU7ab0nzAXvVZ4kqYg57OrqomRtJvepX5/xvFKNtjA==", - "dev": true, - "engines": { - "node": ">=12.17" - } - }, "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", @@ -27474,7 +27974,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8.0.0" } @@ -27530,25 +28030,6 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/giget": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.3.tgz", - "integrity": "sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==", - "dev": true, - "dependencies": { - "citty": "^0.1.6", - "consola": "^3.2.3", - "defu": "^6.1.4", - "node-fetch-native": "^1.6.3", - "nypm": "^0.3.8", - "ohash": "^1.1.3", - "pathe": "^1.1.2", - "tar": "^6.2.0" - }, - "bin": { - "giget": "dist/cli.mjs" - } - }, "node_modules/github-slugger": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", @@ -28039,23 +28520,6 @@ "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==" }, - "node_modules/gunzip-maybe": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", - "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", - "dev": true, - "dependencies": { - "browserify-zlib": "^0.1.4", - "is-deflate": "^1.0.0", - "is-gzip": "^1.0.0", - "peek-stream": "^1.1.0", - "pumpify": "^1.3.3", - "through2": "^2.0.3" - }, - "bin": { - "gunzip-maybe": "bin.js" - } - }, "node_modules/gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -28075,36 +28539,6 @@ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/harmony-reflect": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", @@ -28376,9 +28810,9 @@ } }, "node_modules/hast-util-to-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.0.tgz", - "integrity": "sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", "dev": true, "dependencies": { "@types/hast": "^3.0.0" @@ -28478,6 +28912,18 @@ "react-is": "^16.7.0" } }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/hosted-git-info": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", @@ -28546,7 +28992,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "devOptional": true, + "dev": true, "dependencies": { "whatwg-encoding": "^2.0.0" }, @@ -28699,6 +29145,59 @@ "entities": "^4.4.0" } }, + "node_modules/http-assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", + "dev": true, + "dependencies": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-assert/node_modules/deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", + "dev": true + }, + "node_modules/http-assert/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -29077,7 +29576,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "devOptional": true, + "dev": true, "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -29096,7 +29595,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "devOptional": true, + "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -29109,7 +29608,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "devOptional": true, + "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -29121,7 +29620,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "devOptional": true, + "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -29136,7 +29635,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "devOptional": true, + "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -29148,7 +29647,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "devOptional": true, + "dev": true, "dependencies": { "find-up": "^4.0.0" }, @@ -29436,12 +29935,6 @@ "node": ">=6" } }, - "node_modules/ip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", - "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==", - "dev": true - }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -29604,11 +30097,14 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -29652,12 +30148,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-deflate": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", - "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==", - "dev": true - }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -29703,7 +30193,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6" } @@ -29733,15 +30223,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-gzip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", - "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-hexadecimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", @@ -29795,22 +30276,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -29906,7 +30371,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "devOptional": true + "dev": true }, "node_modules/is-reference": { "version": "3.0.2", @@ -30172,7 +30637,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -30181,7 +30646,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", @@ -30197,7 +30662,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "devOptional": true, + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -30209,7 +30674,7 @@ "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "devOptional": true, + "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -30224,7 +30689,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "devOptional": true, + "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -30238,7 +30703,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -30247,7 +30712,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "devOptional": true, + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -30259,7 +30724,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "devOptional": true, + "dev": true, "dependencies": { "semver": "^7.5.3" }, @@ -30274,7 +30739,7 @@ "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "devOptional": true, + "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -30289,7 +30754,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -30301,7 +30766,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "devOptional": true, + "dev": true, "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -30315,7 +30780,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.10.0" } @@ -30324,7 +30789,7 @@ "version": "3.1.7", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "devOptional": true, + "dev": true, "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -30333,24 +30798,6 @@ "node": ">=8" } }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -30440,7 +30887,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -30466,7 +30913,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "devOptional": true, + "dev": true, "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", @@ -30480,7 +30927,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -30511,7 +30958,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -30543,7 +30990,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -30559,7 +31006,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "devOptional": true, + "dev": true, "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -30573,7 +31020,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -30582,7 +31029,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -30596,7 +31043,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=10" }, @@ -30608,13 +31055,13 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "devOptional": true + "dev": true }, "node_modules/jest-circus/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -30626,7 +31073,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -30659,7 +31106,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -30674,7 +31121,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -30690,7 +31137,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -30699,7 +31146,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -30711,7 +31158,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", @@ -30756,7 +31203,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -30771,7 +31218,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -30787,7 +31234,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -30796,7 +31243,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -30810,7 +31257,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=10" }, @@ -30822,13 +31269,13 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "devOptional": true + "dev": true }, "node_modules/jest-config/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -30840,7 +31287,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "devOptional": true, + "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -30855,7 +31302,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -30870,7 +31317,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -30886,7 +31333,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -30895,7 +31342,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -30909,7 +31356,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=10" }, @@ -30921,13 +31368,13 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "devOptional": true + "dev": true }, "node_modules/jest-diff/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -30939,7 +31386,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "devOptional": true, + "dev": true, "dependencies": { "detect-newline": "^3.0.0" }, @@ -30951,7 +31398,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -30967,7 +31414,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -30982,7 +31429,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -30998,7 +31445,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -31007,7 +31454,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -31021,7 +31468,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=10" }, @@ -31033,13 +31480,13 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "devOptional": true + "dev": true }, "node_modules/jest-each/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -31252,7 +31699,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -31269,7 +31716,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "devOptional": true, + "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -31278,7 +31725,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -31303,7 +31750,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "devOptional": true, + "dev": true, "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" @@ -31316,7 +31763,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=10" }, @@ -31328,7 +31775,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -31342,13 +31789,13 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "devOptional": true + "dev": true }, "node_modules/jest-matcher-utils": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "devOptional": true, + "dev": true, "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -31363,7 +31810,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -31378,7 +31825,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31394,7 +31841,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -31403,7 +31850,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -31417,7 +31864,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=10" }, @@ -31429,13 +31876,13 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "devOptional": true + "dev": true }, "node_modules/jest-matcher-utils/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -31447,7 +31894,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -31467,7 +31914,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -31482,7 +31929,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31498,7 +31945,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -31507,7 +31954,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -31521,7 +31968,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=10" }, @@ -31533,13 +31980,13 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "devOptional": true + "dev": true }, "node_modules/jest-message-util/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -31551,7 +31998,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -31565,7 +32012,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6" }, @@ -31582,7 +32029,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "devOptional": true, + "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -31591,7 +32038,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "devOptional": true, + "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -31611,7 +32058,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "devOptional": true, + "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" @@ -31624,7 +32071,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -31639,7 +32086,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31655,7 +32102,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -31664,7 +32111,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "devOptional": true, + "dev": true, "engines": { "node": ">=10" } @@ -31673,7 +32120,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -31685,7 +32132,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", @@ -31717,7 +32164,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -31732,7 +32179,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31748,7 +32195,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -31757,7 +32204,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.10.0" } @@ -31766,7 +32213,7 @@ "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "devOptional": true, + "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -31776,7 +32223,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -31788,7 +32235,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -31821,7 +32268,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -31836,7 +32283,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31852,7 +32299,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -31861,7 +32308,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -31873,7 +32320,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -31904,7 +32351,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -31919,7 +32366,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31935,7 +32382,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -31944,7 +32391,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "devOptional": true, + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -31956,7 +32403,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -31970,7 +32417,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=10" }, @@ -31982,13 +32429,13 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "devOptional": true + "dev": true }, "node_modules/jest-snapshot/node_modules/semver": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "devOptional": true, + "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -32003,7 +32450,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -32085,7 +32532,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -32102,7 +32549,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -32117,7 +32564,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -32133,7 +32580,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -32142,7 +32589,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -32156,7 +32603,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=10" }, @@ -32168,13 +32615,13 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "devOptional": true + "dev": true }, "node_modules/jest-validate/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -32186,7 +32633,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", @@ -32205,7 +32652,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -32220,7 +32667,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -32236,7 +32683,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -32245,7 +32692,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -32343,113 +32790,19 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" }, - "node_modules/jscodeshift": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.2.tgz", - "integrity": "sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.0", - "@babel/parser": "^7.23.0", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.23.0", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/preset-flow": "^7.22.15", - "@babel/preset-typescript": "^7.23.0", - "@babel/register": "^7.22.15", - "babel-core": "^7.0.0-bridge.0", - "chalk": "^4.1.2", - "flow-parser": "0.*", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "neo-async": "^2.5.0", - "node-dir": "^0.1.17", - "recast": "^0.23.3", - "temp": "^0.8.4", - "write-file-atomic": "^2.3.0" - }, - "bin": { - "jscodeshift": "bin/jscodeshift.js" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" - }, - "peerDependenciesMeta": { - "@babel/preset-env": { - "optional": true - } - } - }, - "node_modules/jscodeshift/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jscodeshift/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jscodeshift/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jscodeshift/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", "engines": { - "node": ">=8" - } - }, - "node_modules/jscodeshift/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "node": ">=12.0.0" } }, "node_modules/jsdom": { "version": "22.1.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz", "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==", - "devOptional": true, + "dev": true, "dependencies": { "abab": "^2.0.6", "cssstyle": "^3.0.0", @@ -32491,7 +32844,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "devOptional": true, + "dev": true, "dependencies": { "debug": "4" }, @@ -32503,7 +32856,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "devOptional": true, + "dev": true, "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -32517,7 +32870,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "devOptional": true, + "dev": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -32530,7 +32883,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "devOptional": true, + "dev": true, "dependencies": { "xmlchars": "^2.2.0" }, @@ -32673,7 +33026,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "devOptional": true + "dev": true }, "node_modules/jsonfile": { "version": "6.1.0", @@ -32763,6 +33116,18 @@ "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==" }, + "node_modules/keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "dev": true, + "dependencies": { + "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -32793,6 +33158,93 @@ "node": ">=6" } }, + "node_modules/koa": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.3.tgz", + "integrity": "sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==", + "dev": true, + "dependencies": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.9.0", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^2.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "engines": { + "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + } + }, + "node_modules/koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", + "dev": true + }, + "node_modules/koa-convert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", + "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", + "dev": true, + "dependencies": { + "co": "^4.6.0", + "koa-compose": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/koa/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", @@ -32842,20 +33294,6 @@ "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", "dev": true }, - "node_modules/lazy-universal-dotenv": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-4.0.0.tgz", - "integrity": "sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==", - "dev": true, - "dependencies": { - "app-root-dir": "^1.0.2", - "dotenv": "^16.0.0", - "dotenv-expand": "^10.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", @@ -32949,9 +33387,9 @@ } }, "node_modules/lines-and-columns": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", - "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", + "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -33062,23 +33500,6 @@ "node": ">=8.9.0" } }, - "node_modules/local-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", - "devOptional": true, - "peer": true, - "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/local-storage": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/local-storage/-/local-storage-2.0.0.tgz", @@ -33129,6 +33550,12 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, + "node_modules/lodash.clonedeepwith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", + "integrity": "sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==", + "dev": true + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -33371,6 +33798,22 @@ "node": ">=8" } }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dev": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/logform": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", @@ -33412,6 +33855,12 @@ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, + "node_modules/long-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", + "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==", + "dev": true + }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -33433,12 +33882,9 @@ } }, "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dependencies": { - "get-func-name": "^2.0.1" - } + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", + "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==" }, "node_modules/lower-case": { "version": "2.0.2", @@ -33496,15 +33942,12 @@ } }, "node_modules/magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", - "devOptional": true, + "version": "0.30.12", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", + "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "dev": true, "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/make-dir": { @@ -33531,7 +33974,7 @@ "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "devOptional": true, + "dev": true, "dependencies": { "tmpl": "1.0.5" } @@ -33548,7 +33991,8 @@ "node_modules/map-or-similar": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", - "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==" + "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==", + "dev": true }, "node_modules/mapbox-gl": { "version": "1.13.3", @@ -33603,9 +34047,9 @@ } }, "node_modules/markdown-to-jsx": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.3.2.tgz", - "integrity": "sha512-B+28F5ucp83aQm+OxNrPkS8z0tMKaeHiy0lHJs3LqCyDQFtWuenaIrkaVTgAm1pf1AU85LXltva86hlaT17i8Q==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.5.0.tgz", + "integrity": "sha512-RrBNcMHiFPcz/iqIj0n3wclzHXjwS7mzjBNWecKKVhNTIxQepIix6Il/wZCn2Cg5Y1ow2Qi84+eJrryFRWBEWw==", "dev": true, "engines": { "node": ">= 10" @@ -34036,6 +34480,7 @@ "version": "1.11.3", "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", + "dev": true, "dependencies": { "map-or-similar": "^1.5.0" } @@ -36272,11 +36717,11 @@ ] }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -36476,38 +36921,6 @@ "node": ">=10" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "node_modules/mlly": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", - "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==", - "devOptional": true, - "peer": true, - "dependencies": { - "acorn": "^8.11.3", - "pathe": "^1.1.2", - "pkg-types": "^1.0.3", - "ufo": "^1.3.2" - } - }, - "node_modules/mlly/node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "devOptional": true, - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/module-details-from-path": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", @@ -36536,6 +36949,7 @@ "version": "4.17.2", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.17.2.tgz", "integrity": "sha512-mLV7SEiov2LHleRJPMPrK2PMyhXFZt2UQLC4VD4pnth3jMjYKHhtqfwwkkvS/NXuo/Fp3vbhaNcXrIDaLRb9Tg==", + "license": "Apache-2.0", "dependencies": { "bson": "^4.7.2", "mongodb-connection-string-url": "^2.6.0", @@ -36553,6 +36967,7 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "license": "Apache-2.0", "dependencies": { "@types/whatwg-url": "^8.2.1", "whatwg-url": "^11.0.0" @@ -36562,6 +36977,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", "engines": { "node": ">=6" } @@ -36570,6 +36986,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "license": "MIT", "dependencies": { "punycode": "^2.1.1" }, @@ -36581,6 +36998,7 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "license": "MIT", "dependencies": { "tr46": "^3.0.0", "webidl-conversions": "^7.0.0" @@ -36740,40 +37158,6 @@ "node": "^16 || ^18 || >= 20" } }, - "node_modules/node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.2" - }, - "engines": { - "node": ">= 0.10.5" - } - }, - "node_modules/node-dir/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/node-dir/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/node-emoji": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", @@ -36812,12 +37196,6 @@ } } }, - "node_modules/node-fetch-native": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz", - "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==", - "dev": true - }, "node_modules/node-fetch/node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -36860,7 +37238,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "devOptional": true + "dev": true }, "node_modules/node-machine-id": { "version": "1.1.12", @@ -36914,6 +37292,20 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, + "node_modules/node-schedule": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-2.1.1.tgz", + "integrity": "sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==", + "dev": true, + "dependencies": { + "cron-parser": "^4.2.0", + "long-timeout": "0.1.1", + "sorted-array-functions": "^1.3.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/noms": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", @@ -36968,33 +37360,6 @@ "node": ">=6" } }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -37123,35 +37488,34 @@ "version": "2.2.7", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", - "devOptional": true + "dev": true }, "node_modules/nx": { - "version": "18.0.7", - "resolved": "https://registry.npmjs.org/nx/-/nx-18.0.7.tgz", - "integrity": "sha512-jcJ7ohP/rgqI9X6FJ8WnsPHpzm99oBV9qmaUeOUHWsdjp8r+2ptSHDmMmA67BPT+J6T+/ILhVlgzboXV1W7Ccg==", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/nx/-/nx-20.0.3.tgz", + "integrity": "sha512-6ZuZ09IdMIwbklKqEwUAHspuVMsDr7TIcCyeytmdDC1XbA+Tbb93wriyJyiI9EBQw4StrlJF9vSXAZsuDiOKeA==", "dev": true, "hasInstallScript": true, "dependencies": { - "@nrwl/tao": "18.0.7", + "@napi-rs/wasm-runtime": "0.2.4", "@yarnpkg/lockfile": "^1.1.0", "@yarnpkg/parsers": "3.0.0-rc.46", - "@zkochan/js-yaml": "0.0.6", - "axios": "^1.6.0", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.7.4", "chalk": "^4.1.0", "cli-cursor": "3.1.0", "cli-spinners": "2.6.1", "cliui": "^8.0.1", - "dotenv": "~16.3.1", - "dotenv-expand": "~10.0.0", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", "enquirer": "~2.3.6", "figures": "3.2.0", "flat": "^5.0.2", - "fs-extra": "^11.1.0", + "front-matter": "^4.0.2", "ignore": "^5.0.4", "jest-diff": "^29.4.1", - "js-yaml": "4.1.0", "jsonc-parser": "3.2.0", - "lines-and-columns": "~2.0.3", + "lines-and-columns": "2.0.3", "minimatch": "9.0.3", "node-machine-id": "1.1.12", "npm-run-path": "^4.0.1", @@ -37159,7 +37523,6 @@ "ora": "5.3.0", "semver": "^7.5.3", "string-width": "^4.2.3", - "strong-log-transformer": "^2.1.0", "tar-stream": "~2.2.0", "tmp": "~0.2.1", "tsconfig-paths": "^4.1.2", @@ -37172,16 +37535,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "18.0.7", - "@nx/nx-darwin-x64": "18.0.7", - "@nx/nx-freebsd-x64": "18.0.7", - "@nx/nx-linux-arm-gnueabihf": "18.0.7", - "@nx/nx-linux-arm64-gnu": "18.0.7", - "@nx/nx-linux-arm64-musl": "18.0.7", - "@nx/nx-linux-x64-gnu": "18.0.7", - "@nx/nx-linux-x64-musl": "18.0.7", - "@nx/nx-win32-arm64-msvc": "18.0.7", - "@nx/nx-win32-x64-msvc": "18.0.7" + "@nx/nx-darwin-arm64": "20.0.3", + "@nx/nx-darwin-x64": "20.0.3", + "@nx/nx-freebsd-x64": "20.0.3", + "@nx/nx-linux-arm-gnueabihf": "20.0.3", + "@nx/nx-linux-arm64-gnu": "20.0.3", + "@nx/nx-linux-arm64-musl": "20.0.3", + "@nx/nx-linux-x64-gnu": "20.0.3", + "@nx/nx-linux-x64-musl": "20.0.3", + "@nx/nx-win32-arm64-msvc": "20.0.3", + "@nx/nx-win32-x64-msvc": "20.0.3" }, "peerDependencies": { "@swc-node/register": "^1.8.0", @@ -37196,6 +37559,23 @@ } } }, + "node_modules/nx/node_modules/@nx/nx-darwin-arm64": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.0.3.tgz", + "integrity": "sha512-/wjxSuQZOHwDopNAfuh2BTsaDtDECjTDrKHJdTknrSVjdsB2b1hwSdL7Ct0PXBiSnf+0gfYBR2fuPmLZYb3AXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/nx/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -37211,6 +37591,17 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/nx/node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/nx/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -37227,16 +37618,19 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/nx/node_modules/dotenv": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.2.tgz", - "integrity": "sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==", + "node_modules/nx/node_modules/dotenv-expand": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", + "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", "dev": true, + "dependencies": { + "dotenv": "^16.4.4" + }, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "url": "https://dotenvx.com" } }, "node_modules/nx/node_modules/emoji-regex": { @@ -37260,26 +37654,11 @@ "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, - "node_modules/nx/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/nx/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -37313,159 +37692,6 @@ "node": ">=8" } }, - "node_modules/nypm": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.8.tgz", - "integrity": "sha512-IGWlC6So2xv6V4cIDmoV0SwwWx7zLG086gyqkyumteH2fIgCAM4nDVFB2iDRszDvmdSVW9xb1N+2KjQ6C7d4og==", - "dev": true, - "dependencies": { - "citty": "^0.1.6", - "consola": "^3.2.3", - "execa": "^8.0.1", - "pathe": "^1.1.2", - "ufo": "^1.4.0" - }, - "bin": { - "nypm": "dist/cli.mjs" - }, - "engines": { - "node": "^14.16.0 || >=16.10.0" - } - }, - "node_modules/nypm/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/nypm/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nypm/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/nypm/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nypm/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nypm/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nypm/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nypm/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nypm/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/nypm/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/oauth2orize": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/oauth2orize/-/oauth2orize-1.12.0.tgz", @@ -37656,12 +37882,6 @@ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, - "node_modules/ohash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz", - "integrity": "sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==", - "dev": true - }, "node_modules/omit-deep-lodash": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/omit-deep-lodash/-/omit-deep-lodash-1.1.7.tgz", @@ -37722,6 +37942,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", + "dev": true + }, "node_modules/open": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", @@ -38281,6 +38507,15 @@ "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -38455,31 +38690,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -38497,14 +38707,15 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "devOptional": true + "dev": true, + "peer": true }, "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "engines": { - "node": "*" + "node": ">= 14.16" } }, "node_modules/pause": { @@ -38557,17 +38768,6 @@ "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/peek-stream": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", - "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "duplexify": "^3.5.0", - "through2": "^2.0.3" - } - }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -38693,33 +38893,9 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "devOptional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", "dev": true, - "dependencies": { - "find-up": "^5.0.0" - }, "engines": { - "node": ">=10" - } - }, - "node_modules/pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", - "devOptional": true, - "peer": true, - "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" + "node": ">= 6" } }, "node_modules/pkg-up": { @@ -38833,6 +39009,7 @@ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -39833,7 +40010,6 @@ "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, "engines": { "node": ">= 0.6.0" } @@ -39969,7 +40145,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "devOptional": true + "dev": true }, "node_modules/pump": { "version": "3.0.0", @@ -39981,27 +40157,6 @@ "once": "^1.3.1" } }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -40025,7 +40180,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "devOptional": true, + "dev": true, "funding": [ { "type": "individual", @@ -40280,6 +40435,7 @@ "version": "6.12.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.0.tgz", "integrity": "sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==", + "dev": true, "dependencies": { "side-channel": "^1.0.6" }, @@ -40311,7 +40467,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "devOptional": true + "dev": true }, "node_modules/queue": { "version": "6.0.2", @@ -40364,14 +40520,11 @@ "performance-now": "^2.1.0" } }, - "node_modules/ramda": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.29.0.tgz", - "integrity": "sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ramda" - } + "node_modules/rambda": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/rambda/-/rambda-9.3.0.tgz", + "integrity": "sha512-cl/7DCCKNxmsbc0dXZTJTY08rvDdzLhVfE6kPBson1fWzDapLzv0RKSzjpmAqP53fkQqAvq05gpUVHTrUNsuxg==", + "dev": true }, "node_modules/random-bytes": { "version": "1.0.0", @@ -40669,6 +40822,21 @@ "react-dom": ">=16.8.0" } }, + "node_modules/react-confetti": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-confetti/-/react-confetti-6.1.0.tgz", + "integrity": "sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==", + "dev": true, + "dependencies": { + "tween-functions": "^1.2.0" + }, + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "react": "^16.3.0 || ^17.0.1 || ^18.0.0" + } + }, "node_modules/react-datepicker": { "version": "4.25.0", "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.25.0.tgz", @@ -40886,19 +41054,19 @@ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" }, "node_modules/react-hook-form": { - "version": "7.51.2", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.51.2.tgz", - "integrity": "sha512-y++lwaWjtzDt/XNnyGDQy6goHskFualmDlf+jzEZvjvz6KWDf7EboL7pUvRCzPTJd0EOPpdekYaQLEvvG6m6HA==", + "version": "7.53.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.53.1.tgz", + "integrity": "sha512-6aiQeBda4zjcuaugWvim9WsGqisoUk+etmFEsSUMm451/Ic8L/UAb7sRtMj3V+Hdzm6mMjU1VhiSzYUZeBm0Vg==", "peer": true, "engines": { - "node": ">=12.22.0" + "node": ">=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/react-hook-form" }, "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18" + "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "node_modules/react-hot-toast": { @@ -41041,53 +41209,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-remove-scroll": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", - "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", - "dev": true, - "dependencies": { - "react-remove-scroll-bar": "^2.3.3", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", - "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", - "dev": true, - "dependencies": { - "react-style-singleton": "^2.2.1", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/react-router": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", @@ -41215,29 +41336,6 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/react-style-singleton": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", - "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", - "dev": true, - "dependencies": { - "get-nonce": "^1.0.0", - "invariant": "^2.2.4", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/react-switch": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/react-switch/-/react-switch-7.0.0.tgz", @@ -41297,108 +41395,6 @@ "react-dom": ">=16.6.0" } }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -41467,7 +41463,6 @@ "version": "0.23.6", "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.6.tgz", "integrity": "sha512-9FHoNjX1yjuesMwuthAmPKabxYQdOgihFYmT5ebXfYGBcnqXZf3WOVz+5foEZ8Y83P4ZY6yQD5GMmtV+pgCCAQ==", - "dev": true, "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", @@ -41483,7 +41478,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -42129,7 +42123,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "devOptional": true, + "dev": true, "dependencies": { "resolve-from": "^5.0.0" }, @@ -42137,11 +42131,66 @@ "node": ">=8" } }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-dir/node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-dir/node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-dir/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -42257,7 +42306,7 @@ "version": "4.14.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.0.tgz", "integrity": "sha512-Qe7w62TyawbDzB4yt32R0+AbIo6m1/sqO7UPzFS8Z/ksL5mrfhA0v4CavfdmFav3D+ub4QeAgsGEe84DoWe/nQ==", - "devOptional": true, + "dev": true, "dependencies": { "@types/estree": "1.0.5" }, @@ -42287,11 +42336,25 @@ "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.0.tgz", + "integrity": "sha512-BcnSPRM76/cD2gQC+rQNGBN6GStBs2pl/FpweW8JYuz5J/IEa0Fr4AtrPv766DB/6b2MZ/AfSIOSGw3nEIP8SA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, "node_modules/rrweb-cssom": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", - "devOptional": true + "dev": true }, "node_modules/rtl-detect": { "version": "1.1.2", @@ -42497,9 +42560,9 @@ "dev": true }, "node_modules/search-insights": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.1.tgz", - "integrity": "sha512-HHFjYH/0AqXacETlIbe9EYc3UNlQYGNNTY0fZ/sWl6SweX+GDxq9NB5+RVoPLgEFuOtCz7M9dhYxqDnhbbF0eQ==", + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.2.tgz", + "integrity": "sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==", "peer": true }, "node_modules/section-matter": { @@ -42999,7 +43062,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "devOptional": true, + "dev": true, "peer": true }, "node_modules/signal-exit": { @@ -43301,6 +43364,12 @@ "node": ">=0.10.0" } }, + "node_modules/sorted-array-functions": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", + "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==", + "dev": true + }, "node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -43354,38 +43423,6 @@ "memory-pager": "^1.0.2" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", - "dev": true - }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -43475,7 +43512,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "devOptional": true, + "dev": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -43487,7 +43524,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -43496,7 +43533,7 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "devOptional": true, + "dev": true, "peer": true }, "node_modules/standard-as-callback": { @@ -43528,23 +43565,17 @@ "node": ">= 0.4" } }, - "node_modules/store2": { - "version": "2.14.3", - "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.3.tgz", - "integrity": "sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==", - "dev": true - }, "node_modules/storybook": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.0.5.tgz", - "integrity": "sha512-rdxfjkED5CBKj6T01NKr9MRakyXkffV8dvLXj5bWN4AlQ1OOm5Sw9B1z+rQ/FN7RYIU5b63xiX2pu3gy5t6nRQ==", - "dev": true, + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.3.6.tgz", + "integrity": "sha512-9GVbtej6ZzPRUM7KRQ7848506FfHrUiJGqPuIQdoSJd09EmuEoLjmLAgEOmrHBQKgGYMaM7Vh9GsTLim6vwZTQ==", "dependencies": { - "@storybook/cli": "8.0.5" + "@storybook/core": "8.3.6" }, "bin": { - "sb": "index.js", - "storybook": "index.js" + "getstorybook": "bin/index.cjs", + "sb": "bin/index.cjs", + "storybook": "bin/index.cjs" }, "funding": { "type": "opencollective", @@ -43552,150 +43583,74 @@ } }, "node_modules/storybook-addon-apollo-client": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/storybook-addon-apollo-client/-/storybook-addon-apollo-client-5.0.0.tgz", - "integrity": "sha512-vE0q7R90LuV5bmnas0B3HBU+0c7axmDpu5mYLTzqKLyQbgVlw102GGhodRA0EZOJa+KrQQ7d6auojPS3tZpVxQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/storybook-addon-apollo-client/-/storybook-addon-apollo-client-7.3.0.tgz", + "integrity": "sha512-Lqp9dn9sy6LdfS4e/Dx6M7cNXXLAiHBT2LKEWynxEkrMen/sgBPRUqQz0cJiLsSVbJLKov4KzWf5359UQaPxRA==", "dev": true, - "dependencies": { - "@storybook/components": "^7.0.0", - "tslib": "2.5.3" - }, - "engines": { - "node": ">=10" - }, "peerDependencies": { - "@storybook/addons": "^7.0.0", - "graphql": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "@apollo/client": "^3.0.0" } }, - "node_modules/storybook-addon-apollo-client/node_modules/@storybook/channels": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", - "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", - "dev": true, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", "dependencies": { - "@storybook/client-logger": "7.6.17", - "@storybook/core-events": "7.6.17", - "@storybook/global": "^5.0.0", - "qs": "^6.10.0", - "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" } }, - "node_modules/storybook-addon-apollo-client/node_modules/@storybook/client-logger": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", - "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", - "dev": true, - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" }, - "node_modules/storybook-addon-apollo-client/node_modules/@storybook/components": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.6.17.tgz", - "integrity": "sha512-lbh7GynMidA+CZcJnstVku6Nhs+YkqjYaZ+mKPugvlVhGVWv0DaaeQFVuZ8cJtUGJ/5FFU4Y+n+gylYUHkGBMA==", + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, "dependencies": { - "@radix-ui/react-select": "^1.2.2", - "@radix-ui/react-toolbar": "^1.0.4", - "@storybook/client-logger": "7.6.17", - "@storybook/csf": "^0.1.2", - "@storybook/global": "^5.0.0", - "@storybook/theming": "7.6.17", - "@storybook/types": "7.6.17", - "memoizerific": "^1.11.3", - "use-resize-observer": "^9.1.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "engines": { + "node": ">=8.0" } }, - "node_modules/storybook-addon-apollo-client/node_modules/@storybook/core-events": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", - "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", + "node_modules/streamroller/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "dependencies": { - "ts-dedent": "^2.0.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "engines": { + "node": ">=6 <7 || >=8" } }, - "node_modules/storybook-addon-apollo-client/node_modules/@storybook/theming": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.6.17.tgz", - "integrity": "sha512-ZbaBt3KAbmBtfjNqgMY7wPMBshhSJlhodyMNQypv+95xLD/R+Az6aBYbpVAOygLaUQaQk4ar7H/Ww6lFIoiFbA==", + "node_modules/streamroller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "dependencies": { - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.6.17", - "@storybook/global": "^5.0.0", - "memoizerific": "^1.11.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/storybook-addon-apollo-client/node_modules/@storybook/types": { - "version": "7.6.17", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", - "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", + "node_modules/streamroller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, - "dependencies": { - "@storybook/channels": "7.6.17", - "@types/babel__core": "^7.0.0", - "@types/express": "^4.7.0", - "file-system-cache": "2.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/storybook-addon-apollo-client/node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", - "dev": true - }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" + "engines": { + "node": ">= 4.0.0" } }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "dev": true - }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -43750,7 +43705,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "devOptional": true, + "dev": true, "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -43775,27 +43730,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "node_modules/string-width/node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -43933,24 +43867,11 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -44006,26 +43927,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", - "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", - "devOptional": true, - "peer": true, - "dependencies": { - "js-tokens": "^9.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", - "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", - "devOptional": true, - "peer": true - }, "node_modules/strip-outer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-2.0.0.tgz", @@ -44043,23 +43944,6 @@ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" }, - "node_modules/strong-log-transformer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", - "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", - "dev": true, - "dependencies": { - "duplexer": "^0.1.1", - "minimist": "^1.2.0", - "through": "^2.3.4" - }, - "bin": { - "sl-log-transformer": "bin/sl-log-transformer.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/strtok3": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", @@ -44294,14 +44178,7 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "devOptional": true - }, - "node_modules/synchronous-promise": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.17.tgz", - "integrity": "sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==", - "dev": true, - "peer": true + "dev": true }, "node_modules/tabbable": { "version": "6.2.0", @@ -44503,24 +44380,6 @@ "node": ">=10" } }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, "node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", @@ -44540,72 +44399,9 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.2.0.tgz", "integrity": "sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==", - "dependencies": { - "memoizerific": "^1.11.3" - } - }, - "node_modules/temp": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", - "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", - "dev": true, - "dependencies": { - "rimraf": "~2.6.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/temp/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", "dev": true, "dependencies": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "memoizerific": "^1.11.3" } }, "node_modules/terser": { @@ -44747,7 +44543,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "devOptional": true, + "dev": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -44761,7 +44557,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -44771,7 +44567,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -44856,20 +44652,27 @@ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, "node_modules/tinybench": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz", - "integrity": "sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==", - "devOptional": true, + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "peer": true + }, + "node_modules/tinyexec": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", + "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", + "dev": true, "peer": true }, "node_modules/tinypool": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.3.tgz", - "integrity": "sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==", - "devOptional": true, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", + "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", + "dev": true, "peer": true, "engines": { - "node": ">=14.0.0" + "node": "^18.0.0 || >=20.0.0" } }, "node_modules/tinyqueue": { @@ -44877,10 +44680,18 @@ "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/tinyspy": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "engines": { "node": ">=14.0.0" } @@ -44906,7 +44717,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "devOptional": true + "dev": true }, "node_modules/to-fast-properties": { "version": "2.0.0", @@ -44927,12 +44738,6 @@ "node": ">=8.0" } }, - "node_modules/tocbot": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.25.0.tgz", - "integrity": "sha512-kE5wyCQJ40hqUaRVkyQ4z5+4juzYsv/eK+aqD97N62YH0TxFhzJvo22RUQQZdO3YnXAk42ZOfOpjVdy+Z0YokA==", - "dev": true - }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -44975,7 +44780,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "devOptional": true, + "dev": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -44990,7 +44795,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6" } @@ -44999,7 +44804,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "devOptional": true, + "dev": true, "engines": { "node": ">= 4.0.0" } @@ -45008,7 +44813,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", - "devOptional": true, + "dev": true, "dependencies": { "punycode": "^2.3.0" }, @@ -45020,7 +44825,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6" } @@ -45099,6 +44904,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "dev": true, "engines": { "node": ">=6.10" } @@ -45293,6 +45099,15 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "dev": true, + "engines": { + "node": ">=0.6.x" + } + }, "node_modules/tsx": { "version": "3.14.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-3.14.0.tgz", @@ -45310,246 +45125,6 @@ "fsevents": "~2.3.3" } }, - "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/tsx/node_modules/@esbuild/linux-x64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", @@ -45566,102 +45141,6 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/tsx/node_modules/esbuild": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", @@ -45718,6 +45197,12 @@ "source-map": "^0.6.0" } }, + "node_modules/tween-functions": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", + "integrity": "sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==", + "dev": true + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -45734,6 +45219,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, "engines": { "node": ">=4" } @@ -45851,6 +45337,7 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -45882,25 +45369,6 @@ "node": "*" } }, - "node_modules/ufo": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", - "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", - "devOptional": true - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/uid-safe": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", @@ -46020,18 +45488,6 @@ "node": ">= 0.8.0" } }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/unist-util-is": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", @@ -46225,6 +45681,16 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/upath": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", @@ -46435,7 +45901,7 @@ "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "devOptional": true, + "dev": true, "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -46447,27 +45913,6 @@ "integrity": "sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==", "dev": true }, - "node_modules/use-callback-ref": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", - "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", - "dev": true, - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/use-isomorphic-layout-effect": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", @@ -46481,41 +45926,6 @@ } } }, - "node_modules/use-resize-observer": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/use-resize-observer/-/use-resize-observer-9.1.0.tgz", - "integrity": "sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==", - "dev": true, - "dependencies": { - "@juggle/resize-observer": "^3.3.1" - }, - "peerDependencies": { - "react": "16.8.0 - 18", - "react-dom": "16.8.0 - 18" - } - }, - "node_modules/use-sidecar": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", - "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", - "dev": true, - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/useragent": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", @@ -46650,7 +46060,7 @@ "version": "9.2.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "devOptional": true, + "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -46660,16 +46070,6 @@ "node": ">=10.12.0" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/validate-npm-package-name": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", @@ -46747,7 +46147,7 @@ "version": "5.1.4", "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.4.tgz", "integrity": "sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==", - "devOptional": true, + "dev": true, "dependencies": { "esbuild": "^0.19.3", "postcss": "^8.4.35", @@ -46799,16 +46199,15 @@ } }, "node_modules/vite-node": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.4.0.tgz", - "integrity": "sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==", - "devOptional": true, + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.3.tgz", + "integrity": "sha512-I1JadzO+xYX887S39Do+paRePCKoiDrWRRjp9kkG5he0t7RXNvPAJPCQSJqbGN4uCrFFeS3Kj3sLqY8NMYBEdA==", + "dev": true, "peer": true, "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", + "debug": "^4.3.6", + "pathe": "^1.1.2", "vite": "^5.0.0" }, "bin": { @@ -46836,32 +46235,31 @@ } }, "node_modules/vitest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.4.0.tgz", - "integrity": "sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==", - "devOptional": true, + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.3.tgz", + "integrity": "sha512-Zrxbg/WiIvUP2uEzelDNTXmEMJXuzJ1kCpbDvaKByFA9MNeO95V+7r/3ti0qzJzrxdyuUw5VduN7k+D3VmVOSA==", + "dev": true, "peer": true, "dependencies": { - "@vitest/expect": "1.4.0", - "@vitest/runner": "1.4.0", - "@vitest/snapshot": "1.4.0", - "@vitest/spy": "1.4.0", - "@vitest/utils": "1.4.0", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", - "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.2", + "@vitest/expect": "2.1.3", + "@vitest/mocker": "2.1.3", + "@vitest/pretty-format": "^2.1.3", + "@vitest/runner": "2.1.3", + "@vitest/snapshot": "2.1.3", + "@vitest/spy": "2.1.3", + "@vitest/utils": "2.1.3", + "chai": "^5.1.1", + "debug": "^4.3.6", + "magic-string": "^0.30.11", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.0", + "tinypool": "^1.0.0", + "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "1.4.0", - "why-is-node-running": "^2.2.2" + "vite-node": "2.1.3", + "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" @@ -46875,8 +46273,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.4.0", - "@vitest/ui": "1.4.0", + "@vitest/browser": "2.1.3", + "@vitest/ui": "2.1.3", "happy-dom": "*", "jsdom": "*" }, @@ -46902,174 +46300,21 @@ } }, "node_modules/vitest/node_modules/@vitest/expect": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.4.0.tgz", - "integrity": "sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==", - "devOptional": true, + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.3.tgz", + "integrity": "sha512-SNBoPubeCJhZ48agjXruCI57DvxcsivVDdWz+SSsmjTT4QN/DfHk3zB/xKsJqMs26bLZ/pNRLnCf0j679i0uWQ==", + "dev": true, "peer": true, "dependencies": { - "@vitest/spy": "1.4.0", - "@vitest/utils": "1.4.0", - "chai": "^4.3.10" + "@vitest/spy": "2.1.3", + "@vitest/utils": "2.1.3", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/vitest/node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "devOptional": true, - "peer": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/vitest/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "devOptional": true, - "peer": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/vitest/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "devOptional": true, - "peer": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "devOptional": true, - "peer": true, - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/vitest/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "devOptional": true, - "peer": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "devOptional": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "devOptional": true, - "peer": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "devOptional": true, - "peer": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "devOptional": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "devOptional": true, - "peer": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/vitest/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "devOptional": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/vt-pbf": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", @@ -47084,7 +46329,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "devOptional": true, + "dev": true, "dependencies": { "xml-name-validator": "^4.0.0" }, @@ -47096,7 +46341,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "devOptional": true, + "dev": true, "dependencies": { "makeerror": "1.0.12" } @@ -47534,11 +46779,6 @@ "acorn": "^8" } }, - "node_modules/webpack/node_modules/es-module-lexer": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", - "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==" - }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -47671,7 +46911,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "devOptional": true, + "dev": true, "dependencies": { "iconv-lite": "0.6.3" }, @@ -47683,7 +46923,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "devOptional": true, + "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -47708,7 +46948,7 @@ "version": "12.0.1", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", - "devOptional": true, + "dev": true, "dependencies": { "tr46": "^4.1.1", "webidl-conversions": "^7.0.0" @@ -47787,10 +47027,10 @@ } }, "node_modules/why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", - "devOptional": true, + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, "peer": true, "dependencies": { "siginfo": "^2.0.0", @@ -47890,12 +47130,6 @@ "node": ">=0.1.90" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, "node_modules/world-countries": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/world-countries/-/world-countries-4.0.0.tgz", @@ -47917,59 +47151,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -48015,7 +47196,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "devOptional": true, + "dev": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -48025,9 +47206,9 @@ } }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "engines": { "node": ">=10.0.0" }, @@ -48082,7 +47263,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "devOptional": true, + "dev": true, "engines": { "node": ">=12" } @@ -48207,6 +47388,15 @@ "node": ">=8" } }, + "node_modules/ylru": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", + "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index 6d690c73d2..3362b2dc93 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "node": "^20" }, "volta": { - "node": "20.7.0" + "node": "20.18.0" }, "prisma": { "seed": "tsx --tsconfig back/tsconfig.lib.json back/prisma/seed.ts", @@ -36,8 +36,9 @@ "dependencies": { "@apollo/client": "^3.7.16", "@apollo/server": "^4.9.1", - "@aws-sdk/client-s3": "^3.359.0", - "@aws-sdk/lib-storage": "^3.359.0", + "@aws-sdk/client-s3": "3.677.0", + "@aws-sdk/lib-storage": "3.677.0", + "@aws-sdk/s3-request-presigner": "3.677.0", "@bull-board/api": "^4.12.2", "@bull-board/express": "^4.12.2", "@codegouvfr/react-dsfr": "^1.13.8", @@ -102,6 +103,7 @@ "dataloader": "^2.0.0", "date-fns": "^2.28.0", "decimal.js": "^10.4.3", + "duplexify": "^4.1.3", "exceljs": "^4.3.0", "express": "^4.18.2", "express-rate-limit": "^5.5.0", @@ -183,6 +185,7 @@ "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.21.0", "@babel/runtime": "^7.21.0", + "@chromatic-com/storybook": "^1.9.0", "@docusaurus/module-type-aliases": "^3.5.2", "@faker-js/faker": "^7.6.0", "@fast-csv/parse": "^4.3.0", @@ -190,26 +193,26 @@ "@graphql-codegen/typescript": "^3.0.2", "@graphql-codegen/typescript-operations": "^3.0.2", "@graphql-codegen/typescript-resolvers": "^3.1.1", - "@nx/esbuild": "18.0.7", - "@nx/eslint": "18.0.7", - "@nx/eslint-plugin": "18.0.7", - "@nx/jest": "18.0.7", - "@nx/js": "18.0.7", - "@nx/node": "18.0.7", - "@nx/react": "18.0.7", - "@nx/storybook": "^18.0.8", - "@nx/vite": "18.0.7", - "@nx/web": "18.0.7", + "@nx/esbuild": "20.0.3", + "@nx/eslint": "20.0.3", + "@nx/eslint-plugin": "20.0.3", + "@nx/jest": "20.0.3", + "@nx/js": "20.0.3", + "@nx/node": "20.0.3", + "@nx/react": "20.0.3", + "@nx/storybook": "20.0.3", + "@nx/vite": "20.0.3", + "@nx/web": "20.0.3", "@playwright/test": "^1.40.1", - "@storybook/addon-a11y": "^8.0.0", - "@storybook/addon-actions": "^8.0.0", - "@storybook/addon-essentials": "^8.0.0", - "@storybook/addon-interactions": "^8.0.0", - "@storybook/addon-links": "^8.0.0", - "@storybook/addon-mdx-gfm": "^8.0.0", - "@storybook/core-server": "^8.0.0", - "@storybook/react": "^8.0.0", - "@storybook/react-vite": "^8.0.0", + "@storybook/addon-a11y": "8.3.6", + "@storybook/addon-actions": "8.3.6", + "@storybook/addon-essentials": "8.3.6", + "@storybook/addon-interactions": "8.3.6", + "@storybook/addon-links": "8.3.6", + "@storybook/addon-mdx-gfm": "8.3.6", + "@storybook/core-server": "8.3.6", + "@storybook/react": "8.3.6", + "@storybook/react-vite": "8.3.6", "@swc-node/register": "1.8.0", "@swc/cli": "~0.1.62", "@swc/core": "~1.3.85", @@ -226,6 +229,7 @@ "@types/connect-redis": "^0.0.14", "@types/cors": "^2.8.6", "@types/cron": "^1.7.2", + "@types/duplexify": "^3.6.4", "@types/express": "~4.17.13", "@types/express-rate-limit": "^5.1.3", "@types/express-serve-static-core": "^4.17.24", @@ -256,8 +260,8 @@ "@types/sanitize-html": "^2.3.1", "@types/supertest": "^2.0.10", "@types/zxcvbn": "^4.4.0", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", + "@typescript-eslint/eslint-plugin": "8.11.0", + "@typescript-eslint/parser": "8.11.0", "@vitejs/plugin-react": "4.2.1", "babel-jest": "^29.7.0", "babel-loader": "^8.3.0", @@ -266,8 +270,8 @@ "core-js": "^3.21.1", "docusaurus-graphql-plugin": "^0.9.0", "esbuild": "0.19.5", - "eslint": "8.57.0", - "eslint-plugin-import": "^2.27.5", + "eslint": "8.57.1", + "eslint-plugin-import": "2.31.0", "eslint-plugin-jsx-a11y": "6.7.1", "eslint-plugin-no-only-tests": "^3.1.0", "eslint-plugin-react": "7.32.2", @@ -281,12 +285,12 @@ "jsdom": "~22.1.0", "mermaid": "10.6.1", "node-mocks-http": "^1.11.0", - "nx": "18.0.7", + "nx": "20.0.3", "prettier": "^2.8.6", "raw-loader": "^4.0.2", "sass": "^1.55.0", - "storybook": "^8.0.0", - "storybook-addon-apollo-client": "^5.0.0", + "storybook": "8.3.6", + "storybook-addon-apollo-client": "^7.3.0", "superagent-mock": "^4.0.0", "supertest": "^6.1.6", "ts-jest": "^29.1.0", diff --git a/tsconfig.base.json b/tsconfig.base.json index e12eda96a9..ed52e11fc8 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -28,6 +28,7 @@ "@td/mail": ["libs/back/mail/src/index.ts"], "@td/prisma": ["libs/back/prisma/src/index.ts"], "@td/queues": ["lib/back/queues/src/index.ts"], + "@td/registry": ["libs/back/registry/src/index.ts"], "@td/scripts": ["lib/back/scripts/src/index.ts"], "@td/tracer": ["libs/back/tracer/src/index.ts"], "back": ["back/src/index.ts"], From e8895d0e4971fda1214374ab368b33d20fa314b4 Mon Sep 17 00:00:00 2001 From: GaelFerrand <45355989+GaelFerrand@users.noreply.github.com> Date: Thu, 7 Nov 2024 09:59:48 +0100 Subject: [PATCH 07/74] =?UTF-8?q?[TRA-14961]=20La=20mention=20ADR=20d'un?= =?UTF-8?q?=20BSDD=20n'est=20plus=20dupliqu=C3=A9e=20(#3703)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mutations/__tests__/duplicateForm.integration.ts | 10 ++++------ back/src/forms/resolvers/mutations/duplicateForm.ts | 2 -- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/back/src/forms/resolvers/mutations/__tests__/duplicateForm.integration.ts b/back/src/forms/resolvers/mutations/__tests__/duplicateForm.integration.ts index 050567e9de..8e41852067 100644 --- a/back/src/forms/resolvers/mutations/__tests__/duplicateForm.integration.ts +++ b/back/src/forms/resolvers/mutations/__tests__/duplicateForm.integration.ts @@ -185,7 +185,6 @@ describe("Mutation.duplicateForm", () => { recipientCompanyMail, recipientIsTempStorage, wasteDetailsCode, - wasteDetailsOnuCode, wasteDetailsPackagingInfos, wasteDetailsQuantity, wasteDetailsQuantityType, @@ -295,7 +294,8 @@ describe("Mutation.duplicateForm", () => { "quantityGrouped", "citerneNotWashedOutReason", "hasCiterneBeenWashedOut", - "emptyReturnADR" + "emptyReturnADR", + "wasteDetailsOnuCode" ]; const expectedSkippedTransporter = [ @@ -364,7 +364,6 @@ describe("Mutation.duplicateForm", () => { recipientCompanyMail, recipientIsTempStorage, wasteDetailsCode, - wasteDetailsOnuCode, wasteDetailsQuantityType, wasteDetailsPop, wasteDetailsIsDangerous, @@ -457,7 +456,6 @@ describe("Mutation.duplicateForm", () => { recipientCompanyMail, wasteDetailsCode, wasteDetailsPackagingInfos, - wasteDetailsOnuCode, wasteDetailsPop, wasteDetailsIsDangerous, wasteDetailsName, @@ -514,7 +512,6 @@ describe("Mutation.duplicateForm", () => { recipientCompanyMail, wasteDetailsCode, wasteDetailsPackagingInfos, - wasteDetailsOnuCode, wasteDetailsPop, wasteDetailsIsDangerous, wasteDetailsName, @@ -622,7 +619,8 @@ describe("Mutation.duplicateForm", () => { "quantityGrouped", "citerneNotWashedOutReason", "hasCiterneBeenWashedOut", - "emptyReturnADR" + "emptyReturnADR", + "wasteDetailsOnuCode" ]; // make sure this test breaks when a new field is added to the Form model diff --git a/back/src/forms/resolvers/mutations/duplicateForm.ts b/back/src/forms/resolvers/mutations/duplicateForm.ts index e4b847e789..df08e1384f 100644 --- a/back/src/forms/resolvers/mutations/duplicateForm.ts +++ b/back/src/forms/resolvers/mutations/duplicateForm.ts @@ -116,7 +116,6 @@ async function getDuplicateFormInput( recipientCompanyMail: recipient?.contactEmail ?? form.recipientCompanyMail, recipientIsTempStorage: form.recipientIsTempStorage, wasteDetailsCode: form.wasteDetailsCode, - wasteDetailsOnuCode: form.wasteDetailsOnuCode, wasteDetailsPackagingInfos: Prisma.JsonNull, wasteDetailsQuantity: 0, wasteDetailsQuantityType: form.wasteDetailsQuantityType, @@ -235,7 +234,6 @@ async function getDuplicateFormForwardedInInput( wasteDetailsPackagingInfos: prismaJsonNoNull( form.wasteDetailsPackagingInfos ), - wasteDetailsOnuCode: forwardedIn.wasteDetailsOnuCode, wasteDetailsPop: forwardedIn.wasteDetailsPop, wasteDetailsIsDangerous: forwardedIn.wasteDetailsIsDangerous, wasteDetailsName: forwardedIn.wasteDetailsName, From 3baca56f2583263fcddfaf00d823c70707f97a5a Mon Sep 17 00:00:00 2001 From: Laurent Paoletti Date: Tue, 29 Oct 2024 15:30:20 +0100 Subject: [PATCH 08/74] Notification number is mandatory for foreign next destination --- Changelog.md | 6 ++++++ .../forms/__tests__/validation.integration.ts | 6 ++---- .../__tests__/markAsProcessed.integration.ts | 18 ++++++------------ back/src/forms/validation.ts | 8 +++----- 4 files changed, 17 insertions(+), 21 deletions(-) diff --git a/Changelog.md b/Changelog.md index e38bf6d0be..2ed569fd8c 100644 --- a/Changelog.md +++ b/Changelog.md @@ -5,6 +5,12 @@ Les changements importants de Trackdéchets sont documentés dans ce fichier. Le format est basé sur [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), et le projet suit un schéma de versionning inspiré de [Calendar Versioning](https://calver.org/). +# [2024.11.1] 19/11/2024 + +#### :boom: Breaking changes + +- Le champ "Numéro de notification" est obligatoire lorsque la destination ultérieure renseignée est étrangère [PR 3719](https://github.com/MTES-MCT/trackdechets/pull/3719) + # [2024.10.1] 22/10/2024 #### :rocket: Nouvelles fonctionnalités diff --git a/back/src/forms/__tests__/validation.integration.ts b/back/src/forms/__tests__/validation.integration.ts index 0823aef36f..983d74aec8 100644 --- a/back/src/forms/__tests__/validation.integration.ts +++ b/back/src/forms/__tests__/validation.integration.ts @@ -1859,8 +1859,7 @@ describe("processedInfoSchema", () => { } ]; - // FIXME Revert de TRA-13421 suite à des clients API qui sont bloqués - it.skip.each(testMatrix)( + it.each(testMatrix)( "should throw when `nextDestinationNotificationNumber` is missing %o", async ({ noTraceability, @@ -1899,8 +1898,7 @@ describe("processedInfoSchema", () => { } ); - // FIXME Revert de TRA-13421 suite à des clients API qui sont bloqués - it.skip("should also throw when `nextDestinationNotificationNumber` is null", async () => { + it("should also throw when `nextDestinationNotificationNumber` is null", async () => { const processedInfo = { processedBy: "John Snow", processedAt: new Date(), diff --git a/back/src/forms/resolvers/mutations/__tests__/markAsProcessed.integration.ts b/back/src/forms/resolvers/mutations/__tests__/markAsProcessed.integration.ts index 97b184d819..fae0301041 100644 --- a/back/src/forms/resolvers/mutations/__tests__/markAsProcessed.integration.ts +++ b/back/src/forms/resolvers/mutations/__tests__/markAsProcessed.integration.ts @@ -210,8 +210,7 @@ describe("mutation.markAsProcessed", () => { expect(updatedForm.status).toEqual("AWAITING_GROUP"); }); - // FIXME Revert de TRA-13421 suite à des clients API qui sont bloqués - it.skip("should fail to mark a form with temporary storage as FOLLOWED_WITH_PNTTD if notification number is missing", async () => { + it("should fail to mark a form with temporary storage as FOLLOWED_WITH_PNTTD if notification number is missing", async () => { const { user, company } = await userWithCompanyFactory("ADMIN"); const form = await formWithTempStorageFactory({ ownerId: user.id, @@ -554,8 +553,7 @@ describe("mutation.markAsProcessed", () => { expect(resultingForm.status).toBe("NO_TRACEABILITY"); }); - // FIXME Revert de TRA-13421 suite à des clients API qui sont bloqués - it.skip.each([ + it.each([ { wasteDetailsCode: "05 01 12*", wasteDetailsPop: false, @@ -1752,8 +1750,7 @@ describe("mutation.markAsProcessed", () => { expect(resultingForm.status).toBe("NO_TRACEABILITY"); }); - // FIXME Revert de TRA-13421 suite à des clients API qui sont bloqués - test.skip("nextDestinationNotificationNumber should be mandatory when noTraceability is true and wasteCode is dangerous", async () => { + test("nextDestinationNotificationNumber should be mandatory when noTraceability is true and wasteCode is dangerous", async () => { const { user, company } = await userWithCompanyFactory("ADMIN"); const form = await formFactory({ ownerId: user.id, @@ -1796,8 +1793,7 @@ describe("mutation.markAsProcessed", () => { ]); }); - // FIXME Revert de TRA-13421 suite à des clients API qui sont bloqués - it.skip.each([ + it.each([ { wasteDetailsCode: "07 07 07*", wasteDetailsPop: false, @@ -1947,8 +1943,7 @@ describe("mutation.markAsProcessed", () => { expect(errors).toBeUndefined(); }); - // FIXME Revert de TRA-13421 suite à des clients API qui sont bloqués - test.skip("nextDestinationNotificationNumber should be mandatory when nextDestination.company is foreign when noTraceability is false", async () => { + test("nextDestinationNotificationNumber should be mandatory when nextDestination.company is foreign when noTraceability is false", async () => { const { user, company } = await userWithCompanyFactory("ADMIN"); const form = await formFactory({ ownerId: user.id, @@ -2120,8 +2115,7 @@ describe("mutation.markAsProcessed", () => { ]); }); - // FIXME Revert de TRA-13421 suite à des clients API qui sont bloqués - test.skip("nextDestination.company and notificationNumber should be mandatory when company is extra-EU and when noTraceability is false", async () => { + test("nextDestination.company and notificationNumber should be mandatory when company is extra-EU and when noTraceability is false", async () => { const { user, company } = await userWithCompanyFactory("ADMIN"); const form = await formFactory({ ownerId: user.id, diff --git a/back/src/forms/validation.ts b/back/src/forms/validation.ts index 635694010e..725c630982 100644 --- a/back/src/forms/validation.ts +++ b/back/src/forms/validation.ts @@ -1650,11 +1650,9 @@ const withNextDestination = (required: boolean) => "Destination ultérieure : Le numéro de notification (format PPAAAADDDRRR) ou le numéro de déclaration Annexe 7 (format A7E AAAA DDDRRR) renseigné ne correspond pas au format attendu." ) .nullable() - .notRequired(), - // FIXME Revert de TRA-13421 suite à des clients API qui sont bloqués - // .required( - // "Destination ultérieure : le numéro de notification est obligatoire" - // ), + .required( + "Destination ultérieure : le numéro de notification est obligatoire" + ), otherwise: schema => schema .max( From 7cb5b5ee02722beaf56112d83cc6ac1a2ebd75f6 Mon Sep 17 00:00:00 2001 From: JulianaJM <37509748+JulianaJM@users.noreply.github.com> Date: Thu, 7 Nov 2024 14:03:28 +0100 Subject: [PATCH 09/74] =?UTF-8?q?[tra-15223]Afficher=20le=20r=C3=B4le=20s?= =?UTF-8?q?=C3=A9lectionn=C3=A9=20dans=20le=20tableau=20des=20membres=20lo?= =?UTF-8?q?rs=20d'un=20zoom=20texte=20=C3=A0=20200%=20(#3713)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- front/src/Apps/Companies/CompanyMembers/companyMembers.scss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/front/src/Apps/Companies/CompanyMembers/companyMembers.scss b/front/src/Apps/Companies/CompanyMembers/companyMembers.scss index 5ad0c805cb..10b5dda2ce 100644 --- a/front/src/Apps/Companies/CompanyMembers/companyMembers.scss +++ b/front/src/Apps/Companies/CompanyMembers/companyMembers.scss @@ -4,3 +4,9 @@ .company-members__invite { max-width: 600px; } + +.company-members__list { + .fr-select { + width: fit-content; + } +} From fad4db273e3e13dc979f57cdea61eadc0f9d79c2 Mon Sep 17 00:00:00 2001 From: Riron Date: Thu, 7 Nov 2024 14:46:28 +0100 Subject: [PATCH 10/74] Fixes (#3730) --- apps/ui/src/main.ts | 3 +- .../registry/typeDefs/registry.enums.graphql | 2 + front/src/dashboard/registry/ImportModal.tsx | 41 +++++++------ .../registry/RegistryCompanySwitcher.tsx | 58 ++++++++++--------- .../registry/src/incomingWaste/constants.ts | 4 +- .../src/incomingWaste/validation/schema.ts | 1 + .../src/incomingWaste/validation/transform.ts | 2 + libs/back/registry/src/ssd/database.ts | 8 +-- .../registry/src/ssd/validation/schema.ts | 3 +- .../registry/src/ssd/validation/transform.ts | 2 + libs/back/registry/src/transformers.ts | 6 +- 11 files changed, 75 insertions(+), 55 deletions(-) diff --git a/apps/ui/src/main.ts b/apps/ui/src/main.ts index 52487fce9b..4d7048b628 100644 --- a/apps/ui/src/main.ts +++ b/apps/ui/src/main.ts @@ -19,7 +19,8 @@ const CONNECT_SRC = [ "https://api-adresse.data.gouv.fr", "https://sentry.incubateur.net", "https://openmaptiles.geo.data.gouv.fr", - "https://openmaptiles.github.io" + "https://openmaptiles.github.io", + "https://s3.fr-par.scw.cloud" ]; const WORKER_SRC = ["blob:"]; // needed for MapBox diff --git a/back/src/registry/typeDefs/registry.enums.graphql b/back/src/registry/typeDefs/registry.enums.graphql index b362efce43..fa6bb5ff8e 100644 --- a/back/src/registry/typeDefs/registry.enums.graphql +++ b/back/src/registry/typeDefs/registry.enums.graphql @@ -78,6 +78,8 @@ enum BsdSubType { enum RegistryImportType { "Sortie de statut de déchet" SSD + "Déchet (non) dangereux entrant" + INCOMING_WASTE } enum RegistryImportStatus { diff --git a/front/src/dashboard/registry/ImportModal.tsx b/front/src/dashboard/registry/ImportModal.tsx index dd6e20e748..ef28f18c78 100644 --- a/front/src/dashboard/registry/ImportModal.tsx +++ b/front/src/dashboard/registry/ImportModal.tsx @@ -33,9 +33,13 @@ type StepProps = { }; const steps = [ - { title: "Téléchargement du fichier", component: Step1 }, + { + title: "Téléchargement du fichier", + component: Step1, + buttons: ["CANCEL", "VALIDATE"] + }, { title: "Vérification", component: Step2 }, - { title: "Importation", component: Step3 } + { title: "Importation", component: Step3, buttons: ["CANCEL", "CLOSE"] } ]; const REGISTRY_UPLOAD_SIGNED_URL = gql` @@ -118,23 +122,21 @@ export function ImportModal({ isOpen, onClose }: Props) {
    - {currentStepIdx < steps.length - 1 ? ( - <> - - - - ) : ( + {steps[currentStepIdx].buttons?.includes("CANCEL") && ( + + )} + {steps[currentStepIdx].buttons?.includes("VALIDATE") && ( + + )} + {steps[currentStepIdx].buttons?.includes("CLOSE") && ( @@ -168,6 +170,7 @@ function Step1({ register }: StepProps) { Selectionnez une option + edge.node.siret) ?? []; + const delegationsSirets = new Set(); + const delegations = + delegationsData?.registryDelegations.edges.filter(item => { + return delegationsSirets.has(item.node.delegator.orgId) + ? false + : delegationsSirets.add(item.node.delegator.orgId); + }) ?? []; + + const displayedCount = (myCompanies.length || 0) + (delegations.length || 0); const totalCount = (myCompaniesData?.myCompanies.totalCount || 0) + (delegationsData?.registryDelegations.totalCount || 0); @@ -112,7 +120,7 @@ export function RegistryCompanySwitcher({ onCompanySelect }: Props) { } }} > - {selectedItem} + {selectedItem} - {myCompaniesData?.myCompanies.edges - .filter(edge => edge.node.siret) - .map(({ node }) => ( -
    { + {myCompanies.map(({ node }) => ( +
    { + onCompanySelect(node.orgId); + setSelectedItem(`${node.name} ${node.siret}`); + setIsOpen(false); + }} + onKeyDown={e => { + if (e.key === "Enter") { onCompanySelect(node.orgId); setSelectedItem(`${node.name} ${node.siret}`); setIsOpen(false); - }} - onKeyDown={e => { - if (e.key === "Enter") { - onCompanySelect(node.orgId); - setSelectedItem(`${node.name} ${node.siret}`); - setIsOpen(false); - } - }} - key={node.orgId} - > - {node.name} {node.siret} -
    - ))} - {delegationsData?.registryDelegations.edges + } + }} + key={node.orgId} + > + {node.givenName ?? node.name} {node.siret} +
    + ))} + {delegations .map(edge => edge.node.delegator) .map(delegator => (
    { onCompanySelect(delegator.orgId); - setSelectedItem(`${delegator.name} ${delegator.siret}`); + setSelectedItem(`${delegator.name} ${delegator.orgId}`); setIsOpen(false); }} onKeyDown={e => { if (e.key === "Enter") { onCompanySelect(delegator.orgId); - setSelectedItem(`${delegator.name} ${delegator.siret}`); + setSelectedItem(`${delegator.name} ${delegator.orgId}`); setIsOpen(false); } }} diff --git a/libs/back/registry/src/incomingWaste/constants.ts b/libs/back/registry/src/incomingWaste/constants.ts index 52a84899bc..f0e3befe27 100644 --- a/libs/back/registry/src/incomingWaste/constants.ts +++ b/libs/back/registry/src/incomingWaste/constants.ts @@ -1,8 +1,8 @@ export const INCOMING_WASTE_HEADERS = { reason: "Motif", - publicId: " Numéro unique", + publicId: "Numéro unique", reportAsSiret: "SIRET du déclarant", - reportForSiret: " SIRET du destinataire", + reportForSiret: "SIRET du destinataire", wasteCode: "Code déchet", wastePop: "POP", wasteIsDangerous: "Dangereux", diff --git a/libs/back/registry/src/incomingWaste/validation/schema.ts b/libs/back/registry/src/incomingWaste/validation/schema.ts index 6aec2c583a..6d3f2a6b69 100644 --- a/libs/back/registry/src/incomingWaste/validation/schema.ts +++ b/libs/back/registry/src/incomingWaste/validation/schema.ts @@ -221,6 +221,7 @@ const inputIncomingWasteSchema = z.object({ // Props added through transform const transformedSsdSchema = z.object({ + id: z.string().optional(), reportForAddress: z.string().default(""), reportForCity: z.string().default(""), reportForPostalCode: z.string().default(""), diff --git a/libs/back/registry/src/incomingWaste/validation/transform.ts b/libs/back/registry/src/incomingWaste/validation/transform.ts index 19ef0d1f3e..2741758b46 100644 --- a/libs/back/registry/src/incomingWaste/validation/transform.ts +++ b/libs/back/registry/src/incomingWaste/validation/transform.ts @@ -14,6 +14,8 @@ export async function transformAndRefineReason( } }); + incomingWasteItem.id = incomingWasteItemInDb?.id; + // If the line alreary exists in DB and we dont have a reason, we can simply ignore it if (incomingWasteItemInDb && !incomingWasteItem.reason) { incomingWasteItem.reason = "IGNORER"; diff --git a/libs/back/registry/src/ssd/database.ts b/libs/back/registry/src/ssd/database.ts index add1dab7fa..510d87be45 100644 --- a/libs/back/registry/src/ssd/database.ts +++ b/libs/back/registry/src/ssd/database.ts @@ -12,16 +12,16 @@ export async function saveSsdLine({ switch (line.reason) { case "MODIFIER": await prisma.$transaction(async tx => { - await tx.registrySsd.updateMany({ - where: { publicId: line.publicId }, + await tx.registrySsd.update({ + where: { id: line.id }, data: { isActive: false } }); await tx.registrySsd.create({ data: { ...persistedData, importId } }); }); return; case "ANNULER": - await prisma.registrySsd.updateMany({ - where: { publicId: line.publicId }, + await prisma.registrySsd.update({ + where: { id: line.id }, data: { isCancelled: true } }); return; diff --git a/libs/back/registry/src/ssd/validation/schema.ts b/libs/back/registry/src/ssd/validation/schema.ts index dca29f64d6..ed988f5a06 100644 --- a/libs/back/registry/src/ssd/validation/schema.ts +++ b/libs/back/registry/src/ssd/validation/schema.ts @@ -198,7 +198,8 @@ const transformedSsdSchema = z.object({ reportForAddress: z.string().default(""), reportForCity: z.string().default(""), reportForPostalCode: z.string().default(""), - reportForName: z.coerce.string().default("") + reportForName: z.coerce.string().default(""), + id: z.string().optional() }); export const ssdSchema = inputSsdSchema.merge(transformedSsdSchema); diff --git a/libs/back/registry/src/ssd/validation/transform.ts b/libs/back/registry/src/ssd/validation/transform.ts index 2829470a4b..11ce4fe0e7 100644 --- a/libs/back/registry/src/ssd/validation/transform.ts +++ b/libs/back/registry/src/ssd/validation/transform.ts @@ -15,6 +15,8 @@ export async function transformAndRefineReason( } }); + ssdItem.id = ssdItemInDb?.id; + // If the line alreary exists in DB and we dont have a reason, we can simply ignore it if (ssdItemInDb && !ssdItem.reason) { ssdItem.reason = "IGNORER"; diff --git a/libs/back/registry/src/transformers.ts b/libs/back/registry/src/transformers.ts index 0f91a85445..45637858eb 100644 --- a/libs/back/registry/src/transformers.ts +++ b/libs/back/registry/src/transformers.ts @@ -62,6 +62,7 @@ export function getTransformCsvStream(options: ImportOptions) { } export function getTransformXlsxStream(options: ImportOptions) { + // Create an inputStream to feed the WorkbookReader const inputStream = new PassThrough(); const workbookReader = new Excel.stream.xlsx.WorkbookReader(inputStream, {}); @@ -86,7 +87,7 @@ export function getTransformXlsxStream(options: ImportOptions) { const rawLine = {}; const keys = Object.keys(options.headers); for (const [index, key] of keys.entries()) { - rawLine[key] = row.getCell(index).value; + rawLine[key] = row.getCell(index + 1).value; } const result = await options.safeParseAsync(rawLine); @@ -97,6 +98,7 @@ export function getTransformXlsxStream(options: ImportOptions) { const outputStream = Readable.from(createReader()); - const xslxTransformStream = duplexify(inputStream, outputStream); + // Create a duplex (transform) stream from the passThrough & Exceljs ouput stream + const xslxTransformStream = duplexify.obj(inputStream, outputStream); return xslxTransformStream; } From 8b0ce65c412a9fe07b797addbed6ea5381546e94 Mon Sep 17 00:00:00 2001 From: JulianaJM <37509748+JulianaJM@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:29:58 +0100 Subject: [PATCH 11/74] [tra-15297]display generic alert error on paoh/vhu tabs (#3711) --- back/src/bspaoh/permissions.ts | 4 ++-- .../__tests__/createBspaoh.integration.ts | 3 +-- .../createDraftBspaoh.integration.ts | 3 +-- .../__tests__/publishBspaoh.integration.ts | 3 +-- .../__tests__/updateBspaoh.integration.ts | 6 ++---- back/src/bsvhu/permissions.ts | 4 ++-- .../__tests__/createBsvhu.integration.ts | 3 +-- .../__tests__/createDraftBsvhu.integration.ts | 3 +-- .../__tests__/publishBsvhu.integration.ts | 3 +-- .../__tests__/updateBsvhu.integration.ts | 6 ++---- .../Dashboard/Creation/FormStepsContent.tsx | 6 +++++- .../Dashboard/Creation/bspaoh/FormSteps.tsx | 6 +++++- .../Creation/bsvhu/BsvhuFormSteps.tsx | 3 +++ front/src/Apps/Dashboard/Creation/utils.ts | 21 ++++++++++++++++--- .../FormStepsTabs/FormStepsTabs.tsx | 14 ++++++++++++- 15 files changed, 58 insertions(+), 30 deletions(-) diff --git a/back/src/bspaoh/permissions.ts b/back/src/bspaoh/permissions.ts index 665b8915fc..b6ae039ea4 100644 --- a/back/src/bspaoh/permissions.ts +++ b/back/src/bspaoh/permissions.ts @@ -98,7 +98,7 @@ export async function checkCanCreate(user: User, bspaohInput: BspaohInput) { user, authorizedOrgIds, Permission.BsdCanCreate, - "Vous ne pouvez pas créer un bordereau sur lequel votre entreprise n'apparaît pas" + "Votre établissement doit être visé sur le bordereau" ); } @@ -113,7 +113,7 @@ export async function checkCanUpdate( user, authorizedOrgIds, Permission.BsdCanUpdate, - "Vous ne pouvez pas modifier un bordereau sur lequel votre entreprise n'apparait pas" + "Votre établissement doit être visé sur le bordereau" ); if (input) { const authorizedOrgIdsAfterUpdate = contributors(bspaoh, input); diff --git a/back/src/bspaoh/resolvers/mutations/__tests__/createBspaoh.integration.ts b/back/src/bspaoh/resolvers/mutations/__tests__/createBspaoh.integration.ts index 0bb1272a1f..ca8cfc1d9d 100644 --- a/back/src/bspaoh/resolvers/mutations/__tests__/createBspaoh.integration.ts +++ b/back/src/bspaoh/resolvers/mutations/__tests__/createBspaoh.integration.ts @@ -75,8 +75,7 @@ describe("Mutation.Bspaoh.create", () => { expect(errors).toEqual([ expect.objectContaining({ - message: - "Vous ne pouvez pas créer un bordereau sur lequel votre entreprise n'apparaît pas", + message: "Votre établissement doit être visé sur le bordereau", extensions: expect.objectContaining({ code: ErrorCode.FORBIDDEN }) diff --git a/back/src/bspaoh/resolvers/mutations/__tests__/createDraftBspaoh.integration.ts b/back/src/bspaoh/resolvers/mutations/__tests__/createDraftBspaoh.integration.ts index 0dcfd7454b..c43460ee9c 100644 --- a/back/src/bspaoh/resolvers/mutations/__tests__/createDraftBspaoh.integration.ts +++ b/back/src/bspaoh/resolvers/mutations/__tests__/createDraftBspaoh.integration.ts @@ -75,8 +75,7 @@ describe("Mutation.createDraftBspaoh", () => { expect(errors).toEqual([ expect.objectContaining({ - message: - "Vous ne pouvez pas créer un bordereau sur lequel votre entreprise n'apparaît pas", + message: "Votre établissement doit être visé sur le bordereau", extensions: expect.objectContaining({ code: ErrorCode.FORBIDDEN }) diff --git a/back/src/bspaoh/resolvers/mutations/__tests__/publishBspaoh.integration.ts b/back/src/bspaoh/resolvers/mutations/__tests__/publishBspaoh.integration.ts index 7685a817b6..99f41bb7b4 100644 --- a/back/src/bspaoh/resolvers/mutations/__tests__/publishBspaoh.integration.ts +++ b/back/src/bspaoh/resolvers/mutations/__tests__/publishBspaoh.integration.ts @@ -143,8 +143,7 @@ describe("Mutation.publishBspaoh", () => { ); expect(errors).toEqual([ expect.objectContaining({ - message: - "Vous ne pouvez pas modifier un bordereau sur lequel votre entreprise n'apparait pas", + message: "Votre établissement doit être visé sur le bordereau", extensions: expect.objectContaining({ code: ErrorCode.FORBIDDEN }) diff --git a/back/src/bspaoh/resolvers/mutations/__tests__/updateBspaoh.integration.ts b/back/src/bspaoh/resolvers/mutations/__tests__/updateBspaoh.integration.ts index 68aa518c28..d3fb69c945 100644 --- a/back/src/bspaoh/resolvers/mutations/__tests__/updateBspaoh.integration.ts +++ b/back/src/bspaoh/resolvers/mutations/__tests__/updateBspaoh.integration.ts @@ -112,8 +112,7 @@ describe("Mutation.updateBspaoh", () => { expect(errors).toEqual([ expect.objectContaining({ - message: - "Vous ne pouvez pas modifier un bordereau sur lequel votre entreprise n'apparait pas" + message: "Votre établissement doit être visé sur le bordereau" }) ]); }); @@ -141,8 +140,7 @@ describe("Mutation.updateBspaoh", () => { expect(errors).toEqual([ expect.objectContaining({ - message: - "Vous ne pouvez pas modifier un bordereau sur lequel votre entreprise n'apparait pas" + message: "Votre établissement doit être visé sur le bordereau" }) ]); }); diff --git a/back/src/bsvhu/permissions.ts b/back/src/bsvhu/permissions.ts index ab20d0e336..434030dec3 100644 --- a/back/src/bsvhu/permissions.ts +++ b/back/src/bsvhu/permissions.ts @@ -129,7 +129,7 @@ export async function checkCanCreate(user: User, bsvhuInput: BsvhuInput) { user, authorizedOrgIds, Permission.BsdCanCreate, - "Vous ne pouvez pas créer un bordereau sur lequel votre entreprise n'apparait pas" + "Votre établissement doit être visé sur le bordereau" ); } @@ -144,7 +144,7 @@ export async function checkCanUpdate( user, authorizedOrgIds, Permission.BsdCanUpdate, - "Vous ne pouvez pas modifier un bordereau sur lequel votre entreprise n'apparait pas" + "Votre établissement doit être visé sur le bordereau" ); if (input) { const authorizedOrgIdsAfterUpdate = contributors(bsvhu, input); diff --git a/back/src/bsvhu/resolvers/mutations/__tests__/createBsvhu.integration.ts b/back/src/bsvhu/resolvers/mutations/__tests__/createBsvhu.integration.ts index 8826480b86..f584a942ee 100644 --- a/back/src/bsvhu/resolvers/mutations/__tests__/createBsvhu.integration.ts +++ b/back/src/bsvhu/resolvers/mutations/__tests__/createBsvhu.integration.ts @@ -103,8 +103,7 @@ describe("Mutation.Vhu.create", () => { expect(errors).toEqual([ expect.objectContaining({ - message: - "Vous ne pouvez pas créer un bordereau sur lequel votre entreprise n'apparait pas", + message: "Votre établissement doit être visé sur le bordereau", extensions: expect.objectContaining({ code: ErrorCode.FORBIDDEN }) diff --git a/back/src/bsvhu/resolvers/mutations/__tests__/createDraftBsvhu.integration.ts b/back/src/bsvhu/resolvers/mutations/__tests__/createDraftBsvhu.integration.ts index c9331c619e..45dfb0e077 100644 --- a/back/src/bsvhu/resolvers/mutations/__tests__/createDraftBsvhu.integration.ts +++ b/back/src/bsvhu/resolvers/mutations/__tests__/createDraftBsvhu.integration.ts @@ -85,8 +85,7 @@ describe("Mutation.Vhu.createDraft", () => { expect(errors).toEqual([ expect.objectContaining({ - message: - "Vous ne pouvez pas créer un bordereau sur lequel votre entreprise n'apparait pas", + message: "Votre établissement doit être visé sur le bordereau", extensions: expect.objectContaining({ code: ErrorCode.FORBIDDEN }) diff --git a/back/src/bsvhu/resolvers/mutations/__tests__/publishBsvhu.integration.ts b/back/src/bsvhu/resolvers/mutations/__tests__/publishBsvhu.integration.ts index 4f4f773be0..30d191bc8a 100644 --- a/back/src/bsvhu/resolvers/mutations/__tests__/publishBsvhu.integration.ts +++ b/back/src/bsvhu/resolvers/mutations/__tests__/publishBsvhu.integration.ts @@ -108,8 +108,7 @@ describe("Mutation.Vhu.publish", () => { expect(errors).toEqual([ expect.objectContaining({ - message: - "Vous ne pouvez pas modifier un bordereau sur lequel votre entreprise n'apparait pas", + message: "Votre établissement doit être visé sur le bordereau", extensions: expect.objectContaining({ code: ErrorCode.FORBIDDEN }) diff --git a/back/src/bsvhu/resolvers/mutations/__tests__/updateBsvhu.integration.ts b/back/src/bsvhu/resolvers/mutations/__tests__/updateBsvhu.integration.ts index e5ad991543..b3f78c3df9 100644 --- a/back/src/bsvhu/resolvers/mutations/__tests__/updateBsvhu.integration.ts +++ b/back/src/bsvhu/resolvers/mutations/__tests__/updateBsvhu.integration.ts @@ -104,8 +104,7 @@ describe("Mutation.Vhu.update", () => { expect(errors).toEqual([ expect.objectContaining({ - message: - "Vous ne pouvez pas modifier un bordereau sur lequel votre entreprise n'apparait pas", + message: "Votre établissement doit être visé sur le bordereau", extensions: expect.objectContaining({ code: ErrorCode.FORBIDDEN }) @@ -171,8 +170,7 @@ describe("Mutation.Vhu.update", () => { ); expect(errors).toEqual([ expect.objectContaining({ - message: - "Vous ne pouvez pas modifier un bordereau sur lequel votre entreprise n'apparait pas", + message: "Votre établissement doit être visé sur le bordereau", extensions: expect.objectContaining({ code: ErrorCode.FORBIDDEN }) diff --git a/front/src/Apps/Dashboard/Creation/FormStepsContent.tsx b/front/src/Apps/Dashboard/Creation/FormStepsContent.tsx index eaba8d7462..5fcd192838 100644 --- a/front/src/Apps/Dashboard/Creation/FormStepsContent.tsx +++ b/front/src/Apps/Dashboard/Creation/FormStepsContent.tsx @@ -7,6 +7,7 @@ import { SealedFieldsContext } from "./context"; import { NormalizedError, SupportedBsdTypes, + TabError, TabId, getNextTab, getPrevTab, @@ -30,6 +31,7 @@ interface FormStepsContentProps { }; setPublishErrors: (normalizedErrors: NormalizedError[]) => void; errorTabIds?: TabId[]; + genericErrorMessage?: TabError[]; } const FormStepsContent = ({ bsdType, @@ -41,7 +43,8 @@ const FormStepsContent = ({ mainCtaLabel, saveForm, setPublishErrors, - errorTabIds + errorTabIds, + genericErrorMessage }: FormStepsContentProps) => { const [selectedTabId, setSelectedTabId] = useState(TabId.waste); const navigate = useNavigate(); @@ -104,6 +107,7 @@ const FormStepsContent = ({ scrollToTop(); }} onTabChange={onTabChange} + genericErrorMessage={genericErrorMessage} > {tabsContent[selectedTabId] ??

    } diff --git a/front/src/Apps/Dashboard/Creation/bspaoh/FormSteps.tsx b/front/src/Apps/Dashboard/Creation/bspaoh/FormSteps.tsx index f4fdeda27c..6e02b42a38 100644 --- a/front/src/Apps/Dashboard/Creation/bspaoh/FormSteps.tsx +++ b/front/src/Apps/Dashboard/Creation/bspaoh/FormSteps.tsx @@ -35,7 +35,8 @@ import { Destination } from "./steps/Destination"; import { getErrorTabIds, getPublishErrorMessages, - getPublishErrorTabIds + getPublishErrorTabIds, + TabId } from "../utils"; const paohToInput = (paoh: BspaohInput): BspaohInput => { @@ -195,6 +196,9 @@ export function ControlledTabs(props: Readonly) { tabsContent={tabsContent} setPublishErrors={setPublishErrors} errorTabIds={errorTabIds} + genericErrorMessage={publishErrorMessages.filter( + error => error.tabId === TabId.none + )} /> {loading && } diff --git a/front/src/Apps/Dashboard/Creation/bsvhu/BsvhuFormSteps.tsx b/front/src/Apps/Dashboard/Creation/bsvhu/BsvhuFormSteps.tsx index ae08f871f8..8bdd3e8c46 100644 --- a/front/src/Apps/Dashboard/Creation/bsvhu/BsvhuFormSteps.tsx +++ b/front/src/Apps/Dashboard/Creation/bsvhu/BsvhuFormSteps.tsx @@ -199,6 +199,9 @@ const BsvhuFormSteps = ({ sealedFields={sealedFields} setPublishErrors={setPublishErrors} errorTabIds={errorTabIds} + genericErrorMessage={publishErrorMessages.filter( + error => error.tabId === TabId.none + )} /> {loading && } diff --git a/front/src/Apps/Dashboard/Creation/utils.ts b/front/src/Apps/Dashboard/Creation/utils.ts index b13ff57d61..6ba2bce4d0 100644 --- a/front/src/Apps/Dashboard/Creation/utils.ts +++ b/front/src/Apps/Dashboard/Creation/utils.ts @@ -24,7 +24,8 @@ export enum TabId { waste = "waste", emitter = "emitter", transporter = "transporter", - destination = "destination" + destination = "destination", + none = "none" } export type NormalizedError = { @@ -179,10 +180,24 @@ export const handleGraphQlError = ( }); setPublishErrors(errorDetailList as NormalizedError[]); } else { - toastApolloError(err); // other case like forbidden, we need to display an error anyway ... + // other case like forbidden, we need to display an error anyway ... + setPublishErrors([ + { + code: err.graphQLErrors[0]?.extensions?.code, + path: ["none"], + message: err.graphQLErrors[0]?.message + } + ] as NormalizedError[]); } } else { - toastApolloError(err); // other case like forbidden, we need to display an error anyway ... + // other case like forbidden, we need to display an error anyway ... + setPublishErrors([ + { + code: err.graphQLErrors[0]?.extensions?.code, + path: ["none"], + message: err.graphQLErrors[0]?.extensions?.message + } + ] as NormalizedError[]); } }; diff --git a/front/src/Apps/Forms/Components/FormStepsTabs/FormStepsTabs.tsx b/front/src/Apps/Forms/Components/FormStepsTabs/FormStepsTabs.tsx index 2ebe1e3793..5e8004e447 100644 --- a/front/src/Apps/Forms/Components/FormStepsTabs/FormStepsTabs.tsx +++ b/front/src/Apps/Forms/Components/FormStepsTabs/FormStepsTabs.tsx @@ -3,6 +3,8 @@ import React, { useEffect } from "react"; import { FrIconClassName, RiIconClassName } from "@codegouvfr/react-dsfr"; import { Button } from "@codegouvfr/react-dsfr/Button"; import "./formStepsTabs.scss"; +import { TabError } from "../../../Dashboard/Creation/utils"; +import Alert from "@codegouvfr/react-dsfr/Alert"; interface Props { selectedTabId: string; @@ -21,6 +23,7 @@ interface Props { draftCtaLabel: string; mainCtaLabel: string; children: React.ReactNode; + genericErrorMessage?: TabError[]; } const FormStepsTabs = ({ selectedTabId, @@ -34,7 +37,8 @@ const FormStepsTabs = ({ onCancel, draftCtaLabel, mainCtaLabel, - children + children, + genericErrorMessage }: Readonly) => { useEffect(() => { // dsfr Tabs hack to add a type button on tabs to avoid submitting a form on tab change @@ -58,6 +62,14 @@ const FormStepsTabs = ({ {children}
    +
    + {!!genericErrorMessage?.[0]?.message && ( + + )}
    +
    +
    +

    + + 6.2 Mentions au titre des règlements RID, ADNR, IMDG (le cas + échéant) : + +

    +

    {form.wasteDetails?.nonRoadRegulationMention}

    +
    +
    +

    diff --git a/back/src/forms/registry.ts b/back/src/forms/registry.ts index 98ae8df685..f2d16c85f3 100644 --- a/back/src/forms/registry.ts +++ b/back/src/forms/registry.ts @@ -361,6 +361,7 @@ export function toGenericWaste( destinationReceptionRefusedWeight: bsdd.destinationReceptionRefusedWeight, destinationCompanyMail: bsdd.destinationCompanyMail, wasteAdr: bsdd.wasteAdr, + nonRoadRegulationMention: bsdd.nonRoadRegulationMention, workerCompanyName: null, workerCompanySiret: null, workerCompanyAddress: null, diff --git a/back/src/forms/resolvers/forms/stateSummary.ts b/back/src/forms/resolvers/forms/stateSummary.ts index b05a0dd104..14a9f292fd 100644 --- a/back/src/forms/resolvers/forms/stateSummary.ts +++ b/back/src/forms/resolvers/forms/stateSummary.ts @@ -92,6 +92,10 @@ export function getStateSummary(form: Form) { ? form.temporaryStorageDetail?.wasteDetails?.onuCode : form.wasteDetails?.onuCode; + const nonRoadRegulationMention = isResealed + ? form.temporaryStorageDetail?.wasteDetails?.nonRoadRegulationMention + : form.wasteDetails?.nonRoadRegulationMention; + const packagingInfos = (isResealed ? form.temporaryStorageDetail?.wasteDetails?.packagingInfos @@ -123,6 +127,7 @@ export function getStateSummary(form: Form) { packagingInfos, packagings: packagingInfos.map(pi => pi.type), onuCode, + nonRoadRegulationMention, ...transporter, recipient, emitter, diff --git a/back/src/forms/resolvers/mutations/__tests__/createForm.integration.ts b/back/src/forms/resolvers/mutations/__tests__/createForm.integration.ts index 0cade96434..84dc3e9580 100644 --- a/back/src/forms/resolvers/mutations/__tests__/createForm.integration.ts +++ b/back/src/forms/resolvers/mutations/__tests__/createForm.integration.ts @@ -105,6 +105,8 @@ const CREATE_FORM = ` quantity } isDangerous + onuCode + nonRoadRegulationMention parcelNumbers { city postalCode @@ -2192,6 +2194,63 @@ describe("Mutation.createForm", () => { ]); }); + it("should allow to create a form with a nonRoadRegulationMention", async () => { + // Given + const { user, company } = await userWithCompanyFactory("MEMBER"); + const transporter = await companyFactory(); + + // When + const { mutate } = makeClient(user); + const { data, errors } = await mutate< + Pick, + MutationCreateFormArgs + >(CREATE_FORM, { + variables: { + createFormInput: { + emitter: { + company: { siret: company.siret } + }, + wasteDetails: { + nonRoadRegulationMention: "Non road regulation mention" + }, + transporter: { company: { siret: transporter.siret } } + } + } + }); + + // Then + expect(errors).toBeUndefined(); + expect(data.createForm.wasteDetails?.nonRoadRegulationMention).toEqual( + "Non road regulation mention" + ); + }); + + it("nonRoadRegulationMention is not required", async () => { + // Given + const { user, company } = await userWithCompanyFactory("MEMBER"); + const transporter = await companyFactory(); + + // When + const { mutate } = makeClient(user); + const { data, errors } = await mutate< + Pick, + MutationCreateFormArgs + >(CREATE_FORM, { + variables: { + createFormInput: { + emitter: { + company: { siret: company.siret } + }, + transporter: { company: { siret: transporter.siret } } + } + } + }); + + // Then + expect(errors).toBeUndefined(); + expect(data.createForm.wasteDetails?.nonRoadRegulationMention).toBeNull(); + }); + describe("Annexe 1", () => { it("should create an APPENDIX1_PRODUCER form", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); diff --git a/back/src/forms/resolvers/mutations/__tests__/duplicateForm.integration.ts b/back/src/forms/resolvers/mutations/__tests__/duplicateForm.integration.ts index 8e41852067..92ca76ce97 100644 --- a/back/src/forms/resolvers/mutations/__tests__/duplicateForm.integration.ts +++ b/back/src/forms/resolvers/mutations/__tests__/duplicateForm.integration.ts @@ -295,6 +295,7 @@ describe("Mutation.duplicateForm", () => { "citerneNotWashedOutReason", "hasCiterneBeenWashedOut", "emptyReturnADR", + "wasteDetailsNonRoadRegulationMention", "wasteDetailsOnuCode" ]; @@ -558,6 +559,7 @@ describe("Mutation.duplicateForm", () => { "wasteDetailsQuantity", "wasteDetailsQuantityType", "wasteDetailsSampleNumber", + "wasteDetailsNonRoadRegulationMention", "emittedBy", "emittedAt", "emittedByEcoOrganisme", diff --git a/back/src/forms/resolvers/mutations/__tests__/mutations.ts b/back/src/forms/resolvers/mutations/__tests__/mutations.ts index 19c6414d3e..6aa5eb039f 100644 --- a/back/src/forms/resolvers/mutations/__tests__/mutations.ts +++ b/back/src/forms/resolvers/mutations/__tests__/mutations.ts @@ -33,6 +33,9 @@ export const SIGN_EMISSION_FORM = ` emittedAt emittedBy } + wasteDetails { + nonRoadRegulationMention + } } } `; diff --git a/back/src/forms/resolvers/mutations/__tests__/signEmissionForm.integration.ts b/back/src/forms/resolvers/mutations/__tests__/signEmissionForm.integration.ts index 638f7f0a12..874732480d 100644 --- a/back/src/forms/resolvers/mutations/__tests__/signEmissionForm.integration.ts +++ b/back/src/forms/resolvers/mutations/__tests__/signEmissionForm.integration.ts @@ -679,4 +679,42 @@ describe("signEmissionForm", () => { "Le nombre de contenants doit être supérieur à 0" ); }); + + it("can still modify nonRoadRegulationMention", async () => { + const emitter = await userWithCompanyFactory("ADMIN"); + const form = await formFactory({ + ownerId: emitter.user.id, + opt: { + status: "SEALED", + signedByTransporter: null, + sentAt: null, + sentBy: null, + emitterCompanySiret: emitter.company.siret, + emitterCompanyName: emitter.company.name, + wasteDetailsNonRoadRegulationMention: "mention A" + } + }); + const emittedAt = new Date("2018-12-11T00:00:00.000Z"); + + const { mutate } = makeClient(emitter.user); + const { errors, data } = await mutate< + Pick, + MutationSignEmissionFormArgs + >(SIGN_EMISSION_FORM, { + variables: { + id: form.id, + input: { + nonRoadRegulationMention: "mention B", + emittedAt: emittedAt.toISOString() as unknown as Date, + emittedBy: emitter.user.name, + quantity: 1 + } + } + }); + + expect(errors).toBeUndefined(); + expect( + data.signEmissionForm.wasteDetails?.nonRoadRegulationMention + ).toEqual("mention B"); + }); }); diff --git a/back/src/forms/resolvers/mutations/markAsResealed.ts b/back/src/forms/resolvers/mutations/markAsResealed.ts index 558f98c404..53c436b378 100644 --- a/back/src/forms/resolvers/mutations/markAsResealed.ts +++ b/back/src/forms/resolvers/mutations/markAsResealed.ts @@ -76,6 +76,8 @@ const markAsResealed: MutationResolvers["markAsResealed"] = async ( wasteDetailsIsDangerous: form.wasteDetailsIsDangerous, wasteDetailsName: form.wasteDetailsName, wasteDetailsOnuCode: form.wasteDetailsOnuCode, + wasteDetailsNonRoadRegulationMention: + form.wasteDetailsNonRoadRegulationMention, wasteDetailsPop: form.wasteDetailsPop, wasteDetailsQuantityType: QuantityType.REAL, wasteDetailsQuantity: diff --git a/back/src/forms/resolvers/mutations/markAsResent.ts b/back/src/forms/resolvers/mutations/markAsResent.ts index d1315abdf3..1d8037f02b 100644 --- a/back/src/forms/resolvers/mutations/markAsResent.ts +++ b/back/src/forms/resolvers/mutations/markAsResent.ts @@ -53,6 +53,8 @@ const markAsResentResolver: MutationResolvers["markAsResent"] = async ( wasteDetailsIsDangerous: form.wasteDetailsIsDangerous, wasteDetailsName: form.wasteDetailsName, wasteDetailsOnuCode: form.wasteDetailsOnuCode, + wasteDetailsNonRoadRegulationMention: + form.wasteDetailsNonRoadRegulationMention, wasteDetailsPop: form.wasteDetailsPop, ...flattenFormInput({ wasteDetails, recipient: destination }) }; diff --git a/back/src/forms/resolvers/mutations/markAsTempStored.ts b/back/src/forms/resolvers/mutations/markAsTempStored.ts index 73c113f74a..2c2804f379 100644 --- a/back/src/forms/resolvers/mutations/markAsTempStored.ts +++ b/back/src/forms/resolvers/mutations/markAsTempStored.ts @@ -63,6 +63,8 @@ const markAsTempStoredResolver: MutationResolvers["markAsTempStored"] = async ( tmpStoredInfos.quantityReceived, wasteDetailsQuantityType: quantityType, wasteDetailsOnuCode: form.wasteDetailsOnuCode, + wasteDetailsNonRoadRegulationMention: + form.wasteDetailsNonRoadRegulationMention, wasteDetailsPackagingInfos: prismaJsonNoNull( form.wasteDetailsPackagingInfos ) diff --git a/back/src/forms/resolvers/mutations/markAsTempStorerAccepted.ts b/back/src/forms/resolvers/mutations/markAsTempStorerAccepted.ts index 67efb90da6..e781e3611e 100644 --- a/back/src/forms/resolvers/mutations/markAsTempStorerAccepted.ts +++ b/back/src/forms/resolvers/mutations/markAsTempStorerAccepted.ts @@ -43,6 +43,8 @@ const markAsTempStorerAcceptedResolver: MutationResolvers["markAsTempStorerAccep tmpStorerAcceptedInfo.quantityReceived, wasteDetailsQuantityType: quantityType, wasteDetailsOnuCode: form.wasteDetailsOnuCode, + wasteDetailsNonRoadRegulationMention: + form.wasteDetailsNonRoadRegulationMention, wasteDetailsPackagingInfos: prismaJsonNoNull( form.wasteDetailsPackagingInfos ) diff --git a/back/src/forms/resolvers/mutations/signEmissionForm.ts b/back/src/forms/resolvers/mutations/signEmissionForm.ts index 0e8f53dba6..317b8af1e1 100644 --- a/back/src/forms/resolvers/mutations/signEmissionForm.ts +++ b/back/src/forms/resolvers/mutations/signEmissionForm.ts @@ -75,6 +75,9 @@ const signatures: Partial< args.input.quantity ?? existingForm.wasteDetailsQuantity, wasteDetailsOnuCode: args.input.onuCode ?? existingForm.wasteDetailsOnuCode, + wasteDetailsNonRoadRegulationMention: + args.input.nonRoadRegulationMention ?? + existingForm.wasteDetailsNonRoadRegulationMention, emittedAt: args.input.emittedAt, emittedBy: args.input.emittedBy, emittedByEcoOrganisme: args.input.emittedByEcoOrganisme ?? false, @@ -146,6 +149,9 @@ const signatures: Partial< args.input.onuCode ?? existingFullForm.forwardedIn?.wasteDetailsOnuCode ?? existingFullForm.wasteDetailsOnuCode, + wasteDetailsNonRoadRegulationMention: + existingFullForm.forwardedIn?.wasteDetailsNonRoadRegulationMention ?? + existingFullForm.wasteDetailsNonRoadRegulationMention, emittedAt: args.input.emittedAt, emittedBy: args.input.emittedBy }; diff --git a/back/src/forms/resolvers/mutations/signedByTransporter.ts b/back/src/forms/resolvers/mutations/signedByTransporter.ts index ea24b1d96e..1e0ca689d7 100644 --- a/back/src/forms/resolvers/mutations/signedByTransporter.ts +++ b/back/src/forms/resolvers/mutations/signedByTransporter.ts @@ -78,7 +78,9 @@ const signedByTransporterResolver: MutationResolvers["signedByTransporter"] = wasteDetailsQuantity: infos.quantity ? new Decimal(infos.quantity) : form.wasteDetailsQuantity, - wasteDetailsOnuCode: infos.onuCode ?? form.wasteDetailsOnuCode + wasteDetailsOnuCode: infos.onuCode ?? form.wasteDetailsOnuCode, + wasteDetailsNonRoadRegulationMention: + form.wasteDetailsNonRoadRegulationMention }; const receiptFields = await getFormReceiptField(transporter); diff --git a/back/src/forms/typeDefs/bsdd.inputs.graphql b/back/src/forms/typeDefs/bsdd.inputs.graphql index e0dc52e942..c96e99dbe7 100644 --- a/back/src/forms/typeDefs/bsdd.inputs.graphql +++ b/back/src/forms/typeDefs/bsdd.inputs.graphql @@ -9,9 +9,12 @@ input SignEmissionFormInput { """ quantity: Float! - "Code ONU" + "Mention au titre du règlement ADR" onuCode: String + "Mention au titre des règlements RID, ADNR, IMDG (optionnel)" + nonRoadRegulationMention: String + "Numéro de la plaque d'immatriculation transporteur" transporterNumberPlate: String @@ -72,7 +75,7 @@ input TransporterSignatureFormInput { """ quantity: Float! - "Code ONU" + "Mention au titre du règlement ADR" onuCode: String } @@ -619,9 +622,12 @@ input WasteDetailsInput { "Dénomination usuelle. Obligatoire" name: String - "Code ONU. Obligatoire pour les déchets dangereux. Merci d'indiquer 'non soumis' si nécessaire." + "Mention au titre du règlement ADR. Obligatoire pour les déchets dangereux. Merci d'indiquer 'non soumis' si nécessaire." onuCode: String + "Mention au titre des règlements RID, ADNR, IMDG (optionnel)" + nonRoadRegulationMention: String + "Liste de conditionnements. Les conditionnements CITERNE et BENNE ne peuvent pas être associés à un autre conditionnement" packagingInfos: [PackagingInfoInput!] @@ -700,9 +706,12 @@ input ParcelNumberInput { Payload lié au reconditionnement (case 15 à 17) """ input WasteDetailsRepackagingInput { - "Code ONU" + "Mention au titre du règlement ADR" onuCode: String + "Mention au titre des règlements RID, ADNR, IMDG (optionnel)" + wasteDetailsNonRoadRegulationMention: String + "Conditionnements" packagingInfos: [PackagingInfoInput!] @@ -798,9 +807,12 @@ input TempStoredFormInput { Payload lié au reconditionnement (case 15 à 17) """ input WasteDetailsRepackagingInput { - "Code ONU" + "Mention au titre du règlement ADR" onuCode: String + "Mention au titre des règlements RID, ADNR, IMDG (optionnel)" + wasteDetailsNonRoadRegulationMention: String + "Conditionnements" packagingInfos: [PackagingInfoInput!] diff --git a/back/src/forms/typeDefs/bsdd.objects.graphql b/back/src/forms/typeDefs/bsdd.objects.graphql index 13e7c8cb4b..314c20be38 100644 --- a/back/src/forms/typeDefs/bsdd.objects.graphql +++ b/back/src/forms/typeDefs/bsdd.objects.graphql @@ -289,9 +289,12 @@ type StateSummary { "Packaging le plus à jour" packagingInfos: [PackagingInfo!]! - "Code ONU le plus à jour" + "Mention au titre du règlement ADR la plus à jour" onuCode: String + "Mention au titre des règlements RID, ADNR, IMDG (optionnel)" + nonRoadRegulationMention: String + "Prochaine entreprise à transporter le déchet (entreprise en case 8 ou 18)" transporter: FormCompany @@ -517,9 +520,12 @@ type WasteDetails { "Dénomination usuelle" name: String - "Code ONU" + "Mention au titre du règlement ADR" onuCode: String + "Mention au titre des règlements RID, ADNR, IMDG (optionnel)" + nonRoadRegulationMention: String + "Conditionnements" packagingInfos: [PackagingInfo!] diff --git a/back/src/forms/types.ts b/back/src/forms/types.ts index 41ccdf667e..cde614e49d 100644 --- a/back/src/forms/types.ts +++ b/back/src/forms/types.ts @@ -168,6 +168,7 @@ export type Bsdd = { wasteCode: string | null; wasteDescription: string | null; wasteAdr: string | null; + nonRoadRegulationMention: string | null; wasteIsDangerous: boolean; weightValue: number | null; weightIsEstimate: boolean | null; diff --git a/back/src/forms/validation.ts b/back/src/forms/validation.ts index 635694010e..c2348de954 100644 --- a/back/src/forms/validation.ts +++ b/back/src/forms/validation.ts @@ -820,6 +820,7 @@ const baseWasteDetailsSchemaFn: FactorySchemaOf< ), otherwise: () => yup.string().nullable() }), + wasteDetailsNonRoadRegulationMention: yup.string().nullable(), wasteDetailsParcelNumbers: yup.array().of(parcelInfos as any), wasteDetailsAnalysisReferences: yup.array().of(yup.string()) as any, wasteDetailsLandIdentifiers: yup.array().of(yup.string()) as any, diff --git a/back/src/registry/columns.ts b/back/src/registry/columns.ts index 06a7d8be79..146c067985 100644 --- a/back/src/registry/columns.ts +++ b/back/src/registry/columns.ts @@ -304,7 +304,8 @@ export const columns: Column[] = [ }, { field: "transporterCompanyMail", label: "Transporteur contact" }, - { field: "wasteAdr", label: "ADR" }, + { field: "wasteAdr", label: "Mention ADR" }, + { field: "nonRoadRegulationMention", label: "Mention RID, ADNR, IMDG" }, // Destination du déchet { field: "destinationCap", label: "CAP" }, { field: "destinationCompanyName", label: "Destination raison sociale" }, diff --git a/back/src/registry/typeDefs/registry.objects.graphql b/back/src/registry/typeDefs/registry.objects.graphql index 5bafdb35fa..db700f333c 100644 --- a/back/src/registry/typeDefs/registry.objects.graphql +++ b/back/src/registry/typeDefs/registry.objects.graphql @@ -348,6 +348,11 @@ type IncomingWaste { """ wasteAdr: String + """ + Mention au titre des règlements RID, ADNR, IMDG + """ + nonRoadRegulationMention: String + """ Extra - Certains déchets avec un code déchet sans astérisque peuvent, selon les cas, être dangereux ou non dangereux. """ @@ -746,6 +751,11 @@ type OutgoingWaste { """ wasteAdr: String + """ + Mention au titre des règlements RID, ADNR, IMDG + """ + nonRoadRegulationMention: String + """ Extra - Certains déchets avec un code déchet sans astérisque peuvent, selon les cas, être dangereux ou non dangereux. """ @@ -936,6 +946,11 @@ type TransportedWaste { """ wasteAdr: String + """ + Mention au titre des règlements RID, ADNR, IMDG + """ + nonRoadRegulationMention: String + ################################################### # d) Concernant l'origine et la gestion du déchet : ################################################### @@ -1449,6 +1464,11 @@ type ManagedWaste { """ wasteAdr: String + """ + Mention au titre des règlements RID, ADNR, IMDG + """ + nonRoadRegulationMention: String + """ Extra - Certains déchets avec un code déchet sans astérisque peuvent, selon les cas, être dangereux ou non dangereux. """ @@ -1718,6 +1738,11 @@ type AllWaste { """ wasteAdr: String + """ + Mention au titre des règlements RID, ADNR, IMDG + """ + nonRoadRegulationMention: String + """ Certains déchets avec un code déchet sans astérisque peuvent, selon les cas, être dangereux ou non dangereux. """ diff --git a/back/src/registry/types.ts b/back/src/registry/types.ts index 10aff87fb0..b41dbadb7e 100644 --- a/back/src/registry/types.ts +++ b/back/src/registry/types.ts @@ -181,7 +181,8 @@ export const emptyIncomingWaste: Required = { emitterCompanyCity: null, emitterCompanyCountry: null, emitterCompanyPostalCode: null, - destinationHasCiterneBeenWashedOut: null + destinationHasCiterneBeenWashedOut: null, + nonRoadRegulationMention: null }; export const emptyOutgoingWaste: Required = { @@ -324,7 +325,8 @@ export const emptyOutgoingWaste: Required = { emitterCompanyCity: null, emitterCompanyCountry: null, emitterCompanyPostalCode: null, - destinationHasCiterneBeenWashedOut: null + destinationHasCiterneBeenWashedOut: null, + nonRoadRegulationMention: null }; export const emptyTransportedWaste: Required = { @@ -452,7 +454,8 @@ export const emptyTransportedWaste: Required = { emitterCompanyCity: null, emitterCompanyCountry: null, emitterCompanyPostalCode: null, - destinationHasCiterneBeenWashedOut: null + destinationHasCiterneBeenWashedOut: null, + nonRoadRegulationMention: null }; export const emptyManagedWaste: Required = { @@ -576,7 +579,8 @@ export const emptyManagedWaste: Required = { destinationReceptionAcceptedWeight: null, destinationReceptionRefusedWeight: null, weight: null, - destinationHasCiterneBeenWashedOut: null + destinationHasCiterneBeenWashedOut: null, + nonRoadRegulationMention: null }; export const emptyAllWaste: Required = { @@ -737,5 +741,6 @@ export const emptyAllWaste: Required = { emitterCompanyCity: null, emitterCompanyCountry: null, emitterCompanyPostalCode: null, - destinationHasCiterneBeenWashedOut: null + destinationHasCiterneBeenWashedOut: null, + nonRoadRegulationMention: null }; diff --git a/front/src/Apps/Dashboard/Validation/BSDD/FormWasteSummary.tsx b/front/src/Apps/Dashboard/Validation/BSDD/FormWasteSummary.tsx index 2a3e9ac82e..e81e6732fe 100644 --- a/front/src/Apps/Dashboard/Validation/BSDD/FormWasteSummary.tsx +++ b/front/src/Apps/Dashboard/Validation/BSDD/FormWasteSummary.tsx @@ -49,7 +49,7 @@ export function FormWasteSummary({ form }: FormWasteSummaryProps) { - Code ADR (ONU) + Mention ADR {form.wasteDetails?.onuCode ?? "Non soumis"} diff --git a/front/src/Apps/common/queries/fragments/bsdd.ts b/front/src/Apps/common/queries/fragments/bsdd.ts index dedbf988f3..b9015a684c 100644 --- a/front/src/Apps/common/queries/fragments/bsdd.ts +++ b/front/src/Apps/common/queries/fragments/bsdd.ts @@ -67,6 +67,7 @@ export const wasteDetailsFragment = gql` code name onuCode + nonRoadRegulationMention packagingInfos { type other @@ -136,6 +137,7 @@ export const temporaryStorageDetailFragment = gql` } wasteDetails { onuCode + nonRoadRegulationMention packagingInfos { type other @@ -165,6 +167,7 @@ export const staticFieldsFragment = gql` quantity } onuCode + nonRoadRegulationMention quantity transporterNumberPlate transporterCustomInfo diff --git a/front/src/dashboard/components/BSDList/BSDD/WorkflowAction/FormWasteEmissionSummary.tsx b/front/src/dashboard/components/BSDList/BSDD/WorkflowAction/FormWasteEmissionSummary.tsx index 11339ce1d5..33c2ad0edb 100644 --- a/front/src/dashboard/components/BSDList/BSDD/WorkflowAction/FormWasteEmissionSummary.tsx +++ b/front/src/dashboard/components/BSDList/BSDD/WorkflowAction/FormWasteEmissionSummary.tsx @@ -38,7 +38,7 @@ const EDITABLE_FIELDS: Record JSX.Element> = { onuCode: () => (

    @@ -121,7 +121,7 @@ export function FormWasteEmissionSummary({ {form.emitter?.type !== EmitterType.Appendix1Producer && ( - Code ADR (ONU) + Mention ADR {values.onuCode ?? "Non soumis"}
    -
    Code onu
    +
    Mention ADR
    {form?.stateSummary?.onuCode}
    +
    Mention RID, ADNR, IMDG
    +
    {form?.stateSummary?.nonRoadRegulationMention}
    POP
    {form.wasteDetails?.pop ? "Oui" : "Non"}
    {form?.wasteDetails?.sampleNumber && ( <> diff --git a/front/src/form/bsdd/WasteInfo.tsx b/front/src/form/bsdd/WasteInfo.tsx index 39a488b561..a01bb769d1 100644 --- a/front/src/form/bsdd/WasteInfo.tsx +++ b/front/src/form/bsdd/WasteInfo.tsx @@ -277,7 +277,7 @@ export default connect<{ disabled }, Values>(function WasteInfo({
    +
    + + + +
    + {SOIL_CODES.includes(values.wasteDetails.code) || values.wasteDetails.parcelNumbers?.length || values.wasteDetails.landIdentifiers?.length || diff --git a/libs/back/prisma/src/migrations/20241024141206_add_non_adr_mention_field/migration.sql b/libs/back/prisma/src/migrations/20241024141206_add_non_adr_mention_field/migration.sql new file mode 100644 index 0000000000..59dee6ca3d --- /dev/null +++ b/libs/back/prisma/src/migrations/20241024141206_add_non_adr_mention_field/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Form" ADD COLUMN "wasteDetailsNonRoadRegulationMention" TEXT; diff --git a/libs/back/prisma/src/schema.prisma b/libs/back/prisma/src/schema.prisma index be80eb70aa..3e0ca18051 100644 --- a/libs/back/prisma/src/schema.prisma +++ b/libs/back/prisma/src/schema.prisma @@ -480,6 +480,7 @@ model Form { wasteDetailsCode String? wasteDetailsName String? wasteDetailsOnuCode String? + wasteDetailsNonRoadRegulationMention String? wasteDetailsQuantity Decimal? @db.Decimal(65, 30) wasteDetailsQuantityType QuantityType? wasteDetailsConsistence Consistence? From 3df8d713fae0fbcaf2500a75057b332aacdd5afb Mon Sep 17 00:00:00 2001 From: Riron Date: Fri, 8 Nov 2024 10:00:33 +0100 Subject: [PATCH 13/74] =?UTF-8?q?Registry=20-=20Am=C3=A9lioration=20de=20s?= =?UTF-8?q?ch=C3=A9ma=20(#3736)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Enhance schemas & fix update * Fix incomingWaste persistence --- .../registry/src/incomingWaste/database.ts | 10 +- libs/back/registry/src/shared/schemas.ts | 93 +++++++++------- libs/back/registry/src/ssd/database.ts | 6 +- .../registry/src/ssd/validation/schema.ts | 101 ++++++++++++------ libs/back/registry/src/transformers.ts | 25 +++-- 5 files changed, 150 insertions(+), 85 deletions(-) diff --git a/libs/back/registry/src/incomingWaste/database.ts b/libs/back/registry/src/incomingWaste/database.ts index 667d1198c4..d1cb6ff330 100644 --- a/libs/back/registry/src/incomingWaste/database.ts +++ b/libs/back/registry/src/incomingWaste/database.ts @@ -8,12 +8,12 @@ export async function saveIncomingWasteLine({ line: ParsedZodIncomingWasteItem & { createdById: string }; importId: string | null; }) { - const { reason, ...persistedData } = line; + const { reason, id, ...persistedData } = line; switch (line.reason) { case "MODIFIER": await prisma.$transaction(async tx => { - await tx.registryIncomingWaste.updateMany({ - where: { publicId: line.publicId }, + await tx.registryIncomingWaste.update({ + where: { id }, data: { isActive: false } }); await tx.registryIncomingWaste.create({ @@ -22,8 +22,8 @@ export async function saveIncomingWasteLine({ }); return; case "ANNULER": - await prisma.registryIncomingWaste.updateMany({ - where: { publicId: line.publicId }, + await prisma.registryIncomingWaste.update({ + where: { id }, data: { isCancelled: true } }); return; diff --git a/libs/back/registry/src/shared/schemas.ts b/libs/back/registry/src/shared/schemas.ts index c69691a648..663745c99b 100644 --- a/libs/back/registry/src/shared/schemas.ts +++ b/libs/back/registry/src/shared/schemas.ts @@ -29,23 +29,31 @@ export const publicIdSchema = z invalid_type_error: "Le numéro unique doit être une chaîne de caractères" }) .min(1, "Le numéro unique doit faire au moins 2 caractères") - .max(36, "Le numéro unique ne peut pas dépasser 36 charactères") + .max(36, "Le numéro unique ne peut pas dépasser 36 caractères") .refine(val => /^[a-zA-Z0-9-_./]+$/.test(val), { message: "Le numéro unique ne peut contenir que des lettres, des chiffres, des tirets, des underscores et des points" }); -export const reportAsSiretSchema = z.coerce - .string({ - invalid_type_error: - "Le SIRET du déclarant doit être une chaîne de caractères" - }) - .min(14, "Le SIRET du déclarant ne doit pas faire moins de 14 chiffres") - .max(14, "Le SIRET du déclarant ne doit pas faire plus de 14 chiffres") - .refine(value => { - return isSiret(value); - }, "Le SIRET du déclarant n'est pas un SIRET valide") - .optional(); +export const reportAsSiretSchema = z + .union([ + z.string().optional(), + z + .number() + .optional() + .transform(val => (val ? String(val) : undefined)) + ]) + .pipe( + z + .string({ + invalid_type_error: + "Le SIRET du déclarant doit être une chaîne de caractères" + }) + .refine(value => { + return isSiret(value); + }, "Le SIRET du déclarant n'est pas un SIRET valide") + .optional() + ); export const wasteCodeSchema = z.nativeEnum(BSDD_WASTE_CODES_ENUM, { required_error: "Le code déchet est requis", @@ -55,10 +63,10 @@ export const wasteCodeSchema = z.nativeEnum(BSDD_WASTE_CODES_ENUM, { export const wasteDescriptionSchema = z .string() - .min(2, "La dénomination usuelle du déchet doit faire au moins 2 charactères") + .min(2, "La dénomination usuelle du déchet doit faire au moins 2 caractères") .max( 150, - "La dénomination usuelle du déchet ne peut pas dépasser 150 charactères" + "La dénomination usuelle du déchet ne peut pas dépasser 150 caractères" ); export const wasteCodeBaleSchema = z.enum(WASTE_CODES_BALE).optional(); @@ -97,15 +105,21 @@ export const weightIsEstimateSchema = z.union( { invalid_type_error: "Le type de poids saisi n'est pas valide" } ); -export const volumeSchema = z.coerce - .number({ - required_error: "La quantité est requise", - invalid_type_error: "La quantité doit être un nombre" - }) - .min(0, "La quantité ne peut pas être inférieure à 0") - .max(100_000_000, "La quantité ne peut pas dépasser 100 000 000") - .multipleOf(0.001, "La quantité ne doit pas avoir plus de 3 décimales") - .optional(); +export const volumeSchema = z + .string() + .optional() + .transform(val => (val ? Number(val) : undefined)) + .pipe( + z + .number({ + required_error: "La quantité est requise", + invalid_type_error: "La quantité doit être un nombre" + }) + .min(0, "La quantité ne peut pas être inférieure à 0") + .max(100_000_000, "La quantité ne peut pas dépasser 100 000 000") + .multipleOf(0.001, "La quantité ne doit pas avoir plus de 3 décimales") + .optional() + ); export const getActorTypeSchema = (name: string) => z.enum( @@ -118,15 +132,22 @@ export const getActorTypeSchema = (name: string) => export const getActorOrgIdSchema = (name: string) => z - .string() - .min(1, `Le numéro d'identification ${name} doit faire plus d'1 charactère`) - .max( - 27, - `Le numéro d'identification ${name} ne peut pas dépasser 27 charactères` + .union([z.string(), z.number().transform(val => String(val))]) + .pipe( + z + .string() + .min( + 1, + `Le numéro d'identification ${name} doit faire plus d'1 caractère` + ) + .max( + 27, + `Le numéro d'identification ${name} ne peut pas dépasser 27 caractères` + ) ); export const getActorSiretSchema = (name: string) => - z.coerce + z .string({ invalid_type_error: `Le SIRET ${name} doit être une chaîne de caractères` }) @@ -140,19 +161,19 @@ export const getActorSiretSchema = (name: string) => export const getActorNameSchema = (name: string) => z .string() - .min(2, `Le nom ${name} ne peut pas faire moins de 2 charactères`) - .max(150, `Le nom ${name} ne peut pas dépasser 150 charactères`); + .min(2, `Le nom ${name} ne peut pas faire moins de 2 caractères`) + .max(150, `Le nom ${name} ne peut pas dépasser 150 caractères`); export const getActorAddressSchema = (name: string) => z .string() .min( 2, - `Le libellé de la commune ${name} ne peut pas faire moins de 2 charactères` + `Le libellé de la commune ${name} ne peut pas faire moins de 2 caractères` ) .max( 150, - `Le libellé de la commune ${name} ne peut pas dépasser 150 charactères` + `Le libellé de la commune ${name} ne peut pas dépasser 150 caractères` ); export const getActorCitySchema = (name: string) => @@ -160,15 +181,15 @@ export const getActorCitySchema = (name: string) => .string() .min( 2, - `Le libellé de la commune ${name} ne peut pas faire moins de 2 charactères` + `Le libellé de la commune ${name} ne peut pas faire moins de 2 caractères` ) .max( 45, - `Le libellé de la commune ${name} ne peut pas dépasser 45 charactères` + `Le libellé de la commune ${name} ne peut pas dépasser 45 caractères` ); export const getActorPostalCodeSchema = (name: string) => - z.string().refine(val => { + z.coerce.string().refine(val => { if (!val) return true; return /^[0-9]{5,6}$/.test(val); }, `Le code postal ${name} n'est pas valide. Il doit être composé de 5 ou 6 chiffres`); diff --git a/libs/back/registry/src/ssd/database.ts b/libs/back/registry/src/ssd/database.ts index 510d87be45..01758ef573 100644 --- a/libs/back/registry/src/ssd/database.ts +++ b/libs/back/registry/src/ssd/database.ts @@ -8,12 +8,12 @@ export async function saveSsdLine({ line: ParsedZodSsdItem & { createdById: string }; importId: string | null; }) { - const { reason, ...persistedData } = line; + const { reason, id, ...persistedData } = line; switch (line.reason) { case "MODIFIER": await prisma.$transaction(async tx => { await tx.registrySsd.update({ - where: { id: line.id }, + where: { id }, data: { isActive: false } }); await tx.registrySsd.create({ data: { ...persistedData, importId } }); @@ -21,7 +21,7 @@ export async function saveSsdLine({ return; case "ANNULER": await prisma.registrySsd.update({ - where: { id: line.id }, + where: { id }, data: { isCancelled: true } }); return; diff --git a/libs/back/registry/src/ssd/validation/schema.ts b/libs/back/registry/src/ssd/validation/schema.ts index ed988f5a06..d36390fe22 100644 --- a/libs/back/registry/src/ssd/validation/schema.ts +++ b/libs/back/registry/src/ssd/validation/schema.ts @@ -33,27 +33,49 @@ const inputSsdSchema = z.object({ invalid_type_error: "Le SIRET de l'émetteur doit être une chaîne de caractères" }) - .min(14, "Le SIRET de l'émetteur ne doit pas faire moins de 14 chiffres") - .max(14, "Le SIRET de l'émetteur ne doit pas faire plus de 14 chiffres") .refine(value => { return isSiret(value); }, "Le SIRET de l'émetteur n'est pas un SIRET valide"), - useDate: z.coerce - .date() - .min( - sub(new Date(), { years: 1 }), - "La date d'utilisation ne peut pas être antérieure à J-1an" - ) - .max(new Date(), "La date d'utilisation ne peut pas être dans le futur") - .optional(), - dispatchDate: z.coerce - .date() - .min( - sub(new Date(), { years: 1 }), - "La date d'utilisation ne peut pas être antérieure à J-1an" - ) - .max(new Date(), "La date d'utilisation ne peut pas être dans le futur") - .optional(), + useDate: z.union([ + z.date().optional(), + z + .string() + .optional() + .transform(val => (val ? new Date(val) : undefined)) + .pipe( + z + .date() + .min( + sub(new Date(), { years: 1 }), + "La date d'utilisation ne peut pas être antérieure à J-1an" + ) + .max( + new Date(), + "La date d'utilisation ne peut pas être dans le futur" + ) + .optional() + ) + ]), + dispatchDate: z.union([ + z.date().optional(), + z + .string() + .optional() + .transform(val => (val ? new Date(val) : undefined)) + .pipe( + z + .date() + .min( + sub(new Date(), { years: 1 }), + "La date d'utilisation ne peut pas être antérieure à J-1an" + ) + .max( + new Date(), + "La date d'utilisation ne peut pas être dans le futur" + ) + .optional() + ) + ]), wasteCode: wasteCodeSchema, wasteDescription: wasteDescriptionSchema, wasteCodeBale: wasteCodeBaleSchema, @@ -95,19 +117,19 @@ const inputSsdSchema = z.object({ .string() .min( 2, - "Les dénominations usuelles du déchet doivent faire au moins 2 charactères" + "Les dénominations usuelles du déchet doivent faire au moins 2 caractères" ) .max( 150, - "Les dénominations usuelles du déchet ne peuvent pas dépasser 150 charactères" + "Les dénominations usuelles du déchet ne peuvent pas dépasser 150 caractères" ) ) .optional() ), product: z .string() - .min(2, "Le produit doit faire au moins 2 charactères") - .max(75, "Le produit ne peut pas dépasser 75 charactères"), + .min(2, "Le produit doit faire au moins 2 caractères") + .max(75, "Le produit ne peut pas dépasser 75 caractères"), weightValue: weightValueSchema, weightIsEstimate: weightIsEstimateSchema, volume: volumeSchema, @@ -118,17 +140,26 @@ const inputSsdSchema = z.object({ "La date de traitement ne peut pas être antérieure à J-1 an" ) .max(new Date(), "La date de traitement ne peut pas être dans le futur"), - processingEndDate: z.coerce - .date() - .min( - sub(new Date(), { years: 1 }), - "La date de fin de traitement ne peut pas être antérieure à J-1an" - ) - .max( - new Date(), - "La date de fin de traitement ne peut pas être dans le futur" - ) - .optional(), + processingEndDate: z.union([ + z.date().optional(), + z + .string() + .optional() + .transform(val => (val ? new Date(val) : undefined)) + .pipe( + z + .date() + .min( + sub(new Date(), { years: 1 }), + "La date de fin de traitement ne peut pas être antérieure à J-1an" + ) + .max( + new Date(), + "La date de fin de traitement ne peut pas être dans le futur" + ) + .optional() + ) + ]), destinationType: getActorTypeSchema("de destinataire"), destinationOrgId: getActorOrgIdSchema("du destinataire"), destinationName: getActorNameSchema("du destinataire"), @@ -181,11 +212,11 @@ const inputSsdSchema = z.object({ .string() .min( 8, - "La référence d'acte administratif doit faire au moins 8 charactères" + "La référence d'acte administratif doit faire au moins 8 caractères" ) .max( 100, - "La référence d'acte administratif ne peut pas dépasser 100 charactères" + "La référence d'acte administratif ne peut pas dépasser 100 caractères" ) .refine( val => /^[a-zA-ZÀ-û0-9\s]+$/.test(val), diff --git a/libs/back/registry/src/transformers.ts b/libs/back/registry/src/transformers.ts index 45637858eb..43212b7387 100644 --- a/libs/back/registry/src/transformers.ts +++ b/libs/back/registry/src/transformers.ts @@ -64,19 +64,31 @@ export function getTransformCsvStream(options: ImportOptions) { export function getTransformXlsxStream(options: ImportOptions) { // Create an inputStream to feed the WorkbookReader const inputStream = new PassThrough(); - const workbookReader = new Excel.stream.xlsx.WorkbookReader(inputStream, {}); + const workbookReader = new Excel.stream.xlsx.WorkbookReader(inputStream, { + entries: "emit", + sharedStrings: "cache", + hyperlinks: "cache", + styles: "cache", + worksheets: "emit" + }); const createReader = async function* () { for await (const worksheetReader of workbookReader) { for await (const row of worksheetReader) { - if (row.number === 0) { + // In Excel, the first row is 1 + if (row.number === 1) { const headerLabels = Object.values(options.headers); headerLabels.forEach((label, index) => { - const cellValue = row.getCell(index).value; - if (cellValue !== label) { + const { + value, + col: colLabel, + row: rowLabel + } = row.getCell(index + 1); + + if (value !== label) { throw new Error( - `En-tête non valide à l'index ${index}. Attendu "${label}", reçu "${cellValue}"` + `En-tête non valide dans la cellule ${colLabel}:${rowLabel}. Attendu "${label}", reçu "${value}"` ); } }); @@ -87,7 +99,8 @@ export function getTransformXlsxStream(options: ImportOptions) { const rawLine = {}; const keys = Object.keys(options.headers); for (const [index, key] of keys.entries()) { - rawLine[key] = row.getCell(index + 1).value; + const { value } = row.getCell(index + 1); + rawLine[key] = value === null ? undefined : value; } const result = await options.safeParseAsync(rawLine); From 6a5a2f4e6b037055d6cfc25c839c631c356947e4 Mon Sep 17 00:00:00 2001 From: GaelFerrand <45355989+GaelFerrand@users.noreply.github.com> Date: Fri, 8 Nov 2024 10:56:58 +0100 Subject: [PATCH 14/74] =?UTF-8?q?[TRA-15423]=20Un=20interm=C3=A9diaire=20p?= =?UTF-8?q?eut=20cr=C3=A9er=20un=20BSDA=20(#3732)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- back/src/bsda/permissions.ts | 5 ++ .../mutations/__tests__/create.integration.ts | 60 +++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/back/src/bsda/permissions.ts b/back/src/bsda/permissions.ts index 9bb08dd886..8d31739daf 100644 --- a/back/src/bsda/permissions.ts +++ b/back/src/bsda/permissions.ts @@ -170,6 +170,10 @@ async function creators(input: BsdaInput) { } ]; } + + const intermediariesOrgIds = + input.intermediaries?.map(i => i.siret).filter(Boolean) ?? []; + return [ input.emitter?.company?.siret, input.ecoOrganisme?.siret, @@ -177,6 +181,7 @@ async function creators(input: BsdaInput) { t.transporterCompanySiret, t.transporterCompanyVatNumber ]), + ...intermediariesOrgIds, input.destination?.company?.siret, input.worker?.company?.siret, input.broker?.company?.siret, diff --git a/back/src/bsda/resolvers/mutations/__tests__/create.integration.ts b/back/src/bsda/resolvers/mutations/__tests__/create.integration.ts index a74add6d6d..21ccdf020f 100644 --- a/back/src/bsda/resolvers/mutations/__tests__/create.integration.ts +++ b/back/src/bsda/resolvers/mutations/__tests__/create.integration.ts @@ -1652,4 +1652,64 @@ describe("Mutation.Bsda.create", () => { expect(errors).toBeUndefined(); expect(data.createBsda.status).toBe("INITIAL"); }); + + it("should allow broker to create a bsda", async () => { + // Given + const { company: broker, user } = await userWithCompanyFactory("MEMBER"); + + const input: BsdaInput = { + type: "OTHER_COLLECTIONS", + broker: { + company: { + siret: broker.siret + } + } + }; + + // When + const { mutate } = makeClient(user); + const { errors } = await mutate>(CREATE_BSDA, { + variables: { + input + } + }); + + // Then + expect( + errors.some( + error => + error.message === + "Vous ne pouvez pas créer un bordereau sur lequel votre entreprise n'apparait pas" + ) + ).toBeFalsy(); + }); + + it("should allow intermediary to create a bsda", async () => { + // Given + const { company: intermediary, user } = await userWithCompanyFactory( + "MEMBER" + ); + + const input: BsdaInput = { + type: "OTHER_COLLECTIONS", + intermediaries: [{ siret: intermediary.siret }] + }; + + // When + const { mutate } = makeClient(user); + const { errors } = await mutate>(CREATE_BSDA, { + variables: { + input + } + }); + + // Then + expect( + errors.some( + error => + error.message === + "Vous ne pouvez pas créer un bordereau sur lequel votre entreprise n'apparait pas" + ) + ).toBeFalsy(); + }); }); From d24ff4faa42b433fea265dda79eda444fdb8fa18 Mon Sep 17 00:00:00 2001 From: GaelFerrand <45355989+GaelFerrand@users.noreply.github.com> Date: Fri, 8 Nov 2024 14:56:34 +0100 Subject: [PATCH 15/74] =?UTF-8?q?[TRA-14522]=20Ajout=20d'un=20switch=20dan?= =?UTF-8?q?s=20le=20fomulaire=20de=20cr=C3=A9ation=20de=20BSDD=20pour=20sp?= =?UTF-8?q?=C3=A9cifier=20si=20le=20d=C3=A9chet=20est=20soumis=20=C3=A0=20?= =?UTF-8?q?l'ADR=20ou=20non=20(#3717)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: added new field wasteDetailsIsSubjectToADR * feat: started implementing the front * feat: improved tests & legacy management * feat: displaying ADR mention on the front according to switch & legacy * fix: removed console.log * fix: fixing typing * fix: fixed clone method * fix: fixing types * fix: fixing tests * fix: fixed test * lint: formatting --- .../resolvers/mutations/utils/clone.utils.ts | 1 + .../__tests__/form-converter.integration.ts | 2 + .../forms/__tests__/form-converter.test.ts | 2 + back/src/forms/compat.ts | 3 +- back/src/forms/converter.ts | 6 + back/src/forms/edition.ts | 1 + back/src/forms/pdf/components/BsddPdf.tsx | 20 +- .../src/forms/resolvers/forms/stateSummary.ts | 5 + .../__tests__/createForm.integration.ts | 34 +++ .../__tests__/duplicateForm.integration.ts | 4 +- .../__tests__/markAsSealed.integration.ts | 247 ++++++++++++++++++ .../resolvers/mutations/markAsResealed.ts | 1 + back/src/forms/typeDefs/bsdd.inputs.graphql | 3 + back/src/forms/typeDefs/bsdd.objects.graphql | 6 + back/src/forms/validation.ts | 64 ++++- .../Validation/BSDD/FormWasteSummary.tsx | 3 +- .../src/Apps/common/queries/fragments/bsdd.ts | 2 + .../FormWasteEmissionSummary.tsx | 29 +- .../FormWasteTransportSummary.tsx | 7 +- .../detail/bsdd/BSDDetailContent.tsx | 10 +- front/src/form/bsdd/WasteInfo.tsx | 42 ++- front/src/form/bsdd/utils/initial-state.ts | 1 + front/src/form/bsdd/utils/schema.ts | 14 +- .../migration.sql | 2 + libs/back/prisma/src/schema.prisma | 1 + libs/shared/constants/src/adrHelpers.ts | 40 +++ libs/shared/constants/src/index.ts | 1 + 27 files changed, 491 insertions(+), 60 deletions(-) create mode 100644 libs/back/prisma/src/migrations/20241028161030_add_waste_details_is_subject_to_adr_field_form/migration.sql create mode 100644 libs/shared/constants/src/adrHelpers.ts diff --git a/back/src/bsds/resolvers/mutations/utils/clone.utils.ts b/back/src/bsds/resolvers/mutations/utils/clone.utils.ts index 88a4489014..d4ccd912e1 100644 --- a/back/src/bsds/resolvers/mutations/utils/clone.utils.ts +++ b/back/src/bsds/resolvers/mutations/utils/clone.utils.ts @@ -930,6 +930,7 @@ export const cloneBsdd = async ( wasteAcceptationStatus: bsdd.wasteAcceptationStatus, wasteDetailsAnalysisReferences: bsdd.wasteDetailsAnalysisReferences, wasteDetailsCode: bsdd.wasteDetailsCode, + wasteDetailsIsSubjectToADR: bsdd.wasteDetailsIsSubjectToADR, wasteDetailsConsistence: bsdd.wasteDetailsConsistence, wasteDetailsIsDangerous: bsdd.wasteDetailsIsDangerous, wasteDetailsLandIdentifiers: bsdd.wasteDetailsLandIdentifiers, diff --git a/back/src/forms/__tests__/form-converter.integration.ts b/back/src/forms/__tests__/form-converter.integration.ts index 37991b45a4..3788d1ee30 100644 --- a/back/src/forms/__tests__/form-converter.integration.ts +++ b/back/src/forms/__tests__/form-converter.integration.ts @@ -119,6 +119,7 @@ describe("expandFormFromDb", () => { wasteDetails: { code: form.wasteDetailsCode, name: form.wasteDetailsName, + isSubjectToADR: form.wasteDetailsIsSubjectToADR, onuCode: form.wasteDetailsOnuCode, nonRoadRegulationMention: form.wasteDetailsNonRoadRegulationMention, packagingInfos: form.wasteDetailsPackagingInfos, @@ -211,6 +212,7 @@ describe("expandFormFromDb", () => { wasteDetails: { code: forwardedIn!.wasteDetailsCode, name: forwardedIn!.wasteDetailsName, + isSubjectToADR: forwardedIn!.wasteDetailsIsSubjectToADR, onuCode: forwardedIn!.wasteDetailsOnuCode, nonRoadRegulationMention: forwardedIn!.wasteDetailsNonRoadRegulationMention, diff --git a/back/src/forms/__tests__/form-converter.test.ts b/back/src/forms/__tests__/form-converter.test.ts index 678b07cf37..8cd999a89d 100644 --- a/back/src/forms/__tests__/form-converter.test.ts +++ b/back/src/forms/__tests__/form-converter.test.ts @@ -140,6 +140,7 @@ describe("flattenFormInput", () => { recipientCompanyPhone: input.recipient!.company!.phone, recipientCompanyMail: input.recipient!.company!.mail, wasteDetailsCode: null, + wasteDetailsIsSubjectToADR: null, wasteDetailsName: null, wasteDetailsOnuCode: null, wasteDetailsNonRoadRegulationMention: null, @@ -170,6 +171,7 @@ describe("flattenFormInput", () => { wasteDetailsConsistence: null, wasteDetailsName: null, wasteDetailsOnuCode: null, + wasteDetailsIsSubjectToADR: null, wasteDetailsNonRoadRegulationMention: null, wasteDetailsPackagingInfos: Prisma.JsonNull, wasteDetailsPop: false, diff --git a/back/src/forms/compat.ts b/back/src/forms/compat.ts index 73e04e03ad..40980654d0 100644 --- a/back/src/forms/compat.ts +++ b/back/src/forms/compat.ts @@ -11,6 +11,7 @@ import { import { Bsdd } from "./types"; import { RegistryForm } from "../registry/elastic"; import { bsddWasteQuantities } from "./helpers/bsddWasteQuantities"; +import { getFormADRMention } from "@td/constants"; /** * Convert a simple form (without temporary storage) to a BSDD v2 @@ -90,7 +91,7 @@ export function simpleFormToBsdd( weightValue: form.wasteDetailsQuantity ? form.wasteDetailsQuantity.toNumber() : null, - wasteAdr: form.wasteDetailsOnuCode, + wasteAdr: getFormADRMention(form) ?? null, nonRoadRegulationMention: form.wasteDetailsNonRoadRegulationMention, weightIsEstimate: form.wasteDetailsQuantityType == QuantityType.ESTIMATED, transporterCompanyName: transporter?.transporterCompanyName, diff --git a/back/src/forms/converter.ts b/back/src/forms/converter.ts index 8282b5b0c2..5823d9ddb7 100644 --- a/back/src/forms/converter.ts +++ b/back/src/forms/converter.ts @@ -109,6 +109,10 @@ function flattenWasteDetailsInput(input: { }) { return { wasteDetailsCode: chain(input.wasteDetails, w => w.code), + wasteDetailsIsSubjectToADR: chain( + input.wasteDetails, + w => w.isSubjectToADR + ), wasteDetailsOnuCode: chain(input.wasteDetails, w => w.onuCode), wasteDetailsNonRoadRegulationMention: chain( input.wasteDetails, @@ -677,6 +681,7 @@ export function expandFormFromDb( wasteDetails: nullIfNoValues({ code: form.wasteDetailsCode, name: form.wasteDetailsName, + isSubjectToADR: form.wasteDetailsIsSubjectToADR, onuCode: form.wasteDetailsOnuCode, nonRoadRegulationMention: form.wasteDetailsNonRoadRegulationMention, packagingInfos: form.wasteDetailsPackagingInfos as PackagingInfo[], @@ -856,6 +861,7 @@ export function expandFormFromDb( wasteDetails: nullIfNoValues({ code: forwardedIn.wasteDetailsCode, name: forwardedIn.wasteDetailsName, + isSubjectToADR: forwardedIn.wasteDetailsIsSubjectToADR, onuCode: forwardedIn.wasteDetailsOnuCode, nonRoadRegulationMention: forwardedIn.wasteDetailsNonRoadRegulationMention, diff --git a/back/src/forms/edition.ts b/back/src/forms/edition.ts index 8ca15ba5ff..f62879432f 100644 --- a/back/src/forms/edition.ts +++ b/back/src/forms/edition.ts @@ -116,6 +116,7 @@ export const editionRules: { recipientCompanyMail: "EMISSION", wasteDetailsCode: "EMISSION", wasteDetailsOnuCode: "EMISSION", + wasteDetailsIsSubjectToADR: "EMISSION", wasteDetailsNonRoadRegulationMention: "EMISSION", wasteDetailsPackagingInfos: "EMISSION", wasteDetailsQuantity: "EMISSION", diff --git a/back/src/forms/pdf/components/BsddPdf.tsx b/back/src/forms/pdf/components/BsddPdf.tsx index 3d83e7d38c..8adbd6b22d 100644 --- a/back/src/forms/pdf/components/BsddPdf.tsx +++ b/back/src/forms/pdf/components/BsddPdf.tsx @@ -16,7 +16,11 @@ import { } from "../../../generated/graphql/types"; import { buildAddress } from "../../../companies/sirene/utils"; -import { isDangerous, packagingsEqual } from "@td/constants"; +import { + getFormWasteDetailsADRMention, + isDangerous, + packagingsEqual +} from "@td/constants"; import { CancelationStamp } from "../../../common/pdf/components/CancelationStamp"; import { getOperationModeLabel } from "../../../common/operationModes"; import { FormCompanyDetails } from "../../../common/pdf/components/FormCompanyDetails"; @@ -721,10 +725,10 @@ export function BsddPdf({ {isDefined(form.emptyReturnADR) ? ( <> {getEmptyReturnADRLabel(form.emptyReturnADR)?.toUpperCase()}:{" "} - {form.wasteDetails?.onuCode} + {getFormWasteDetailsADRMention(form.wasteDetails)} ) : ( - <>{form.wasteDetails?.onuCode} + <>{getFormWasteDetailsADRMention(form.wasteDetails)} )}

    @@ -1051,9 +1055,13 @@ export function BsddPdf({ échéant) :

    - {isRepackaging ? ( -

    {form.temporaryStorageDetail?.wasteDetails?.onuCode}

    - ) : null} + {isRepackaging && ( +

    + {getFormWasteDetailsADRMention( + form.temporaryStorageDetail?.wasteDetails + )} +

    + )}
    diff --git a/back/src/forms/resolvers/forms/stateSummary.ts b/back/src/forms/resolvers/forms/stateSummary.ts index 14a9f292fd..3406a55b95 100644 --- a/back/src/forms/resolvers/forms/stateSummary.ts +++ b/back/src/forms/resolvers/forms/stateSummary.ts @@ -121,11 +121,16 @@ export function getStateSummary(form: Form) { const emitter = isResealed ? form.recipient?.company : form.emitter?.company; + const isSubjectToADR = isResealed + ? form.temporaryStorageDetail?.wasteDetails?.isSubjectToADR + : form.wasteDetails?.isSubjectToADR; + return { quantity, quantityType, packagingInfos, packagings: packagingInfos.map(pi => pi.type), + isSubjectToADR, onuCode, nonRoadRegulationMention, ...transporter, diff --git a/back/src/forms/resolvers/mutations/__tests__/createForm.integration.ts b/back/src/forms/resolvers/mutations/__tests__/createForm.integration.ts index 84dc3e9580..f2b05b6d2d 100644 --- a/back/src/forms/resolvers/mutations/__tests__/createForm.integration.ts +++ b/back/src/forms/resolvers/mutations/__tests__/createForm.integration.ts @@ -2194,6 +2194,40 @@ describe("Mutation.createForm", () => { ]); }); + it.each(["", " "])( + "should convert empty onuCode to null", + async onuCode => { + // Given + const { user, company } = await userWithCompanyFactory("MEMBER"); + + // When + const { mutate } = makeClient(user); + const { errors, data } = await mutate< + Pick, + MutationCreateFormArgs + >(CREATE_FORM, { + variables: { + createFormInput: { + emitter: { + company: { siret: company.siret } + }, + wasteDetails: { + onuCode + } + } + } + }); + + // Then + expect(errors).toBeUndefined(); + + const form = await prisma.form.findFirstOrThrow({ + where: { id: data.createForm.id } + }); + + expect(form.wasteDetailsOnuCode).toBeNull(); + } + ); it("should allow to create a form with a nonRoadRegulationMention", async () => { // Given const { user, company } = await userWithCompanyFactory("MEMBER"); diff --git a/back/src/forms/resolvers/mutations/__tests__/duplicateForm.integration.ts b/back/src/forms/resolvers/mutations/__tests__/duplicateForm.integration.ts index 92ca76ce97..62106826ad 100644 --- a/back/src/forms/resolvers/mutations/__tests__/duplicateForm.integration.ts +++ b/back/src/forms/resolvers/mutations/__tests__/duplicateForm.integration.ts @@ -296,7 +296,8 @@ describe("Mutation.duplicateForm", () => { "hasCiterneBeenWashedOut", "emptyReturnADR", "wasteDetailsNonRoadRegulationMention", - "wasteDetailsOnuCode" + "wasteDetailsOnuCode", + "wasteDetailsIsSubjectToADR" ]; const expectedSkippedTransporter = [ @@ -559,6 +560,7 @@ describe("Mutation.duplicateForm", () => { "wasteDetailsQuantity", "wasteDetailsQuantityType", "wasteDetailsSampleNumber", + "wasteDetailsIsSubjectToADR", "wasteDetailsNonRoadRegulationMention", "emittedBy", "emittedAt", diff --git a/back/src/forms/resolvers/mutations/__tests__/markAsSealed.integration.ts b/back/src/forms/resolvers/mutations/__tests__/markAsSealed.integration.ts index 314af03310..08ce4a7639 100644 --- a/back/src/forms/resolvers/mutations/__tests__/markAsSealed.integration.ts +++ b/back/src/forms/resolvers/mutations/__tests__/markAsSealed.integration.ts @@ -644,6 +644,253 @@ describe("Mutation.markAsSealed", () => { expect(data.markAsSealed.status).toBe("SEALED"); }); + describe("Mention ADR", () => { + describe("new ADR switch", () => { + it.each([undefined, null, ""])( + "if wastes is subject to ADR, onuCode cannot be %p", + async wasteDetailsOnuCode => { + // Given + const { user, company: emitterCompany } = + await userWithCompanyFactory("MEMBER"); + const recipientCompany = await destinationFactory(); + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "DRAFT", + emitterCompanySiret: emitterCompany.siret, + recipientCompanySiret: recipientCompany.siret, + wasteDetailsIsSubjectToADR: true, + wasteDetailsOnuCode + } + }); + + // When + const { mutate } = makeClient(user); + const { errors } = await mutate(MARK_AS_SEALED, { + variables: { + id: form.id + } + }); + + // Then + expect(errors).not.toBeUndefined(); + expect(errors).toEqual([ + expect.objectContaining({ + message: [ + "Erreur, impossible de valider le bordereau car des champs obligatoires ne sont pas renseignés.", + `Erreur(s): Le déchet est soumis à l'ADR. Vous devez préciser la mention correspondante.` + ].join("\n") + }) + ]); + } + ); + + it.each([undefined, null, ""])( + "if waste is not subject to ADR, onuCode can be %p", + async wasteDetailsOnuCode => { + // Given + const { user, company: emitterCompany } = + await userWithCompanyFactory("MEMBER"); + const recipientCompany = await destinationFactory(); + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "DRAFT", + emitterCompanySiret: emitterCompany.siret, + recipientCompanySiret: recipientCompany.siret, + wasteDetailsIsSubjectToADR: false, + wasteDetailsOnuCode + } + }); + + // When + const { mutate } = makeClient(user); + const { errors } = await mutate(MARK_AS_SEALED, { + variables: { + id: form.id + } + }); + + // Then + expect(errors).toBeUndefined(); + } + ); + + it("should not be allowed to provide onuCode for wastes not subject to ADR", async () => { + // Given + const { user, company: emitterCompany } = await userWithCompanyFactory( + "MEMBER" + ); + const recipientCompany = await destinationFactory(); + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "DRAFT", + emitterCompanySiret: emitterCompany.siret, + recipientCompanySiret: recipientCompany.siret, + wasteDetailsIsSubjectToADR: false, + wasteDetailsOnuCode: "Some ADR mention" + } + }); + + // When + const { mutate } = makeClient(user); + const { errors } = await mutate(MARK_AS_SEALED, { + variables: { + id: form.id + } + }); + + // Then + expect(errors).not.toBeUndefined(); + expect(errors).toEqual([ + expect.objectContaining({ + message: [ + "Erreur, impossible de valider le bordereau car des champs obligatoires ne sont pas renseignés.", + `Erreur(s): Le déchet n'est pas soumis à l'ADR. Vous ne pouvez pas préciser de mention ADR.` + ].join("\n") + }) + ]); + }); + + it("waste subject to ADR + onuCode", async () => { + // Given + const { user, company: emitterCompany } = await userWithCompanyFactory( + "MEMBER" + ); + const recipientCompany = await destinationFactory(); + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "DRAFT", + emitterCompanySiret: emitterCompany.siret, + recipientCompanySiret: recipientCompany.siret, + wasteDetailsIsSubjectToADR: true, + wasteDetailsOnuCode: "ADR mention!" + } + }); + + // When + const { mutate } = makeClient(user); + const { errors } = await mutate(MARK_AS_SEALED, { + variables: { + id: form.id + } + }); + + // Then + expect(errors).toBeUndefined(); + }); + }); + + describe("legacy", () => { + it.each([undefined, null, ""])( + "if waste is not dangerous, onuCode can be %p", + async wasteDetailsOnuCode => { + // Given + const { user, company: emitterCompany } = + await userWithCompanyFactory("MEMBER"); + const recipientCompany = await destinationFactory(); + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "DRAFT", + emitterCompanySiret: emitterCompany.siret, + recipientCompanySiret: recipientCompany.siret, + wasteDetailsIsSubjectToADR: null, + wasteDetailsCode: "01 01 01", + wasteDetailsIsDangerous: false, + wasteDetailsOnuCode + } + }); + + // When + const { mutate } = makeClient(user); + const { errors } = await mutate(MARK_AS_SEALED, { + variables: { + id: form.id + } + }); + + // Then + expect(errors).toBeUndefined(); + } + ); + + it.each([undefined, null, ""])( + "if waste is dangerous, onuCode can not be %p", + async wasteDetailsOnuCode => { + // Given + const { user, company: emitterCompany } = + await userWithCompanyFactory("MEMBER"); + const recipientCompany = await destinationFactory(); + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "DRAFT", + emitterCompanySiret: emitterCompany.siret, + recipientCompanySiret: recipientCompany.siret, + wasteDetailsIsSubjectToADR: null, + wasteDetailsCode: "01 03 04*", + wasteDetailsIsDangerous: true, + wasteDetailsOnuCode + } + }); + + // When + const { mutate } = makeClient(user); + const { errors } = await mutate(MARK_AS_SEALED, { + variables: { + id: form.id + } + }); + + // Then + expect(errors).not.toBeUndefined(); + expect(errors).toEqual([ + expect.objectContaining({ + message: [ + "Erreur, impossible de valider le bordereau car des champs obligatoires ne sont pas renseignés.", + `Erreur(s): La mention ADR est obligatoire pour les déchets dangereux. Merci d'indiquer "non soumis" si nécessaire.` + ].join("\n") + }) + ]); + } + ); + + it("waste is dangerous + onuCode", async () => { + // Given + const { user, company: emitterCompany } = await userWithCompanyFactory( + "MEMBER" + ); + const recipientCompany = await destinationFactory(); + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "DRAFT", + emitterCompanySiret: emitterCompany.siret, + recipientCompanySiret: recipientCompany.siret, + wasteDetailsIsSubjectToADR: null, + wasteDetailsCode: "01 03 04*", + wasteDetailsIsDangerous: true, + wasteDetailsOnuCode: "Some ADR mention" + } + }); + + // When + const { mutate } = makeClient(user); + const { errors } = await mutate(MARK_AS_SEALED, { + variables: { + id: form.id + } + }); + + // Then + expect(errors).toBeUndefined(); + }); + }); + }); + it("should be optional to provide packagings", async () => { const { user, company: emitterCompany } = await userWithCompanyFactory( "MEMBER" diff --git a/back/src/forms/resolvers/mutations/markAsResealed.ts b/back/src/forms/resolvers/mutations/markAsResealed.ts index 53c436b378..82ee3fc4ea 100644 --- a/back/src/forms/resolvers/mutations/markAsResealed.ts +++ b/back/src/forms/resolvers/mutations/markAsResealed.ts @@ -75,6 +75,7 @@ const markAsResealed: MutationResolvers["markAsResealed"] = async ( wasteDetailsConsistence: form.wasteDetailsConsistence, wasteDetailsIsDangerous: form.wasteDetailsIsDangerous, wasteDetailsName: form.wasteDetailsName, + wasteDetailsIsSubjectToADR: form.wasteDetailsIsSubjectToADR, wasteDetailsOnuCode: form.wasteDetailsOnuCode, wasteDetailsNonRoadRegulationMention: form.wasteDetailsNonRoadRegulationMention, diff --git a/back/src/forms/typeDefs/bsdd.inputs.graphql b/back/src/forms/typeDefs/bsdd.inputs.graphql index c96e99dbe7..06f56ca25e 100644 --- a/back/src/forms/typeDefs/bsdd.inputs.graphql +++ b/back/src/forms/typeDefs/bsdd.inputs.graphql @@ -622,6 +622,9 @@ input WasteDetailsInput { "Dénomination usuelle. Obligatoire" name: String + "Si le déchet est soumis à l'ADR" + isSubjectToADR: Boolean + "Mention au titre du règlement ADR. Obligatoire pour les déchets dangereux. Merci d'indiquer 'non soumis' si nécessaire." onuCode: String diff --git a/back/src/forms/typeDefs/bsdd.objects.graphql b/back/src/forms/typeDefs/bsdd.objects.graphql index 314c20be38..038fb8c723 100644 --- a/back/src/forms/typeDefs/bsdd.objects.graphql +++ b/back/src/forms/typeDefs/bsdd.objects.graphql @@ -289,6 +289,9 @@ type StateSummary { "Packaging le plus à jour" packagingInfos: [PackagingInfo!]! + "Si le BSD est soumis à l'ADR ou non" + isSubjectToADR: Boolean + "Mention au titre du règlement ADR la plus à jour" onuCode: String @@ -520,6 +523,9 @@ type WasteDetails { "Dénomination usuelle" name: String + "Si le BSD est soumis à l'ADR ou non" + isSubjectToADR: Boolean + "Mention au titre du règlement ADR" onuCode: String diff --git a/back/src/forms/validation.ts b/back/src/forms/validation.ts index c2348de954..d6125d9afc 100644 --- a/back/src/forms/validation.ts +++ b/back/src/forms/validation.ts @@ -75,7 +75,7 @@ import { getOperationModesFromOperationCode } from "../common/operationModes"; import { isFinalOperationCode } from "../common/operationCodes"; import { flattenFormInput } from "./converter"; import { bsddWasteQuantities } from "./helpers/bsddWasteQuantities"; -import { isDefined } from "../common/helpers"; +import { isDefined, isDefinedStrict } from "../common/helpers"; // set yup default error messages configureYup(); @@ -807,19 +807,55 @@ const baseWasteDetailsSchemaFn: FactorySchemaOf< ), otherwise: () => yup.boolean() }), - wasteDetailsOnuCode: yup.string().when("wasteDetailsIsDangerous", { - is: (wasteDetailsIsDangerous: boolean) => - wasteDetailsIsDangerous === true, - then: () => - yup - .string() - .ensure() - .requiredIf( - !isDraft, - `La mention ADR est obligatoire pour les déchets dangereux. Merci d'indiquer "non soumis" si nécessaire.` - ), - otherwise: () => yup.string().nullable() - }), + wasteDetailsIsSubjectToADR: yup.boolean().nullable(), + wasteDetailsOnuCode: yup + .string() + .nullable() + // Empty values (or spaces) to null + .transform(value => + isDefinedStrict(value?.replace(/\s/g, "")) ? value : null + ) + .test((_, ctx) => { + if (isDraft) return true; + + const { + wasteDetailsIsDangerous, + wasteDetailsIsSubjectToADR, + wasteDetailsOnuCode + } = ctx.parent; + + // New method: using the switch wasteDetailsIsSubjectToADR + if (isDefined(wasteDetailsIsSubjectToADR)) { + if ( + wasteDetailsIsSubjectToADR === true && + !isDefined(wasteDetailsOnuCode) + ) { + return new yup.ValidationError( + `Le déchet est soumis à l'ADR. Vous devez préciser la mention correspondante.` + ); + } else if ( + wasteDetailsIsSubjectToADR === false && + isDefined(wasteDetailsOnuCode) + ) { + return new yup.ValidationError( + `Le déchet n'est pas soumis à l'ADR. Vous ne pouvez pas préciser de mention ADR.` + ); + } + } + // Legacy + else { + if ( + wasteDetailsIsDangerous === true && + !isDefined(wasteDetailsOnuCode) + ) { + return new yup.ValidationError( + `La mention ADR est obligatoire pour les déchets dangereux. Merci d'indiquer "non soumis" si nécessaire.` + ); + } + } + + return true; + }), wasteDetailsNonRoadRegulationMention: yup.string().nullable(), wasteDetailsParcelNumbers: yup.array().of(parcelInfos as any), wasteDetailsAnalysisReferences: yup.array().of(yup.string()) as any, diff --git a/front/src/Apps/Dashboard/Validation/BSDD/FormWasteSummary.tsx b/front/src/Apps/Dashboard/Validation/BSDD/FormWasteSummary.tsx index e81e6732fe..5140f22b7c 100644 --- a/front/src/Apps/Dashboard/Validation/BSDD/FormWasteSummary.tsx +++ b/front/src/Apps/Dashboard/Validation/BSDD/FormWasteSummary.tsx @@ -11,6 +11,7 @@ import { DsfrDataListDescription } from "../../../../common/components"; import { isDefined } from "../../../../common/helper"; +import { getFormWasteDetailsADRMention } from "@td/constants"; interface FormWasteSummaryProps { form: Form; @@ -51,7 +52,7 @@ export function FormWasteSummary({ form }: FormWasteSummaryProps) { Mention ADR - {form.wasteDetails?.onuCode ?? "Non soumis"} + {getFormWasteDetailsADRMention(form.wasteDetails)} diff --git a/front/src/Apps/common/queries/fragments/bsdd.ts b/front/src/Apps/common/queries/fragments/bsdd.ts index b9015a684c..52e314a3ad 100644 --- a/front/src/Apps/common/queries/fragments/bsdd.ts +++ b/front/src/Apps/common/queries/fragments/bsdd.ts @@ -66,6 +66,7 @@ export const wasteDetailsFragment = gql` fragment WasteDetailsFragment on WasteDetails { code name + isSubjectToADR onuCode nonRoadRegulationMention packagingInfos { @@ -166,6 +167,7 @@ export const staticFieldsFragment = gql` other quantity } + isSubjectToADR onuCode nonRoadRegulationMention quantity diff --git a/front/src/dashboard/components/BSDList/BSDD/WorkflowAction/FormWasteEmissionSummary.tsx b/front/src/dashboard/components/BSDList/BSDD/WorkflowAction/FormWasteEmissionSummary.tsx index 33c2ad0edb..d209b91635 100644 --- a/front/src/dashboard/components/BSDList/BSDD/WorkflowAction/FormWasteEmissionSummary.tsx +++ b/front/src/dashboard/components/BSDList/BSDD/WorkflowAction/FormWasteEmissionSummary.tsx @@ -15,6 +15,8 @@ import { import NumberInput from "../../../../../form/common/components/custom-inputs/NumberInput"; import { IconPaperWrite } from "../../../../../Apps/common/Components/Icons/Icons"; import Packagings from "../../../../../form/bsdd/components/packagings/Packagings"; +import { getFormWasteDetailsADRMention } from "@td/constants"; +import { isDefined } from "../../../../../common/helper"; interface FormWasteEmissionSummaryProps { form: Form; @@ -123,15 +125,24 @@ export function FormWasteEmissionSummary({ Mention ADR - {values.onuCode ?? "Non soumis"} - - ) + {getFormWasteDetailsADRMention({ + ...form.wasteDetails, + ...values + })} + + {/* Enable editing ADR only if: + - BSD is explicictely subject to ADR (isSubjectToADR) + - BSD is legacy (isSubjectToADR is not defined) */} + {(!isDefined(form.wasteDetails?.isSubjectToADR) || + form.wasteDetails?.isSubjectToADR === true) && ( + + )} )} diff --git a/front/src/dashboard/components/BSDList/BSDD/WorkflowAction/FormWasteTransportSummary.tsx b/front/src/dashboard/components/BSDList/BSDD/WorkflowAction/FormWasteTransportSummary.tsx index 1ef33040a0..790fa1dde4 100644 --- a/front/src/dashboard/components/BSDList/BSDD/WorkflowAction/FormWasteTransportSummary.tsx +++ b/front/src/dashboard/components/BSDList/BSDD/WorkflowAction/FormWasteTransportSummary.tsx @@ -22,6 +22,7 @@ import { IconPaperWrite } from "../../../../../Apps/common/Components/Icons/Icon import Packagings from "../../../../../form/bsdd/components/packagings/Packagings"; import { useEffect } from "react"; import { getTransportModeLabel } from "../../../../constants"; +import { getFormWasteDetailsADRMention } from "@td/constants"; interface FormWasteTransportSummaryProps { form: Form; @@ -216,11 +217,13 @@ export function FormWasteTransportSummary({ Code ADR (ONU) {form.status === FormStatus.SignedByTempStorer ? ( - {temporaryStorageDetail?.wasteDetails?.onuCode ?? "Non soumis"} + {getFormWasteDetailsADRMention( + temporaryStorageDetail?.wasteDetails + )} ) : ( - {form.wasteDetails?.onuCode ?? "Non soumis"} + {getFormWasteDetailsADRMention(form?.wasteDetails)} )} diff --git a/front/src/dashboard/detail/bsdd/BSDDetailContent.tsx b/front/src/dashboard/detail/bsdd/BSDDetailContent.tsx index fe6554451c..5bf71b8fd6 100644 --- a/front/src/dashboard/detail/bsdd/BSDDetailContent.tsx +++ b/front/src/dashboard/detail/bsdd/BSDDetailContent.tsx @@ -65,7 +65,9 @@ import { isForeignVat, isSiret, isDangerous, - STATUS_LABELS + STATUS_LABELS, + getFormWasteDetailsADRMention, + getFormStateSummaryADRMention } from "@td/constants"; import { Appendix1ProducerForm } from "../../../form/bsdd/appendix1Producer/form"; import { useQuery } from "@apollo/client"; @@ -138,7 +140,9 @@ const TempStorage = ({ form }) => { label="Description déchet" />
    Mention ADR
    -
    {form?.stateSummary?.onuCode}
    +
    {getFormStateSummaryADRMention(form?.stateSummary)}
    Mention RID, ADNR, IMDG
    {form?.stateSummary?.nonRoadRegulationMention}
    POP
    {form.wasteDetails?.pop ? "Oui" : "Non"}
    diff --git a/front/src/form/bsdd/WasteInfo.tsx b/front/src/form/bsdd/WasteInfo.tsx index a01bb769d1..e365c30919 100644 --- a/front/src/form/bsdd/WasteInfo.tsx +++ b/front/src/form/bsdd/WasteInfo.tsx @@ -18,9 +18,11 @@ import { } from "./components/waste-code"; import "./WasteInfo.scss"; import EstimatedQuantityTooltip from "../../common/components/EstimatedQuantityTooltip"; +import ToggleSwitch from "@codegouvfr/react-dsfr/ToggleSwitch"; type Values = { wasteDetails: { + isSubjectToADR: boolean | null; code: string; packagings: string[]; parcelNumbers: any[]; @@ -59,6 +61,7 @@ export default connect<{ disabled }, Values>(function WasteInfo({ useEffect(() => { if (isDangerous(values.wasteDetails.code)) { setFieldValue("wasteDetails.isDangerous", true); + setFieldValue("wasteDetails.isSubjectToADR", true); } }, [values.wasteDetails.code, setFieldValue]); @@ -275,19 +278,34 @@ export default connect<{ disabled }, Values>(function WasteInfo({ )} -
    - +
    + { + setFieldValue("wasteDetails.isSubjectToADR", e); + if (!e) { + setFieldValue("wasteDetails.onuCode", null); + } + }} + inputTitle={"Test"} + label="Le déchet est soumis à l'ADR" + checked={values.wasteDetails.isSubjectToADR ?? false} + /> + + {values.wasteDetails.isSubjectToADR && ( +
    + - + +
    + )}
    diff --git a/front/src/form/bsdd/utils/initial-state.ts b/front/src/form/bsdd/utils/initial-state.ts index a34e742e5e..a22414af09 100644 --- a/front/src/form/bsdd/utils/initial-state.ts +++ b/front/src/form/bsdd/utils/initial-state.ts @@ -182,6 +182,7 @@ export function getInitialState(f?: Form | null): FormFormikValues { wasteDetails: { code: f?.wasteDetails?.code ?? "", name: f?.wasteDetails?.name ?? "", + isSubjectToADR: f?.wasteDetails?.isSubjectToADR ?? true, onuCode: f?.wasteDetails?.onuCode ?? "", packagingInfos: f?.wasteDetails?.packagingInfos ?? [], quantity: f?.wasteDetails?.quantity ?? null, diff --git a/front/src/form/bsdd/utils/schema.ts b/front/src/form/bsdd/utils/schema.ts index ac55210293..b23ba21057 100644 --- a/front/src/form/bsdd/utils/schema.ts +++ b/front/src/form/bsdd/utils/schema.ts @@ -20,7 +20,7 @@ import { } from "@td/codegen-ui"; import graphlClient from "../../../graphql-client"; import { COMPANY_INFOS_REGISTERED_VALIDATION_SCHEMA } from "../../../Apps/common/queries/company/query"; -import { isVat, isFRVat, isSiret, isDangerous } from "@td/constants"; +import { isVat, isFRVat, isSiret } from "@td/constants"; import { companySchema, transporterCompanySchema @@ -207,16 +207,8 @@ export const formSchema = object().shape({ wasteDetails: object().shape({ code: string().required("Code déchet manquant"), name: string().nullable(true), - onuCode: string().when("code", { - is: (wasteCode: string) => isDangerous(wasteCode || ""), - then: () => - string() - .ensure() - .required( - `La mention ADR est obligatoire pour les déchets dangereux. Merci d'indiquer "non soumis" si nécessaire.` - ), - otherwise: () => string().nullable() - }), + isSubjectToADR: boolean(), + onuCode: string().nullable(), packagingInfos: array() .required() .min(1) diff --git a/libs/back/prisma/src/migrations/20241028161030_add_waste_details_is_subject_to_adr_field_form/migration.sql b/libs/back/prisma/src/migrations/20241028161030_add_waste_details_is_subject_to_adr_field_form/migration.sql new file mode 100644 index 0000000000..41dd194b15 --- /dev/null +++ b/libs/back/prisma/src/migrations/20241028161030_add_waste_details_is_subject_to_adr_field_form/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Form" ADD COLUMN "wasteDetailsIsSubjectToADR" BOOLEAN; diff --git a/libs/back/prisma/src/schema.prisma b/libs/back/prisma/src/schema.prisma index 3e0ca18051..98165fca97 100644 --- a/libs/back/prisma/src/schema.prisma +++ b/libs/back/prisma/src/schema.prisma @@ -479,6 +479,7 @@ model Form { recipientIsTempStorage Boolean? @default(false) wasteDetailsCode String? wasteDetailsName String? + wasteDetailsIsSubjectToADR Boolean? wasteDetailsOnuCode String? wasteDetailsNonRoadRegulationMention String? wasteDetailsQuantity Decimal? @db.Decimal(65, 30) diff --git a/libs/shared/constants/src/adrHelpers.ts b/libs/shared/constants/src/adrHelpers.ts new file mode 100644 index 0000000000..0fcdb810d9 --- /dev/null +++ b/libs/shared/constants/src/adrHelpers.ts @@ -0,0 +1,40 @@ +interface GetFormWasteDetailsADRMentionProps { + isSubjectToADR?: boolean | null | undefined; + onuCode?: string | null | undefined; +} + +export const getFormWasteDetailsADRMention = ( + wasteDetails: GetFormWasteDetailsADRMentionProps | null | undefined +) => { + return getFormADRMention({ + wasteDetailsIsSubjectToADR: wasteDetails?.isSubjectToADR, + wasteDetailsOnuCode: wasteDetails?.onuCode + }); +}; + +export const getFormStateSummaryADRMention = getFormWasteDetailsADRMention; + +interface GetFormADRMentionProps { + wasteDetailsIsSubjectToADR?: boolean | null | undefined; + wasteDetailsOnuCode?: string | null | undefined; +} + +export const getFormADRMention = ({ + wasteDetailsIsSubjectToADR, + wasteDetailsOnuCode +}: GetFormADRMentionProps = {}) => { + // New method with ADR switch + if ( + wasteDetailsIsSubjectToADR !== null && + wasteDetailsIsSubjectToADR !== undefined + ) { + if (wasteDetailsIsSubjectToADR) { + return wasteDetailsOnuCode; + } else { + return "Déclaré non soumis à l'ADR"; + } + } + + // Legacy + return wasteDetailsOnuCode ?? "Non soumis"; +}; diff --git a/libs/shared/constants/src/index.ts b/libs/shared/constants/src/index.ts index 487098f708..5abc97bf3f 100644 --- a/libs/shared/constants/src/index.ts +++ b/libs/shared/constants/src/index.ts @@ -13,4 +13,5 @@ export * from "./statuses"; export * from "./VALIDATION"; export * from "./WASTES"; export * from "./emailHelpers"; +export * from "./adrHelpers"; export * from "./BALE"; From cdc75ea3bb91035fd38b42aff9a54b92e755c098 Mon Sep 17 00:00:00 2001 From: GaelFerrand <45355989+GaelFerrand@users.noreply.github.com> Date: Fri, 8 Nov 2024 15:10:53 +0100 Subject: [PATCH 16/74] =?UTF-8?q?[TRA-14820]=20Correction=20des=20conditio?= =?UTF-8?q?ns=20d'affichage=20de=20la=20r=C3=A9f=C3=A9rence=20=C3=A0=20l'A?= =?UTF-8?q?DR=20pour=20la=20quantit=C3=A9=20estim=C3=A9e=20=20(#3724)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: added new field wasteDetailsIsSubjectToADR * feat: started implementing the front * feat: improved tests & legacy management * feat: displaying ADR mention on the front according to switch & legacy * fix: removed console.log * fix: fixing typing * fix: fixed clone method * fix: fixing types * fix: fixing tests * fix: fixed test * feat: fixed mention display --- back/src/forms/pdf/components/BsddPdf.tsx | 15 +++++++++++++-- .../components/EstimatedQuantityTooltip.tsx | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/back/src/forms/pdf/components/BsddPdf.tsx b/back/src/forms/pdf/components/BsddPdf.tsx index 8adbd6b22d..77298682e6 100644 --- a/back/src/forms/pdf/components/BsddPdf.tsx +++ b/back/src/forms/pdf/components/BsddPdf.tsx @@ -73,11 +73,20 @@ function ReceiptFields({ } type QuantityFieldsProps = { + isSubjectToADR?: boolean | null; quantity?: number | null; quantityType?: QuantityType | null; }; -function QuantityFields({ quantity, quantityType }: QuantityFieldsProps) { +function QuantityFields({ + isSubjectToADR, + quantity, + quantityType +}: QuantityFieldsProps) { + const displayADRArticle = + quantityType === QuantityType.ESTIMATED && + (!isDefined(isSubjectToADR) || isSubjectToADR === true); + return (

    Tonne(s) : {quantity} @@ -96,7 +105,9 @@ function QuantityFields({ quantity, quantityType }: QuantityFieldsProps) { />{" "} Estimée
    - "QUANTITÉE ESTIMÉE CONFORMÉMENT AU 5.4.1.1.3.2" de l'ADR 2023 + {displayADRArticle && ( + <>"QUANTITÉE ESTIMÉE CONFORMÉMENT AU 5.4.1.1.3.2" + )}

    ); } diff --git a/front/src/common/components/EstimatedQuantityTooltip.tsx b/front/src/common/components/EstimatedQuantityTooltip.tsx index 488b281f9b..3061d6d055 100644 --- a/front/src/common/components/EstimatedQuantityTooltip.tsx +++ b/front/src/common/components/EstimatedQuantityTooltip.tsx @@ -4,7 +4,7 @@ import Tooltip from "./Tooltip"; const EstimatedQuantityTooltip = () => { return ( ); }; From ec9e125ae6a61043bd3561f6bff63a5d0597fa7d Mon Sep 17 00:00:00 2001 From: GaelFerrand <45355989+GaelFerrand@users.noreply.github.com> Date: Fri, 8 Nov 2024 17:04:57 +0100 Subject: [PATCH 17/74] Correctifs pour la fonction de clonage et les BSFF (#3709) --- .../__tests__/cloneBsd.integration.ts | 55 ++++++++++++++++--- .../resolvers/mutations/utils/clone.utils.ts | 13 ++++- 2 files changed, 58 insertions(+), 10 deletions(-) diff --git a/back/src/bsds/resolvers/mutations/__tests__/cloneBsd.integration.ts b/back/src/bsds/resolvers/mutations/__tests__/cloneBsd.integration.ts index 35f27b1a3e..913d6be48f 100644 --- a/back/src/bsds/resolvers/mutations/__tests__/cloneBsd.integration.ts +++ b/back/src/bsds/resolvers/mutations/__tests__/cloneBsd.integration.ts @@ -2,7 +2,8 @@ import gql from "graphql-tag"; import { bsddFinalOperationFactory, formFactory, - userFactory + userFactory, + userWithCompanyFactory } from "../../../../__tests__/factories"; import { Mutation } from "../../../../generated/graphql/types"; import makeClient from "../../../../__tests__/testClient"; @@ -26,10 +27,12 @@ import { } from "../../../../bsdasris/__tests__/factories"; import { createBsff, - createBsffPackagingFinalOperation + createBsffPackagingFinalOperation, + createFicheIntervention } from "../../../../bsffs/__tests__/factories"; import { bsvhuFactory } from "../../../../bsvhu/__tests__/factories.vhu"; import { bspaohFactory } from "../../../../bspaoh/__tests__/factories"; +import { UserRole } from "@prisma/client"; const CLONE_BSD = gql` mutation cloneBsd($id: String!) { @@ -370,18 +373,52 @@ describe("mutation cloneBsd", () => { }); expectBsdsToMatch(initialBsff, newBsff); + }); + + it("should clone BSFF with fiche d'intervention", async () => { + // Given + const user = await userFactory(); + const operateur = await userWithCompanyFactory(UserRole.ADMIN); + const detenteur = await userWithCompanyFactory(UserRole.ADMIN); + const ficheIntervention = await createFicheIntervention({ + operateur, + detenteur + }); + const bsff = await createBsff( + {}, + { + data: { + ficheInterventions: { connect: { id: ficheIntervention.id } }, + detenteurCompanySirets: [detenteur.company.orgId] + } + } + ); + + // When + const { mutate } = makeClient(user); + const { errors, data } = await mutate>( + CLONE_BSD, + { + variables: { + id: bsff.id + } + } + ); + + // Then + expect(errors).toBeUndefined(); - const initialPackagings = await prisma.bsffPackaging.findMany({ - where: { bsffId: initialBsff.id }, - include: { finalOperations: true } + const initialBsff = await prisma.bsff.findFirstOrThrow({ + where: { id: bsff.id }, + include: bsffInclude }); - const newPackagings = await prisma.bsffPackaging.findMany({ - where: { bsffId: newBsff.id }, - include: { finalOperations: true } + const newBsff = await prisma.bsff.findFirstOrThrow({ + where: { id: data.cloneBsd.id }, + include: bsffInclude }); - expectBsdsToMatch(initialPackagings, newPackagings); + expectBsdsToMatch(initialBsff, newBsff); }); it("should clone regular BSVHU", async () => { diff --git a/back/src/bsds/resolvers/mutations/utils/clone.utils.ts b/back/src/bsds/resolvers/mutations/utils/clone.utils.ts index d4ccd912e1..159e5fb89b 100644 --- a/back/src/bsds/resolvers/mutations/utils/clone.utils.ts +++ b/back/src/bsds/resolvers/mutations/utils/clone.utils.ts @@ -408,6 +408,12 @@ export const cloneBsff = async (user: Express.User, id: string) => { throw new UserInputError(`ID invalide ${id}`); } + if (bsff.packagings?.some(packaging => packaging.nextPackagingId)) { + throw new UserInputError( + "Impossible de cloner ce type de BSD pour le moment" + ); + } + const { create } = getBsffRepository(user); const newBsffCreateInput: Omit< @@ -441,7 +447,12 @@ export const cloneBsff = async (user: Express.User, id: string) => { emitterEmissionSignatureAuthor: bsff.emitterEmissionSignatureAuthor, emitterEmissionSignatureDate: bsff.emitterEmissionSignatureDate, ficheInterventions: bsff.ficheInterventions.length - ? { create: bsff.ficheInterventions[0] } + ? { + create: { + ...bsff.ficheInterventions[0], + id: undefined + } + } : {}, isDeleted: bsff.isDeleted, isDraft: bsff.isDraft, From 17b34e89e3068f1f6fd77bcf93f4d2a4aa7e2eb7 Mon Sep 17 00:00:00 2001 From: Laurent Paoletti Date: Wed, 30 Oct 2024 11:56:41 +0100 Subject: [PATCH 18/74] MarkAsReceived requires quantityReceived to mark a form as accepted --- Changelog.md | 1 + back/src/common/validation.ts | 10 +- .../__tests__/markAsReceived.integration.ts | 159 ++++++++++++++++++ back/src/forms/typeDefs/bsdd.inputs.graphql | 2 + package.json | 2 +- 5 files changed, 170 insertions(+), 4 deletions(-) diff --git a/Changelog.md b/Changelog.md index 2ed569fd8c..d877e95f36 100644 --- a/Changelog.md +++ b/Changelog.md @@ -10,6 +10,7 @@ et le projet suit un schéma de versionning inspiré de [Calendar Versioning](ht #### :boom: Breaking changes - Le champ "Numéro de notification" est obligatoire lorsque la destination ultérieure renseignée est étrangère [PR 3719](https://github.com/MTES-MCT/trackdechets/pull/3719) +- La présence d'une quantité reçue est requise pour passer du statut SENT à ACCEPTED via la mutation markAsReceived [PR 3720](https://github.com/MTES-MCT/trackdechets/pull/3720) # [2024.10.1] 22/10/2024 diff --git a/back/src/common/validation.ts b/back/src/common/validation.ts index 12765480a8..cb46ef0645 100644 --- a/back/src/common/validation.ts +++ b/back/src/common/validation.ts @@ -84,9 +84,13 @@ export const weightConditions: WeightConditions = { WasteAcceptationStatus.PARTIALLY_REFUSED ].includes(status) ) { - return weight.positive( - "${path} : le poids doit être supérieur à 0 lorsque le déchet est accepté ou accepté partiellement" - ); + return weight + .required( + "${path} : le poids est requis lorsque le déchet est accepté ou accepté partiellement." + ) + .positive( + "${path} : le poids doit être supérieur à 0 lorsque le déchet est accepté ou accepté partiellement" + ); } return weight; }, diff --git a/back/src/forms/resolvers/mutations/__tests__/markAsReceived.integration.ts b/back/src/forms/resolvers/mutations/__tests__/markAsReceived.integration.ts index 60f873c040..f692366392 100644 --- a/back/src/forms/resolvers/mutations/__tests__/markAsReceived.integration.ts +++ b/back/src/forms/resolvers/mutations/__tests__/markAsReceived.integration.ts @@ -15,6 +15,7 @@ import { import makeClient from "../../../../__tests__/testClient"; import { prepareDB, prepareRedis } from "../../../__tests__/helpers"; import { allowedFormats } from "../../../../common/dates"; +import { ErrorCode } from "../../../../common/errors"; import { Mutation, MutationMarkAsReceivedArgs @@ -191,6 +192,111 @@ describe("Test Form reception", () => { expect(logs[0].status).toBe("ACCEPTED"); }); + it("it should not mark a sent form as accepted if wasteAcceptationStatus is ACCEPTED but quantityReceived is 0", async () => { + const { + emitterCompany, + recipient, + recipientCompany, + form: initialForm + } = await prepareDB(); + const form = await prisma.form.update({ + where: { id: initialForm.id }, + data: { currentTransporterOrgId: siretify(3) } + }); + await prepareRedis({ + emitterCompany, + recipientCompany + }); + const frm1 = await prisma.form.findUniqueOrThrow({ + where: { id: form.id } + }); + + expect(frm1.quantityReceivedType).toBeNull(); + const { mutate } = makeClient(recipient); + const { errors } = await mutate(MARK_AS_RECEIVED, { + variables: { + id: form.id, + receivedInfo: { + receivedBy: "Bill", + receivedAt: "2019-01-17T10:22:00+0100", + signedAt: "2019-01-17T10:22:00+0100", + wasteAcceptationStatus: "ACCEPTED", + quantityReceived: 0 + } + } + }); + + expect(errors).toEqual([ + expect.objectContaining({ + message: + "Réception : le poids doit être supérieur à 0 lorsque le déchet est accepté ou accepté partiellement", + extensions: expect.objectContaining({ + code: ErrorCode.BAD_USER_INPUT + }) + }) + ]); + const frm = await prisma.form.findUniqueOrThrow({ + where: { id: form.id } + }); + // form was not accepted, still sent + expect(frm.status).toBe("SENT"); + expect(frm.wasteAcceptationStatus).toBe(null); + expect(frm.receivedBy).toBe(null); + expect(frm.quantityReceived).toBe(null); + }); + + it("it should not mark a sent form as accepted if wasteAcceptationStatus is ACCEPTED but quantityReceived is missing", async () => { + const { + emitterCompany, + recipient, + recipientCompany, + form: initialForm + } = await prepareDB(); + const form = await prisma.form.update({ + where: { id: initialForm.id }, + data: { currentTransporterOrgId: siretify(3) } + }); + await prepareRedis({ + emitterCompany, + recipientCompany + }); + const frm1 = await prisma.form.findUniqueOrThrow({ + where: { id: form.id } + }); + + expect(frm1.quantityReceivedType).toBeNull(); + const { mutate } = makeClient(recipient); + const { errors } = await mutate(MARK_AS_RECEIVED, { + variables: { + id: form.id, + receivedInfo: { + receivedBy: "Bill", + receivedAt: "2019-01-17T10:22:00+0100", + signedAt: "2019-01-17T10:22:00+0100", + wasteAcceptationStatus: "ACCEPTED" + } + } + }); + + expect(errors).toEqual([ + expect.objectContaining({ + message: + "Réception : le poids est requis lorsque le déchet est accepté ou accepté partiellement.", + extensions: expect.objectContaining({ + code: ErrorCode.BAD_USER_INPUT + }) + }) + ]); + const frm = await prisma.form.findUniqueOrThrow({ + where: { id: form.id } + }); + // form was not accepted, still sent + expect(frm.status).toBe("SENT"); + expect(frm.wasteAcceptationStatus).toBe(null); + expect(frm.receivedBy).toBe(null); + expect(frm.quantityReceived).toBe(null); + }); + it("should not accept negative values", async () => { const { emitterCompany, recipient, recipientCompany, form } = await prepareDB(); @@ -1365,4 +1471,57 @@ describe("Test Form reception", () => { expect(sendMail as jest.Mock).toHaveBeenCalledTimes(0); expect(data.markAsReceived.status).toBe("ACCEPTED"); }); + + it("quantityReceived is required for a final destination to accept a BSD", async () => { + const emitter = await userWithCompanyFactory("MEMBER"); + const tempStorer = await userWithCompanyFactory("MEMBER"); + const destination = await userWithCompanyFactory("MEMBER"); + const form = await formWithTempStorageFactory({ + ownerId: emitter.user.id, + opt: { + emitterCompanySiret: emitter.company.siret, + recipientCompanySiret: tempStorer.company.siret, + status: "RESENT", + wasteAcceptationStatus: "ACCEPTED", + quantityReceived: 10, + quantityRefused: 0 + }, + forwardedInOpts: { + sentAt: new Date(), + emitterCompanySiret: tempStorer.company.siret, + recipientCompanySiret: destination.company.siret, + emittedAt: new Date() + } + }); + + const { mutate } = makeClient(destination.user); + const { errors } = await mutate< + Pick, + MutationMarkAsReceivedArgs + >(MARK_AS_RECEIVED, { + variables: { + id: form.id, + receivedInfo: { + receivedAt: new Date("2022-01-01").toISOString() as any, + receivedBy: "John", + + wasteAcceptationStatus: "ACCEPTED" + // quantityReceived not provided, + } + } + }); + + expect(errors).toEqual([ + expect.objectContaining({ + message: + "Réception : le poids est requis lorsque le déchet est accepté ou accepté partiellement." + }) + ]); + + const frm = await prisma.form.findUniqueOrThrow({ + where: { id: form.id } + }); + // form was not accepted, still resent + expect(frm.status).toBe("RESENT"); + }); }); diff --git a/back/src/forms/typeDefs/bsdd.inputs.graphql b/back/src/forms/typeDefs/bsdd.inputs.graphql index 06f56ca25e..31672aaee8 100644 --- a/back/src/forms/typeDefs/bsdd.inputs.graphql +++ b/back/src/forms/typeDefs/bsdd.inputs.graphql @@ -154,6 +154,8 @@ input ReceivedFormInput { Doit être égale à 0 lorsque le déchet est refusé. Doit être inférieure à 40T en cas de transport routier et inférieure à 50 000 T tout type de transport confondu. + + Le champ est requis pour passer du statut `SENT` à `ACCEPTED` via `markAsReceived`. """ quantityReceived: Float diff --git a/package.json b/package.json index 3362b2dc93..f5dd181ba7 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "scalingo-postbuild": "bash scripts/build/scalingo.sh", "nx": "nx", "dev": "npx nx run-many -t serve --parallel=7 --projects=front,api,tag:backend:background", - "bg:integration": "npx nx run-many -t serve --configuration=integration --projects=tag:backend:queues --parallel=5", + "bg:integration": "npx nx run-many -t serve --configuration=integration --projects=tag:backend:queues --parallel=6", "afterpull": "npm i ; npx prisma migrate dev ; npx nx run back:codegen --skip-nx-cache ; npx nx run @td/codegen-ui:build --skip-nx-cache" }, "engines": { From 021a1b9a487a6d0fa4945d876c92ee4020b7ba12 Mon Sep 17 00:00:00 2001 From: Laurent Paoletti Date: Wed, 6 Nov 2024 19:50:32 +0100 Subject: [PATCH 19/74] Improve controlBsds query and close bsds query api to gov accounts --- Changelog.md | 4 + .../queries/__tests__/bsds.integration.ts | 125 +----------- .../__tests__/controlbsds.integration.ts | 184 ++++++++++++++++++ back/src/bsds/resolvers/queries/bsds.ts | 39 +--- .../src/bsds/resolvers/queries/controlBsds.ts | 13 +- 5 files changed, 212 insertions(+), 153 deletions(-) diff --git a/Changelog.md b/Changelog.md index d877e95f36..2760110bbd 100644 --- a/Changelog.md +++ b/Changelog.md @@ -12,6 +12,10 @@ et le projet suit un schéma de versionning inspiré de [Calendar Versioning](ht - Le champ "Numéro de notification" est obligatoire lorsque la destination ultérieure renseignée est étrangère [PR 3719](https://github.com/MTES-MCT/trackdechets/pull/3719) - La présence d'une quantité reçue est requise pour passer du statut SENT à ACCEPTED via la mutation markAsReceived [PR 3720](https://github.com/MTES-MCT/trackdechets/pull/3720) +#### :house: Interne + +- Modification de la query controlBsds et fermeture de la query bsds aux comptes gouvernementaux [PR 3270](https://github.com/MTES-MCT/trackdechets/pull/3270) + # [2024.10.1] 22/10/2024 #### :rocket: Nouvelles fonctionnalités diff --git a/back/src/bsds/resolvers/queries/__tests__/bsds.integration.ts b/back/src/bsds/resolvers/queries/__tests__/bsds.integration.ts index 04079aab85..78109d37ea 100644 --- a/back/src/bsds/resolvers/queries/__tests__/bsds.integration.ts +++ b/back/src/bsds/resolvers/queries/__tests__/bsds.integration.ts @@ -19,7 +19,8 @@ import { faker } from "@faker-js/faker"; describe("query bsds: governement accounts permissions", () => { afterEach(resetDatabase); - it("should allow user authenticated with a token when tied to a government account with relevant perms", async () => { + it("should forbid user authenticated with a token when tied to a government account with relevant perms", async () => { + // query bsds used t be opend to gov account but is forbidden now const { user: owner, company: someCompany } = await userWithCompanyFactory( "MEMBER" ); @@ -48,132 +49,16 @@ describe("query bsds: governement accounts permissions", () => { }); await indexForm(await getFormForElastic(form)); await refreshElasticSearch(); - const res = await request + const { + body: { errors, data } + } = await request .post("/") .send({ query: `{ bsds(where: {isFollowFor: ["${someCompany.siret}"]}) {pageInfo: totalCount}}` }) .set("Authorization", `Bearer ${accessToken}`) .set("X-Forwarded-For", allowedIP); - const { errors, data } = res.body; - expect(errors).toBeUndefined(); - expect(data.bsds.pageInfo).toEqual(1); - }); - - it("should forbid user authenticated with a token when tied to a government account without relevant perms", async () => { - const { user: owner, company: someCompany } = await userWithCompanyFactory( - "MEMBER" - ); - const request = supertest(app); - - const allowedIP = faker.internet.ipv4(); - // the gov account running the query - const { accessToken } = await userWithAccessTokenFactory({ - governmentAccount: { - create: { - name: "GERICO", - permissions: [GovernmentPermission.REGISTRY_CAN_READ_ALL], // wrong permission - authorizedOrgIds: ["ALL"], - authorizedIPs: [allowedIP] - } - } - }); - const form = await formFactory({ - ownerId: owner.id, - opt: { - emitterCompanySiret: someCompany.siret, - status: "SENT", - sentAt: new Date(), - receivedAt: new Date() - } - }); - await indexForm(await getFormForElastic(form)); - await refreshElasticSearch(); - const res = await request - .post("/") - .send({ - query: `{ bsds(where: {isFollowFor: ["${someCompany.siret}"]}) {pageInfo: totalCount}}` - }) - .set("Authorization", `Bearer ${accessToken}`) - .set("X-Forwarded-For", allowedIP); - const { errors, data } = res.body; - expect(data).toBeNull(); - expect(errors).toHaveLength(1); - expect(errors[0].message).toEqual(`Vous n'êtes pas connecté.`); - }); - - it("should forbid user authenticated with a token if no government account is associated", async () => { - const { user: owner, company: someCompany } = await userWithCompanyFactory( - "MEMBER" - ); - const request = supertest(app); - - const allowedIP = faker.internet.ipv4(); - // the gov account running the query - const { accessToken } = await userWithAccessTokenFactory(); - const form = await formFactory({ - ownerId: owner.id, - opt: { - emitterCompanySiret: someCompany.siret, - status: "SENT", - sentAt: new Date(), - receivedAt: new Date() - } - }); - await indexForm(await getFormForElastic(form)); - await refreshElasticSearch(); - const res = await request - .post("/") - .send({ - query: `{ bsds(where: {isFollowFor: ["${someCompany.siret}"]}) {pageInfo: totalCount}}` - }) - .set("Authorization", `Bearer ${accessToken}`) - .set("X-Forwarded-For", allowedIP); - const { errors, data } = res.body; - expect(data).toBeNull(); - expect(errors).toHaveLength(1); - expect(errors[0].message).toEqual(`Vous n'êtes pas connecté.`); - }); - - it("should forbid user authenticated with a token tied to a government account when IPs do not match", async () => { - const { user: owner, company: someCompany } = await userWithCompanyFactory( - "MEMBER" - ); - const request = supertest(app); - - const allowedIP = faker.internet.ipv4(); - const userIP = faker.internet.ipv4(); - // the gov account running the query - const { accessToken } = await userWithAccessTokenFactory({ - governmentAccount: { - create: { - name: "GERICO", - permissions: [GovernmentPermission.BSDS_CAN_READ_ALL], - authorizedOrgIds: ["ALL"], - authorizedIPs: [allowedIP] // not user ip - } - } - }); - const form = await formFactory({ - ownerId: owner.id, - opt: { - emitterCompanySiret: someCompany.siret, - status: "SENT", - sentAt: new Date(), - receivedAt: new Date() - } - }); - await indexForm(await getFormForElastic(form)); - await refreshElasticSearch(); - const res = await request - .post("/") - .send({ - query: `{ bsds(where: {isFollowFor: ["${someCompany.siret}"]}) {pageInfo: totalCount}}` - }) - .set("Authorization", `Bearer ${accessToken}`) - .set("X-Forwarded-For", userIP); // IPs do not match - const { errors, data } = res.body; expect(data).toBeNull(); expect(errors).toHaveLength(1); expect(errors[0].message).toEqual(`Vous n'êtes pas connecté.`); diff --git a/back/src/bsds/resolvers/queries/__tests__/controlbsds.integration.ts b/back/src/bsds/resolvers/queries/__tests__/controlbsds.integration.ts index b42fcb0dcc..a7c27e1062 100644 --- a/back/src/bsds/resolvers/queries/__tests__/controlbsds.integration.ts +++ b/back/src/bsds/resolvers/queries/__tests__/controlbsds.integration.ts @@ -692,4 +692,188 @@ describe("query controlbsds: governement accounts permissions", () => { form4.id ]); }); + + it.each([ + Status.SEALED, + Status.SENT, + Status.RECEIVED, + Status.ACCEPTED, + Status.REFUSED, + Status.PROCESSED + ])("should filter by readableId (%p)", async status => { + const { user: owner } = await userWithCompanyFactory("MEMBER"); + const request = supertest(app); + + const allowedIP = faker.internet.ipv4(); + // the gov account running the query + const { accessToken } = await userWithAccessTokenFactory({ + governmentAccount: { + create: { + name: "GERICO", + permissions: [GovernmentPermission.BSDS_CAN_READ_ALL], + authorizedOrgIds: ["ALL"], + authorizedIPs: [allowedIP] + } + } + }); + const siret1 = siretify(1); + const siret2 = siretify(2); + const siret3 = siretify(3); + const siret4 = siretify(3); + + const form1 = await formFactory({ + ownerId: owner.id, + opt: { + status, + sentAt: new Date(), + transporters: { + create: { + transporterCompanySiret: siret1, + number: 1, + takenOverAt: new Date(), + transporterNumberPlate: "AZ 23 99" + } + } + } + }); + + const form2 = await formFactory({ + ownerId: owner.id, + opt: { + status, + sentAt: new Date(), + transporters: { + create: { + transporterCompanySiret: siret2, + number: 1, + takenOverAt: new Date(), + transporterNumberPlate: "AZ 23 99" + } + } + } + }); + + const form3 = await formFactory({ + ownerId: owner.id, + opt: { + status, + sentAt: new Date(), + transporters: { + create: { + transporterCompanySiret: siret3, + number: 1, + takenOverAt: new Date(), + transporterNumberPlate: "QS 23 99" + } + } + } + }); + + const form4 = await formFactory({ + ownerId: owner.id, + opt: { + status, + receivedAt: new Date(), + wasteAcceptationStatus: WasteAcceptationStatus.REFUSED, + transporters: { + create: { + transporterCompanySiret: siret4, + number: 1, + takenOverAt: new Date(), + transporterNumberPlate: "AZ 23 99" + } + } + } + }); + + await indexForm(await getFormForElastic(form1)); + await indexForm(await getFormForElastic(form2)); + await indexForm(await getFormForElastic(form3)); + await indexForm(await getFormForElastic(form4)); + + await refreshElasticSearch(); + const res = await request + .post("/") + .send({ + query: `{ controlBsds(where: {readableId: "${form1.readableId}"}) { + edges { + node { + ... on Form { + id + } + } + } + pageInfo: totalCount}}` + }) + .set("Authorization", `Bearer ${accessToken}`) + .set("X-Forwarded-For", allowedIP); + const { errors, data } = res.body; + + expect(errors).toBeUndefined(); + expect(data.controlBsds.pageInfo).toEqual(1); + // the form matches the + expect(data.controlBsds.edges.map(e => e.node.id).sort()).toEqual([ + form1.id + ]); + }); + + it("should exclude DRAFT when filtered by readableId ", async () => { + const { user: owner } = await userWithCompanyFactory("MEMBER"); + const request = supertest(app); + + const allowedIP = faker.internet.ipv4(); + // the gov account running the query + const { accessToken } = await userWithAccessTokenFactory({ + governmentAccount: { + create: { + name: "GERICO", + permissions: [GovernmentPermission.BSDS_CAN_READ_ALL], + authorizedOrgIds: ["ALL"], + authorizedIPs: [allowedIP] + } + } + }); + const siret = siretify(1); + + const form = await formFactory({ + ownerId: owner.id, + opt: { + status: "DRAFT", + sentAt: new Date(), + transporters: { + create: { + transporterCompanySiret: siret, + number: 1, + takenOverAt: new Date(), + transporterNumberPlate: "AZ 23 99" + } + } + } + }); + + await indexForm(await getFormForElastic(form)); + + await refreshElasticSearch(); + const res = await request + .post("/") + .send({ + query: `{ controlBsds(where: {readableId: "${form.readableId}"}) { + edges { + node { + ... on Form { + id + } + } + } + pageInfo: totalCount}}` + }) + .set("Authorization", `Bearer ${accessToken}`) + .set("X-Forwarded-For", allowedIP); + const { errors, data } = res.body; + + expect(errors).toBeUndefined(); + expect(data.controlBsds.pageInfo).toEqual(0); + // the form matches the + expect(data.controlBsds.edges).toEqual([]); + }); }); diff --git a/back/src/bsds/resolvers/queries/bsds.ts b/back/src/bsds/resolvers/queries/bsds.ts index b4081d1002..990f2f7eff 100644 --- a/back/src/bsds/resolvers/queries/bsds.ts +++ b/back/src/bsds/resolvers/queries/bsds.ts @@ -10,12 +10,7 @@ import { client, BsdElastic, index } from "../../../common/elastic"; import { bsdSearchSchema } from "../../validation"; import { toElasticQuery } from "../../where"; -import { - Permission, - can, - getUserRoles, - hasGovernmentReadAllBsdsPermOrThrow -} from "../../../permissions"; +import { Permission, can, getUserRoles } from "../../../permissions"; import { QueryContainer } from "@elastic/elasticsearch/api/types"; import { GraphQLContext } from "../../../types"; @@ -29,13 +24,11 @@ export interface GetResponse { * * @param param0 * @param user - * @param bypassOrgIdsWithListPermission : do not restrict search to user companies (for gerico gov account) * @returns */ async function buildQuery( { clue, where = {} }: QueryBsdsArgs, - user: Express.User, - bypassOrgIdsWithListPermission?: boolean + user: Express.User ) { const query: { bool: estypes.BoolQuery & { @@ -110,13 +103,11 @@ async function buildQuery( can(roles[orgId], Permission.BsdCanList) ); - if (!bypassOrgIdsWithListPermission) { - query.bool.filter.push({ - terms: { - sirets: orgIdsWithListPermission - } - }); - } + query.bool.filter.push({ + terms: { + sirets: orgIdsWithListPermission + } + }); return query; } @@ -237,21 +228,7 @@ async function buildSearchAfter( const bsdsResolver: QueryResolvers["bsds"] = async (_, args, context) => { // This query is restricted to Session users (UI) and government accounts (gerico) - // store user - const contextUser = context.user; - - // is user is not authenticated with Session, context.user is set to null applyAuthStrategies(context, [AuthType.Session]); - let bypassOrgIdsWithListPermission = false; - - // if user is authenticated with Bearer and has a gov account id, check their perms - if (!context.user && contextUser?.governmentAccountId) { - // throw NotLoggedIn if perms do not match - await hasGovernmentReadAllBsdsPermOrThrow(contextUser); - // if permission matches, set context.user back - context.user = contextUser; - bypassOrgIdsWithListPermission = true; - } const user = checkIsAuthenticated(context); @@ -261,7 +238,7 @@ const bsdsResolver: QueryResolvers["bsds"] = async (_, args, context) => { const size = Math.max(Math.min(first!, MAX_SIZE), MIN_SIZE); await bsdSearchSchema.validate(args.where, { abortEarly: false }); - const query = await buildQuery(args, user, bypassOrgIdsWithListPermission); + const query = await buildQuery(args, user); const sort = buildSort(args); const search_after = await buildSearchAfter(args, sort); return buildResponse({ query, size, sort, search_after }); diff --git a/back/src/bsds/resolvers/queries/controlBsds.ts b/back/src/bsds/resolvers/queries/controlBsds.ts index a08969e9af..9a5efc2fb8 100644 --- a/back/src/bsds/resolvers/queries/controlBsds.ts +++ b/back/src/bsds/resolvers/queries/controlBsds.ts @@ -15,10 +15,13 @@ import { controlBsdSearchSchema } from "../../validation"; * plate * readableId * siret - * @returns + * Cette query est destinée à la fiche établissement. Elle permet de faire une recherche par siret/plaque ou par readableId. + * Pour la recherche par siret/plaque, seuls les bsds en transit (isCollectedFor ou isReturnFor) sont inclus. + * Pour la recherche par readableId, tous les bsds hors draft sont inclus. */ function buildQuery({ where }: QueryControlBsdsArgs) { const must: any[] = []; + const must_not: any[] = []; const should: any[] = []; if (where?.siret) { @@ -38,7 +41,7 @@ function buildQuery({ where }: QueryControlBsdsArgs) { ] } }); - } else { + } else if (!where?.readableId) { must.push({ bool: { should: [ @@ -80,6 +83,11 @@ function buildQuery({ where }: QueryControlBsdsArgs) { } if (where?.readableId) { + must_not.push({ + match: { + status: "DRAFT" + } + }); must.push({ match: { "readableId.ngram": { @@ -92,6 +100,7 @@ function buildQuery({ where }: QueryControlBsdsArgs) { const query = { bool: { must, + must_not, filter: [ { bool: { From 3d4ca98f3e600642fa7550f5bf5fb78d3956c2e6 Mon Sep 17 00:00:00 2001 From: Laurent Paoletti Date: Thu, 7 Nov 2024 19:08:58 +0100 Subject: [PATCH 20/74] Admin enhancements --- Changelog.md | 5 + back/src/bsda/permissions.ts | 3 + .../queries/__tests__/bsda.integration.ts | 74 ++++++++++ back/src/bsdasris/permissions.ts | 3 + .../queries/__tests__/bsdasri.integration.ts | 22 +++ back/src/bsffs/database.ts | 2 +- back/src/bsffs/permissions.ts | 3 + .../queries/__tests__/bsff.integration.ts | 48 +++++++ back/src/bspaoh/permissions.ts | 3 + .../queries/__tests__/bspaoh.integration.ts | 15 +++ back/src/bsvhu/permissions.ts | 3 + .../queries/__tests__/bsvhu.integration.ts | 79 ++++++++++- back/src/forms/permissions.ts | 3 + .../queries/__tests__/form.integration.ts | 35 +++++ back/src/routers/auth-router.ts | 2 +- .../Dashboard/Creation/bspaoh/FormSteps.tsx | 2 +- .../Creation/bspaoh/utils/queries.ts | 45 ------- .../Creation/bsvhu/BsvhuFormSteps.tsx | 2 +- .../BSPaoh/WorkflowAction/SignBspaohModal.tsx | 3 +- .../BSPaoh/WorkflowAction/SignDelivery.tsx | 2 +- .../BSPaoh/WorkflowAction/SignEmission.tsx | 2 +- .../BSPaoh/WorkflowAction/SignOperation.tsx | 2 +- .../BSPaoh/WorkflowAction/SignReception.tsx | 2 +- .../BSPaoh/WorkflowAction/SignTransport.tsx | 2 +- .../workflow/Act/ActBsvhuValidation.test.tsx | 2 +- .../src/Apps/common/queries/bspaoh/queries.ts | 34 +++++ .../utils => common/queries/bsvhu}/queries.ts | 10 +- front/src/admin/bsd/BsdAdmin.tsx | 41 +++--- front/src/admin/bsd/BsdDetailContent.tsx | 127 ++++++++++++++++-- front/src/admin/user/impersonate.tsx | 19 ++- .../BSVhu/BSVhuActions/useDownloadPdf.tsx | 12 +- .../BSVhu/WorkflowAction/SignBsvhu.tsx | 10 -- .../BSVhu/WorkflowAction/SignBsvhuModal.tsx | 2 +- .../BSVhu/WorkflowAction/SignEmission.tsx | 3 +- .../BSVhu/WorkflowAction/SignOperation.tsx | 5 +- .../BSVhu/WorkflowAction/SignTransport.tsx | 5 +- .../detail/bsff/BsffDetailContent.tsx | 2 +- .../detail/bspaoh/RouteBSPaohView.tsx | 3 +- .../detail/bsvhu/RouteBsvhusView.tsx | 2 +- 39 files changed, 514 insertions(+), 125 deletions(-) delete mode 100644 front/src/Apps/Dashboard/Creation/bspaoh/utils/queries.ts rename front/src/Apps/{Dashboard/Creation/bsvhu/utils => common/queries/bsvhu}/queries.ts (89%) diff --git a/Changelog.md b/Changelog.md index 2760110bbd..1b62684b7e 100644 --- a/Changelog.md +++ b/Changelog.md @@ -4,6 +4,11 @@ Les changements importants de Trackdéchets sont documentés dans ce fichier. Le format est basé sur [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), et le projet suit un schéma de versionning inspiré de [Calendar Versioning](https://calver.org/). +[2024.11.1] 19/11/2024 + +#### :house: Interne + +- Amélioration de l'interface d'admin [PR 3735](https://github.com/MTES-MCT/trackdechets/pull/3735) # [2024.11.1] 19/11/2024 diff --git a/back/src/bsda/permissions.ts b/back/src/bsda/permissions.ts index 8d31739daf..5566ab96c1 100644 --- a/back/src/bsda/permissions.ts +++ b/back/src/bsda/permissions.ts @@ -190,6 +190,9 @@ async function creators(input: BsdaInput) { } export async function checkCanRead(user: User, bsda: BsdaWithTransporters) { + if (user.isAdmin && user.isActive) { + return true; + } const authorizedOrgIds = readers(bsda); return checkUserPermissions( diff --git a/back/src/bsda/resolvers/queries/__tests__/bsda.integration.ts b/back/src/bsda/resolvers/queries/__tests__/bsda.integration.ts index 7f30792390..8ef9aea5c9 100644 --- a/back/src/bsda/resolvers/queries/__tests__/bsda.integration.ts +++ b/back/src/bsda/resolvers/queries/__tests__/bsda.integration.ts @@ -9,6 +9,7 @@ import { import makeClient from "../../../../__tests__/testClient"; import { fullBsda } from "../../../fragments"; import { bsdaFactory } from "../../../__tests__/factories"; +import { ErrorCode } from "../../../../common/errors"; const GET_BSDA = gql` query GetBsda($id: ID!) { @@ -22,6 +23,79 @@ const GET_BSDA = gql` describe("Query.Bsda", () => { afterEach(resetDatabase); + it("should disallow unauthenticated user", async () => { + const { query } = makeClient(); + const { company } = await userWithCompanyFactory("MEMBER"); + + const bsda = await bsdaFactory({ + opt: { + emitterCompanySiret: company.siret + } + }); + + const { errors } = await query>(GET_BSDA, { + variables: { id: bsda.id } + }); + + expect(errors).toEqual([ + expect.objectContaining({ + message: "Vous n'êtes pas connecté.", + extensions: expect.objectContaining({ + code: ErrorCode.UNAUTHENTICATED + }) + }) + ]); + }); + + it("should forbid access to user not on the bsd", async () => { + const { company } = await userWithCompanyFactory("MEMBER"); + + const bsda = await bsdaFactory({ + opt: { + emitterCompanySiret: company.siret + } + }); + const { user: otherUser } = await userWithCompanyFactory("MEMBER"); + + const { query } = makeClient(otherUser); + + const { errors } = await query>(GET_BSDA, { + variables: { id: bsda.id } + }); + + expect(errors).toEqual([ + expect.objectContaining({ + message: "Vous n'êtes pas autorisé à accéder à ce bordereau", + extensions: expect.objectContaining({ + code: ErrorCode.FORBIDDEN + }) + }) + ]); + }); + + it("should allow access to admin user not on the bsd", async () => { + const { company } = await userWithCompanyFactory("MEMBER"); + + const bsda = await bsdaFactory({ + opt: { + emitterCompanySiret: company.siret + } + }); + const { user: otherUser } = await userWithCompanyFactory( + "MEMBER", + {}, + { isAdmin: true } + ); + + const { query } = makeClient(otherUser); + + const { data } = await query>(GET_BSDA, { + variables: { id: bsda.id } + }); + + expect(data.bsda.id).toBe(bsda.id); + }); + it("should get a bsda by id", async () => { const { user, company } = await userWithCompanyFactory(UserRole.ADMIN); const form = await bsdaFactory({ diff --git a/back/src/bsdasris/permissions.ts b/back/src/bsdasris/permissions.ts index b5e9ba5525..60035a9757 100644 --- a/back/src/bsdasris/permissions.ts +++ b/back/src/bsdasris/permissions.ts @@ -80,6 +80,9 @@ function creators(input: BsdasriInput) { } export function checkCanRead(user: User, bsdasri: Bsdasri) { + if (user.isAdmin && user.isActive) { + return true; + } const authorizedOrgIds = readers(bsdasri); return checkUserPermissions( user, diff --git a/back/src/bsdasris/resolvers/queries/__tests__/bsdasri.integration.ts b/back/src/bsdasris/resolvers/queries/__tests__/bsdasri.integration.ts index 72ccda2359..a5bc7d5f65 100644 --- a/back/src/bsdasris/resolvers/queries/__tests__/bsdasri.integration.ts +++ b/back/src/bsdasris/resolvers/queries/__tests__/bsdasri.integration.ts @@ -75,6 +75,28 @@ describe("Query.Bsdasri", () => { ]); }); + it("should allow access to admin user not on the bsd", async () => { + const { company } = await userWithCompanyFactory("MEMBER"); + const { company: destination } = await userWithCompanyFactory("MEMBER"); + const dasri = await bsdasriFactory({ + opt: { + ...initialData(company), + ...readyToPublishData(destination) + } + }); + const { user: otherUser } = await userWithCompanyFactory( + "MEMBER", + {}, + { isAdmin: true } + ); + + const { query } = makeClient(otherUser); + const { data } = await query>(GET_BSDASRI, { + variables: { id: dasri.id } + }); + expect(data.bsdasri.id).toBe(dasri.id); + }); + it("should get a dasri by id", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); const { company: destination } = await userWithCompanyFactory("MEMBER"); diff --git a/back/src/bsffs/database.ts b/back/src/bsffs/database.ts index 5dd082689e..dc256beed7 100644 --- a/back/src/bsffs/database.ts +++ b/back/src/bsffs/database.ts @@ -160,7 +160,7 @@ export async function getFicheInterventions({ expandFicheInterventionBsffFromDB ); - if (isBsffReader) { + if (isBsffReader || user.isAdmin) { return expandedFicheInterventions; } diff --git a/back/src/bsffs/permissions.ts b/back/src/bsffs/permissions.ts index 1919c6ca9e..031b58eaff 100644 --- a/back/src/bsffs/permissions.ts +++ b/back/src/bsffs/permissions.ts @@ -119,6 +119,9 @@ function creators(input: BsffInput) { } export async function checkCanRead(user: User, bsff: BsffWithTransporters) { + if (user.isAdmin && user.isActive) { + return true; + } const authorizedOrgIds = readers(bsff); return checkUserPermissions( diff --git a/back/src/bsffs/resolvers/queries/__tests__/bsff.integration.ts b/back/src/bsffs/resolvers/queries/__tests__/bsff.integration.ts index e8be0f1b07..de0264fd1b 100644 --- a/back/src/bsffs/resolvers/queries/__tests__/bsff.integration.ts +++ b/back/src/bsffs/resolvers/queries/__tests__/bsff.integration.ts @@ -13,6 +13,7 @@ import { } from "../../../__tests__/factories"; import { gql } from "graphql-tag"; import { fullBsff } from "../../../fragments"; +import { ErrorCode } from "../../../../common/errors"; const GET_BSFF = gql` query GetBsff($id: ID!) { @@ -25,6 +26,29 @@ const GET_BSFF = gql` describe("Query.bsff", () => { afterEach(resetDatabase); + it("should disallow unauthenticated user", async () => { + const emitter = await userWithCompanyFactory(UserRole.ADMIN); + const bsff = await createBsff({ emitter }); + + const { query } = makeClient(); + const { errors } = await query, QueryBsffArgs>( + GET_BSFF, + { + variables: { + id: bsff.id + } + } + ); + + expect(errors).toEqual([ + expect.objectContaining({ + message: "Vous n'êtes pas connecté.", + extensions: expect.objectContaining({ + code: ErrorCode.UNAUTHENTICATED + }) + }) + ]); + }); it("should allow the emitter to read their bsff", async () => { const emitter = await userWithCompanyFactory(UserRole.ADMIN); @@ -90,6 +114,30 @@ describe("Query.bsff", () => { ]); }); + it("should allow admin user even if the user is not a contributor of the bsff", async () => { + const { user } = await userWithCompanyFactory( + UserRole.ADMIN, + {}, + { isAdmin: true } + ); + + const otherEmitter = await userWithCompanyFactory(UserRole.ADMIN); + const bsff = await createBsff({ emitter: otherEmitter }); + + const { query } = makeClient(user); + const { data } = await query, QueryBsffArgs>(GET_BSFF, { + variables: { + id: bsff.id + } + }); + + expect(data.bsff).toEqual( + expect.objectContaining({ + id: bsff.id + }) + ); + }); + it("should throw an error not found if the user is not a contributor of the bsff", async () => { const emitter = await userWithCompanyFactory(UserRole.ADMIN); diff --git a/back/src/bspaoh/permissions.ts b/back/src/bspaoh/permissions.ts index b6ae039ea4..45d3ee9672 100644 --- a/back/src/bspaoh/permissions.ts +++ b/back/src/bspaoh/permissions.ts @@ -60,6 +60,9 @@ function readers(bspaoh: PrismaBspaoh): string[] { } export function checkCanRead(user: User, bspaoh: PrismaBspaoh) { + if (user.isAdmin && user.isActive) { + return true; + } const authorizedOrgIds = readers(bspaoh); return checkUserPermissions( diff --git a/back/src/bspaoh/resolvers/queries/__tests__/bspaoh.integration.ts b/back/src/bspaoh/resolvers/queries/__tests__/bspaoh.integration.ts index dbb2391469..32a28bd4ed 100644 --- a/back/src/bspaoh/resolvers/queries/__tests__/bspaoh.integration.ts +++ b/back/src/bspaoh/resolvers/queries/__tests__/bspaoh.integration.ts @@ -62,6 +62,21 @@ describe("Query.Bspaoh", () => { ]); }); + it("should allow access to admin user not on the bsd", async () => { + const paoh = await bspaohFactory({}); + const { user: otherUser } = await userWithCompanyFactory( + "MEMBER", + {}, + { isAdmin: true } + ); + + const { query } = makeClient(otherUser); + const { data } = await query>(GET_BSPAOH, { + variables: { id: paoh.id } + }); + expect(data.bspaoh.id).toBe(paoh.id); + }); + it("should get a draft bspaoh if user siret belongs to allowed draft sirets", async () => { const { user, company } = await userWithCompanyFactory(UserRole.ADMIN); const bsd = await bspaohFactory({ diff --git a/back/src/bsvhu/permissions.ts b/back/src/bsvhu/permissions.ts index 434030dec3..052564390f 100644 --- a/back/src/bsvhu/permissions.ts +++ b/back/src/bsvhu/permissions.ts @@ -112,6 +112,9 @@ function creators(input: BsvhuInput) { } export async function checkCanRead(user: User, bsvhu: Bsvhu) { + if (user.isAdmin && user.isActive) { + return true; + } const authorizedOrgIds = readers(bsvhu); return checkUserPermissions( diff --git a/back/src/bsvhu/resolvers/queries/__tests__/bsvhu.integration.ts b/back/src/bsvhu/resolvers/queries/__tests__/bsvhu.integration.ts index b212f84e46..f1fe73ec4c 100644 --- a/back/src/bsvhu/resolvers/queries/__tests__/bsvhu.integration.ts +++ b/back/src/bsvhu/resolvers/queries/__tests__/bsvhu.integration.ts @@ -9,6 +9,7 @@ import { bsvhuFactory, toIntermediaryCompany } from "../../../__tests__/factories.vhu"; +import { ErrorCode } from "../../../../common/errors"; const GET_BSVHU = ` query GetBsvhu($id: ID!) { @@ -70,9 +71,32 @@ query GetBsvhu($id: ID!) { describe("Query.Bsvhu", () => { afterEach(resetDatabase); + it("should disallow unauthenticated user", async () => { + const { query } = makeClient(); + const { company } = await userWithCompanyFactory("MEMBER"); + + const bsvhu = await bsvhuFactory({ + opt: { + emitterCompanySiret: company.siret + } + }); + + const { errors } = await query>(GET_BSVHU, { + variables: { id: bsvhu.id } + }); + expect(errors).toEqual([ + expect.objectContaining({ + message: "Vous n'êtes pas connecté.", + extensions: expect.objectContaining({ + code: ErrorCode.UNAUTHENTICATED + }) + }) + ]); + }); + it("should get a bsvhu by id", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); - const form = await bsvhuFactory({ + const bsvhu = await bsvhuFactory({ opt: { emitterCompanySiret: company.siret } @@ -81,10 +105,59 @@ describe("Query.Bsvhu", () => { const { query } = makeClient(user); const { data } = await query>(GET_BSVHU, { - variables: { id: form.id } + variables: { id: bsvhu.id } + }); + + expect(data.bsvhu.id).toBe(bsvhu.id); + }); + + it("should forbid access to user not on the bsd", async () => { + const { company } = await userWithCompanyFactory("MEMBER"); + + const bsvhu = await bsvhuFactory({ + opt: { + emitterCompanySiret: company.siret + } + }); + const { user: otherUser } = await userWithCompanyFactory("MEMBER"); + + const { query } = makeClient(otherUser); + + const { errors } = await query>(GET_BSVHU, { + variables: { id: bsvhu.id } + }); + + expect(errors).toEqual([ + expect.objectContaining({ + message: "Vous n'êtes pas autorisé à accéder à ce bordereau", + extensions: expect.objectContaining({ + code: ErrorCode.FORBIDDEN + }) + }) + ]); + }); + + it("should allow access to admin user not on the bsd", async () => { + const { company } = await userWithCompanyFactory("MEMBER"); + + const bsvhu = await bsvhuFactory({ + opt: { + emitterCompanySiret: company.siret + } + }); + const { user: otherUser } = await userWithCompanyFactory( + "MEMBER", + {}, + { isAdmin: true } + ); + + const { query } = makeClient(otherUser); + + const { data } = await query>(GET_BSVHU, { + variables: { id: bsvhu.id } }); - expect(data.bsvhu.id).toBe(form.id); + expect(data.bsvhu.id).toBe(bsvhu.id); }); it("should get a bsvhu by id if current user is an intermediary", async () => { diff --git a/back/src/forms/permissions.ts b/back/src/forms/permissions.ts index 1d481c6031..80c6ea0298 100644 --- a/back/src/forms/permissions.ts +++ b/back/src/forms/permissions.ts @@ -220,6 +220,9 @@ export function isFormReader( } export async function checkCanRead(user: User, form: FormForReadCheck) { + if (user.isAdmin && user.isActive) { + return true; + } const authorizedOrgIds = formReaders(form); return checkUserPermissions( diff --git a/back/src/forms/resolvers/queries/__tests__/form.integration.ts b/back/src/forms/resolvers/queries/__tests__/form.integration.ts index a94daba2a4..260eed1090 100644 --- a/back/src/forms/resolvers/queries/__tests__/form.integration.ts +++ b/back/src/forms/resolvers/queries/__tests__/form.integration.ts @@ -16,6 +16,7 @@ import { } from "../../../../__tests__/factories"; import makeClient from "../../../../__tests__/testClient"; import getReadableId from "../../../readableId"; +import { ErrorCode } from "../../../../common/errors"; const GET_FORM_QUERY = ` query GetForm($id: ID, $readableId: String) { @@ -71,6 +72,26 @@ async function createForm( describe("Query.form", () => { afterEach(() => resetDatabase()); + it("should disallow unauthenticated user", async () => { + const form = await createForm({}); + + const { query } = makeClient(); + const { errors } = await query>(GET_FORM_QUERY, { + variables: { + id: form.id + } + }); + + expect(errors).toEqual([ + expect.objectContaining({ + message: "Vous n'êtes pas connecté.", + extensions: expect.objectContaining({ + code: ErrorCode.UNAUTHENTICATED + }) + }) + ]); + }); + it.each(["emitter", "recipient", "transporter"])( "should allow user from the %p company to read their form", async type => { @@ -161,6 +182,20 @@ describe("Query.form", () => { ); }); + it("should allow access to admin user not on the bsd", async () => { + const user = await userFactory({ isAdmin: true }); + const form = await createForm({}); + + const { query } = makeClient(user); + const { data } = await query>(GET_FORM_QUERY, { + variables: { + id: form.id + } + }); + + expect(data.form.id).toBe(form.id); + }); + it("should return a form based on its readableId", async () => { const { user, company } = await userWithCompanyFactory("ADMIN"); const form = await createForm({ diff --git a/back/src/routers/auth-router.ts b/back/src/routers/auth-router.ts index 2fceb91d0a..ddcc8a1c0b 100644 --- a/back/src/routers/auth-router.ts +++ b/back/src/routers/auth-router.ts @@ -72,7 +72,7 @@ authRouter.post<{ email: string }>("/impersonate", async (req, res) => { const parsedBody = z .object({ - email: z.string().email() + email: z.string().trim().email() }) .parse(req.body); diff --git a/front/src/Apps/Dashboard/Creation/bspaoh/FormSteps.tsx b/front/src/Apps/Dashboard/Creation/bspaoh/FormSteps.tsx index 6e02b42a38..d900ec675c 100644 --- a/front/src/Apps/Dashboard/Creation/bspaoh/FormSteps.tsx +++ b/front/src/Apps/Dashboard/Creation/bspaoh/FormSteps.tsx @@ -27,7 +27,7 @@ import { CREATE_DRAFT_BSPAOH, GET_BSPAOH, UPDATE_BSPAOH -} from "./utils/queries"; +} from "../../../../Apps/common/queries/bspaoh/queries"; import { Waste } from "./steps/Waste"; import { Emitter } from "./steps/Emitter"; import { Transporter } from "./steps/Transporter"; diff --git a/front/src/Apps/Dashboard/Creation/bspaoh/utils/queries.ts b/front/src/Apps/Dashboard/Creation/bspaoh/utils/queries.ts deleted file mode 100644 index 3ed7811946..0000000000 --- a/front/src/Apps/Dashboard/Creation/bspaoh/utils/queries.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { gql } from "@apollo/client"; - -import { fullBspaohFragment } from "../../../../common/queries/fragments"; - -export const GET_BSPAOH = gql` - query Bspaoh($id: ID!) { - bspaoh(id: $id) { - ...BspaohFragment - } - } - ${fullBspaohFragment} -`; - -export const CREATE_DRAFT_BSPAOH = gql` - mutation CreateDraftBspaoh($input: BspaohInput!) { - createDraftBspaoh(input: $input) { - id - } - } -`; - -export const CREATE_BSPAOH = gql` - mutation CreateBspaoh($input: BspaohInput!) { - createBspaoh(input: $input) { - id - } - } -`; - -export const UPDATE_BSPAOH = gql` - mutation UpdateBspaoh($input: BspaohInput!, $id: ID!) { - updateBspaoh(input: $input, id: $id) { - id - } - } -`; - -export const SIGN_BSPAOH = gql` - mutation SignBspaoh($id: ID!, $input: BspaohSignatureInput!) { - signBspaoh(id: $id, input: $input) { - id - status - } - } -`; diff --git a/front/src/Apps/Dashboard/Creation/bsvhu/BsvhuFormSteps.tsx b/front/src/Apps/Dashboard/Creation/bsvhu/BsvhuFormSteps.tsx index 8bdd3e8c46..753d3f18c3 100644 --- a/front/src/Apps/Dashboard/Creation/bsvhu/BsvhuFormSteps.tsx +++ b/front/src/Apps/Dashboard/Creation/bsvhu/BsvhuFormSteps.tsx @@ -27,7 +27,7 @@ import { CREATE_DRAFT_VHU, GET_VHU_FORM, UPDATE_VHU_FORM -} from "./utils/queries"; +} from "../../../../Apps/common/queries/bsvhu/queries"; import { cleanPayload } from "../bspaoh/utils/payload"; import { getErrorTabIds, diff --git a/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignBspaohModal.tsx b/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignBspaohModal.tsx index 392b22cd20..2bd622f5f2 100644 --- a/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignBspaohModal.tsx +++ b/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignBspaohModal.tsx @@ -1,7 +1,8 @@ import { useQuery } from "@apollo/client"; import { Loader } from "../../../../common/Components"; -import { GET_BSPAOH } from "../../../Creation/bspaoh/utils/queries"; +import { GET_BSPAOH } from "../../../../../Apps/common/queries/bspaoh/queries"; + import { Query, QueryBspaohArgs } from "@td/codegen-ui"; import React from "react"; import { BspaohSummary } from "./BspaohSummary"; diff --git a/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignDelivery.tsx b/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignDelivery.tsx index ed197c1be2..f79d22b213 100644 --- a/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignDelivery.tsx +++ b/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignDelivery.tsx @@ -1,6 +1,6 @@ import { useMutation } from "@apollo/client"; -import { SIGN_BSPAOH } from "../../../Creation/bspaoh/utils/queries"; +import { SIGN_BSPAOH } from "../../../../../Apps/common/queries/bspaoh/queries"; import { Input } from "@codegouvfr/react-dsfr/Input"; import { Button } from "@codegouvfr/react-dsfr/Button"; import { diff --git a/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignEmission.tsx b/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignEmission.tsx index f085866154..37aec1e8ea 100644 --- a/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignEmission.tsx +++ b/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignEmission.tsx @@ -16,7 +16,7 @@ import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { SignBspaoh } from "./SignBspaoh"; import { subMonths } from "date-fns"; -import { SIGN_BSPAOH } from "../../../Creation/bspaoh/utils/queries"; +import { SIGN_BSPAOH } from "../../../../../Apps/common/queries/bspaoh/queries"; import { datetimeToYYYYMMDDHHSS } from "../paohUtils"; import { SignatureTimestamp } from "./components/Signature"; diff --git a/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignOperation.tsx b/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignOperation.tsx index 373a0a9195..4c5f9cd2af 100644 --- a/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignOperation.tsx +++ b/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignOperation.tsx @@ -3,7 +3,7 @@ import { useMutation } from "@apollo/client"; import { UPDATE_BSPAOH, SIGN_BSPAOH -} from "../../../Creation/bspaoh/utils/queries"; +} from "../../../../../Apps/common/queries/bspaoh/queries"; import { Alert } from "@codegouvfr/react-dsfr/Alert"; import { Input } from "@codegouvfr/react-dsfr/Input"; import { Button } from "@codegouvfr/react-dsfr/Button"; diff --git a/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignReception.tsx b/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignReception.tsx index f31079e018..ef3cd5453b 100644 --- a/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignReception.tsx +++ b/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignReception.tsx @@ -3,7 +3,7 @@ import { useMutation } from "@apollo/client"; import { UPDATE_BSPAOH, SIGN_BSPAOH -} from "../../../Creation/bspaoh/utils/queries"; +} from "../../../../../Apps/common/queries/bspaoh/queries"; import { Alert } from "@codegouvfr/react-dsfr/Alert"; import { Input } from "@codegouvfr/react-dsfr/Input"; diff --git a/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignTransport.tsx b/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignTransport.tsx index 8f1e2faa9a..f869701e0c 100644 --- a/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignTransport.tsx +++ b/front/src/Apps/Dashboard/Validation/BSPaoh/WorkflowAction/SignTransport.tsx @@ -4,7 +4,7 @@ import { Alert } from "@codegouvfr/react-dsfr/Alert"; import { UPDATE_BSPAOH, SIGN_BSPAOH -} from "../../../Creation/bspaoh/utils/queries"; +} from "../../../../../Apps/common/queries/bspaoh/queries"; import { Input } from "@codegouvfr/react-dsfr/Input"; import { Button } from "@codegouvfr/react-dsfr/Button"; import { diff --git a/front/src/Apps/Dashboard/Validation/workflow/Act/ActBsvhuValidation.test.tsx b/front/src/Apps/Dashboard/Validation/workflow/Act/ActBsvhuValidation.test.tsx index c68182c68d..087f47dd6f 100644 --- a/front/src/Apps/Dashboard/Validation/workflow/Act/ActBsvhuValidation.test.tsx +++ b/front/src/Apps/Dashboard/Validation/workflow/Act/ActBsvhuValidation.test.tsx @@ -1,7 +1,7 @@ import { MockedProvider } from "@apollo/client/testing"; import { screen } from "@testing-library/dom"; import { render } from "@testing-library/react"; -import { SIGN_BSVHU } from "../../../../../dashboard/components/BSDList/BSVhu/WorkflowAction/SignBsvhu"; +import { SIGN_BSVHU } from "../../../../../Apps/common/queries/bsvhu/queries"; import { Bsvhu, SignatureTypeInput } from "@td/codegen-ui"; import React from "react"; import ActBsvhuValidation from "./ActBsvhuValidation"; diff --git a/front/src/Apps/common/queries/bspaoh/queries.ts b/front/src/Apps/common/queries/bspaoh/queries.ts index 65e5a4b599..0f0c52c3aa 100644 --- a/front/src/Apps/common/queries/bspaoh/queries.ts +++ b/front/src/Apps/common/queries/bspaoh/queries.ts @@ -9,3 +9,37 @@ export const UPDATE_BSPAOH = gql` } ${fullBspaohFragment} `; + +export const GET_BSPAOH = gql` + query Bspaoh($id: ID!) { + bspaoh(id: $id) { + ...BspaohFragment + } + } + ${fullBspaohFragment} +`; + +export const CREATE_DRAFT_BSPAOH = gql` + mutation CreateDraftBspaoh($input: BspaohInput!) { + createDraftBspaoh(input: $input) { + id + } + } +`; + +export const CREATE_BSPAOH = gql` + mutation CreateBspaoh($input: BspaohInput!) { + createBspaoh(input: $input) { + id + } + } +`; + +export const SIGN_BSPAOH = gql` + mutation SignBspaoh($id: ID!, $input: BspaohSignatureInput!) { + signBspaoh(id: $id, input: $input) { + id + status + } + } +`; diff --git a/front/src/Apps/Dashboard/Creation/bsvhu/utils/queries.ts b/front/src/Apps/common/queries/bsvhu/queries.ts similarity index 89% rename from front/src/Apps/Dashboard/Creation/bsvhu/utils/queries.ts rename to front/src/Apps/common/queries/bsvhu/queries.ts index e9b5bf5d1e..a0800e1ca2 100644 --- a/front/src/Apps/Dashboard/Creation/bsvhu/utils/queries.ts +++ b/front/src/Apps/common/queries/bsvhu/queries.ts @@ -1,5 +1,5 @@ import { gql } from "@apollo/client"; -import { FullBsvhuFragment } from "../../../../common/queries/fragments"; +import { FullBsvhuFragment } from "../fragments"; export const GET_VHU_FORM = gql` query Bsvhu($id: ID!) { @@ -79,16 +79,16 @@ export const UPDATE_VHU_FORM = gql` ${FullBsvhuFragment} `; -export const SIGN_VHU_FORM = gql` +export const SIGN_BSVHU = gql` mutation SignBsvhu($id: ID!, $input: BsvhuSignatureInput!) { signBsvhu(id: $id, input: $input) { - ...FullBsvhu + id + status } } - ${FullBsvhuFragment} `; -export const PDF_VHU_FORM = gql` +export const BSVHU_PDF = gql` query PdfBsvhu($id: ID) { bsvhuPdf(id: $id) { downloadLink diff --git a/front/src/admin/bsd/BsdAdmin.tsx b/front/src/admin/bsd/BsdAdmin.tsx index 6ba4ec2f92..4740bded5e 100644 --- a/front/src/admin/bsd/BsdAdmin.tsx +++ b/front/src/admin/bsd/BsdAdmin.tsx @@ -10,7 +10,8 @@ import { Bsvhu, Form, Query, - UserPermission + UserPermission, + Bsd } from "@td/codegen-ui"; import React, { useState } from "react"; import BsdCard from "../../Apps/Dashboard/Components/BsdCard/BsdCard"; @@ -93,27 +94,35 @@ export function BsdAdmin() { COMPANY_ACCOUNT_ADD_PRIVATE_INFOS ); + const getEmitter = (bsd?: Bsd) => { + if (bsd?.__typename === "Bsff") return (bsd as Bsff)?.["bsffEmitter"]; + return (bsd as Form | Bsda | Bsdasri | Bsvhu | Bspaoh)?.emitter; + }; + const getTransporter = (bsd?: Bsd) => { + if (bsd?.__typename === "Bsff") return (bsd as Bsff)?.["bsffTransporter"]; + return (bsd as Form | Bsda | Bsdasri | Bsvhu | Bspaoh)?.transporter; + }; + + const getDestination = (bsd?: Bsd) => { + if (bsd?.__typename === "Form") return bsd?.recipient; + if (bsd?.__typename === "Bsff") return (bsd as Bsff)?.["bsffDestination"]; + return (bsd as Bsda | Bsdasri | Bsvhu | Bspaoh)?.destination; + }; + const possibleImpersonations = [ [ - data?.bsd?.emitter?.company?.siret, - data?.bsd?.emitter?.company?.name, + getEmitter(data?.bsd)?.company?.siret, + getEmitter(data?.bsd)?.company?.name, "Emetteur" ], [ - data?.bsd?.transporter?.company?.siret, - data?.bsd?.transporter?.company?.name, + getTransporter(data?.bsd)?.company?.siret, + getTransporter(data?.bsd)?.company?.name, "Transporteur" ], [ - (data?.bsd as Form)?.recipient?.company?.siret, - (data?.bsd as Form)?.recipient?.company?.name, - "Destination" - ], - [ - (data?.bsd as Bsda | Bsdasri | Bsff | Bsvhu | Bspaoh)?.destination - ?.company?.siret, - (data?.bsd as Bsda | Bsdasri | Bsff | Bsvhu | Bspaoh)?.destination - ?.company?.name, + getDestination(data?.bsd)?.company?.siret, + getDestination(data?.bsd)?.company?.name, "Destination" ] ].filter(v => Boolean(v[0])); @@ -205,15 +214,14 @@ export function BsdAdmin() { />
    - setIsPreviewOpen(false)} + size="XL" > -

    Impersonation

    La liste des entreprises du bordereau est présentée ci-dessous. Pour @@ -226,7 +234,6 @@ export function BsdAdmin() { headers={possibleImpersonationHeaders} />

    - {errorImpersonate && (

    Erreur lors du chargement des impersonations possibles

    )} diff --git a/front/src/admin/bsd/BsdDetailContent.tsx b/front/src/admin/bsd/BsdDetailContent.tsx index 03458a766f..260e5cb67f 100644 --- a/front/src/admin/bsd/BsdDetailContent.tsx +++ b/front/src/admin/bsd/BsdDetailContent.tsx @@ -6,24 +6,127 @@ import BSDDetailContent from "../../dashboard/detail/bsdd/BSDDetailContent"; import { BsffDetailContent } from "../../dashboard/detail/bsff/BsffDetailContent"; import BspaohDetailContent from "../../dashboard/detail/bspaoh/BspaohDetailContent"; import { BsvhuDetailContent } from "../../dashboard/detail/bsvhu/BsvhuDetailContent"; +import { + QueryFormArgs, + Query, + QueryBsffArgs, + QueryBsdaArgs, + QueryBsvhuArgs, + QueryBsdasriArgs, + QueryBspaohArgs +} from "@td/codegen-ui"; +import { GET_BSFF_FORM } from "../../Apps/common/queries/bsff/queries"; +import { GET_BSDA } from "../../Apps/common/queries/bsda/queries"; +import { GET_FORM } from "../../Apps/common/queries/bsdd/queries"; +import { GET_VHU_FORM } from "../../Apps/common/queries/bsvhu/queries"; +import { GET_BSDASRI } from "../../Apps/common/queries/bsdasri/queries"; +import { GET_BSPAOH } from "../../Apps/common/queries/bspaoh/queries"; +import { NotificationError } from "../../Apps/common/Components/Error/Error"; + +import { useQuery } from "@apollo/client"; +import { Loader } from "../../Apps/common/Components"; export function BsdDetailContent({ bsd }: { bsd: Bsd }) { - if (bsd.__typename === "Bsda") { - return ; + const isBsda = bsd.__typename === "Bsda"; + const isBsdd = bsd.__typename === "Form"; + const isBsvhu = bsd.__typename === "Bsvhu"; + const isBsdasri = bsd.__typename === "Bsdasri"; + const isBsff = bsd.__typename === "Bsff"; + const isBspaoh = bsd.__typename === "Bspaoh"; + + const { + data: bsdaData, + error: bsdaError, + loading: bsdaLoading + } = useQuery, QueryBsdaArgs>(GET_BSDA, { + variables: { id: bsd.id }, + skip: !isBsda + }); + + const { + data: bsddData, + error: bsddError, + loading: bsddLoading + } = useQuery, QueryFormArgs>(GET_FORM, { + variables: { id: bsd.id }, + skip: !isBsdd + }); + + const { + data: bsvhuData, + error: bsvhuError, + loading: bsvhuLoading + } = useQuery, QueryBsvhuArgs>(GET_VHU_FORM, { + variables: { id: bsd.id }, + skip: !isBsvhu + }); + + const { + data: bsdasriData, + error: bsdasriError, + loading: bsdasriLoading + } = useQuery, QueryBsdasriArgs>(GET_BSDASRI, { + variables: { id: bsd.id }, + skip: !isBsdasri + }); + + const { + data: bsffData, + error: bsffError, + loading: bsffLoading + } = useQuery, QueryBsffArgs>(GET_BSFF_FORM, { + variables: { id: bsd.id }, + skip: !isBsff + }); + + const { + data: bspaohData, + error: bspaohError, + loading: bspaohLoading + } = useQuery, QueryBspaohArgs>(GET_BSPAOH, { + variables: { id: bsd.id }, + skip: !isBspaoh + }); + + const loading = + bsffLoading || + bsdaLoading || + bsddLoading || + bsvhuLoading || + bsdasriLoading || + bspaohLoading; + + const error = + bsdaError || + bsddError || + bsffError || + bsvhuError || + bsdasriError || + bspaohError; + if (loading) { + return ; + } + + if (error) { + return ; + } + + if (isBsda && !!bsdaData) { + return ; } - if (bsd.__typename === "Form") { - return ; + if (isBsdd && !!bsddData) { + return ; } - if (bsd.__typename === "Bsvhu") { - return ; + if (isBsvhu && !!bsvhuData) { + return ; } - if (bsd.__typename === "Bsdasri") { - return ; + if (isBsdasri && bsdasriData) { + return ; } - if (bsd.__typename === "Bsff") { - return ; + if (isBsff && !!bsffData) { + return ; } - if (bsd.__typename === "Bspaoh") { - return ; + if (isBspaoh && !!bspaohData) { + return ; } } diff --git a/front/src/admin/user/impersonate.tsx b/front/src/admin/user/impersonate.tsx index b2956f9146..153d307919 100644 --- a/front/src/admin/user/impersonate.tsx +++ b/front/src/admin/user/impersonate.tsx @@ -4,8 +4,9 @@ import Input from "@codegouvfr/react-dsfr/Input"; import { Table } from "@codegouvfr/react-dsfr/Table"; import { Query } from "@td/codegen-ui"; import React from "react"; +import { SIRET_STORAGE_KEY } from "../../Apps/common/Components/CompanySwitcher/CompanySwitcher"; -const COMPANY_ACCOUNT_ADD_PRIVATE_INFOS = gql` +const COMPANY_PRIVATE_INFOS = gql` query CompanyPrivateInfos($clue: String!) { companyPrivateInfos(clue: $clue) { orgId @@ -28,7 +29,7 @@ const { VITE_API_ENDPOINT } = import.meta.env; export function Impersonate() { const [search, { loading, error, data }] = useLazyQuery< Pick - >(COMPANY_ACCOUNT_ADD_PRIVATE_INFOS); + >(COMPANY_PRIVATE_INFOS); const tableHeaders = ["Email", "Rôle", "Action"]; const tableData = @@ -37,7 +38,19 @@ export function Impersonate() { infos.role,
    - diff --git a/front/src/dashboard/components/BSDList/BSVhu/BSVhuActions/useDownloadPdf.tsx b/front/src/dashboard/components/BSDList/BSVhu/BSVhuActions/useDownloadPdf.tsx index 90dbb6d018..d9a724d9a0 100644 --- a/front/src/dashboard/components/BSDList/BSVhu/BSVhuActions/useDownloadPdf.tsx +++ b/front/src/dashboard/components/BSDList/BSVhu/BSVhuActions/useDownloadPdf.tsx @@ -1,14 +1,6 @@ -import { gql, LazyQueryHookOptions, useLazyQuery } from "@apollo/client"; +import { LazyQueryHookOptions, useLazyQuery } from "@apollo/client"; import { Query, QueryBsvhuPdfArgs } from "@td/codegen-ui"; - -export const BSVHU_PDF = gql` - query Bsdasridf($id: ID!) { - bsvhuPdf(id: $id) { - downloadLink - token - } - } -`; +import { BSVHU_PDF } from "../../../../../Apps/common/queries/bsvhu/queries"; export function useDownloadPdf( options: LazyQueryHookOptions, QueryBsvhuPdfArgs> diff --git a/front/src/dashboard/components/BSDList/BSVhu/WorkflowAction/SignBsvhu.tsx b/front/src/dashboard/components/BSDList/BSVhu/WorkflowAction/SignBsvhu.tsx index 2379e11212..41bfb534b2 100644 --- a/front/src/dashboard/components/BSDList/BSVhu/WorkflowAction/SignBsvhu.tsx +++ b/front/src/dashboard/components/BSDList/BSVhu/WorkflowAction/SignBsvhu.tsx @@ -1,18 +1,8 @@ -import { gql } from "@apollo/client"; import { ActionButton } from "../../../../../common/components"; import { IconCheckCircle1 } from "../../../../../Apps/common/Components/Icons/Icons"; import React, { useState } from "react"; import { SignBsvhuModal } from "./SignBsvhuModal"; -export const SIGN_BSVHU = gql` - mutation SignBsvhu($id: ID!, $input: BsvhuSignatureInput!) { - signBsvhu(id: $id, input: $input) { - id - status - } - } -`; - type Props = { title: string; bsvhuId: string; diff --git a/front/src/dashboard/components/BSDList/BSVhu/WorkflowAction/SignBsvhuModal.tsx b/front/src/dashboard/components/BSDList/BSVhu/WorkflowAction/SignBsvhuModal.tsx index 839094ab9d..7a711644b1 100644 --- a/front/src/dashboard/components/BSDList/BSVhu/WorkflowAction/SignBsvhuModal.tsx +++ b/front/src/dashboard/components/BSDList/BSVhu/WorkflowAction/SignBsvhuModal.tsx @@ -1,7 +1,7 @@ import { useQuery } from "@apollo/client"; import { Modal } from "../../../../../common/components"; import { Loader } from "../../../../../Apps/common/Components"; -import { GET_VHU_FORM } from "../../../../../Apps/Dashboard/Creation/bsvhu/utils/queries"; +import { GET_VHU_FORM } from "../../../../../Apps/common/queries/bsvhu/queries"; import { Query, QueryBsvhuArgs } from "@td/codegen-ui"; import React from "react"; import { BsvhuSummary } from "./BsvhuSummary"; diff --git a/front/src/dashboard/components/BSDList/BSVhu/WorkflowAction/SignEmission.tsx b/front/src/dashboard/components/BSDList/BSVhu/WorkflowAction/SignEmission.tsx index e3d8f7bea2..05f9a6ddce 100644 --- a/front/src/dashboard/components/BSDList/BSVhu/WorkflowAction/SignEmission.tsx +++ b/front/src/dashboard/components/BSDList/BSVhu/WorkflowAction/SignEmission.tsx @@ -10,7 +10,8 @@ import { import React from "react"; import { generatePath, Link, useLocation } from "react-router-dom"; import * as yup from "yup"; -import { SignBsvhu, SIGN_BSVHU } from "./SignBsvhu"; +import { SignBsvhu } from "./SignBsvhu"; +import { SIGN_BSVHU } from "../../../../../Apps/common/queries/bsvhu/queries"; import DateInput from "../../../../../form/common/components/custom-inputs/DateInput"; import { subMonths } from "date-fns"; diff --git a/front/src/dashboard/components/BSDList/BSVhu/WorkflowAction/SignOperation.tsx b/front/src/dashboard/components/BSDList/BSVhu/WorkflowAction/SignOperation.tsx index edce00c5de..3bbc2b3c53 100644 --- a/front/src/dashboard/components/BSDList/BSVhu/WorkflowAction/SignOperation.tsx +++ b/front/src/dashboard/components/BSDList/BSVhu/WorkflowAction/SignOperation.tsx @@ -1,7 +1,7 @@ import { useMutation } from "@apollo/client"; import { RedErrorMessage } from "../../../../../common/components"; import Operation from "../../../../../form/bsvhu/Operation"; -import { UPDATE_VHU_FORM } from "../../../../../Apps/Dashboard/Creation/bsvhu/utils/queries"; +import { UPDATE_VHU_FORM } from "../../../../../Apps/common/queries/bsvhu/queries"; import { getComputedState } from "../../../../../Apps/Dashboard/Creation/getComputedState"; import { Field, Form, Formik } from "formik"; import { @@ -12,7 +12,8 @@ import { } from "@td/codegen-ui"; import React from "react"; import * as yup from "yup"; -import { SignBsvhu, SIGN_BSVHU } from "./SignBsvhu"; +import { SignBsvhu } from "./SignBsvhu"; +import { SIGN_BSVHU } from "../../../../../Apps/common/queries/bsvhu/queries"; import DateInput from "../../../../../form/common/components/custom-inputs/DateInput"; import { subMonths } from "date-fns"; import { getInitialCompany } from "../../../../../Apps/common/data/initialState"; diff --git a/front/src/dashboard/components/BSDList/BSVhu/WorkflowAction/SignTransport.tsx b/front/src/dashboard/components/BSDList/BSVhu/WorkflowAction/SignTransport.tsx index a6a5ee7632..4b7d16ac85 100644 --- a/front/src/dashboard/components/BSDList/BSVhu/WorkflowAction/SignTransport.tsx +++ b/front/src/dashboard/components/BSDList/BSVhu/WorkflowAction/SignTransport.tsx @@ -1,7 +1,7 @@ import { useMutation } from "@apollo/client"; import { RedErrorMessage } from "../../../../../common/components"; import routes from "../../../../../Apps/routes"; -import { UPDATE_VHU_FORM } from "../../../../../Apps/Dashboard/Creation/bsvhu/utils/queries"; +import { UPDATE_VHU_FORM } from "../../../../../Apps/common/queries/bsvhu/queries"; import TransporterRecepisseWrapper from "../../../../../form/common/components/company/TransporterRecepisseWrapper"; import DateInput from "../../../../../form/common/components/custom-inputs/DateInput"; import { Field, Form, Formik } from "formik"; @@ -15,7 +15,8 @@ import { import React from "react"; import { generatePath, Link, useLocation } from "react-router-dom"; import * as yup from "yup"; -import { SignBsvhu, SIGN_BSVHU } from "./SignBsvhu"; +import { SignBsvhu } from "./SignBsvhu"; +import { SIGN_BSVHU } from "../../../../../Apps/common/queries/bsvhu/queries"; import { subMonths } from "date-fns"; const validationSchema = yup.object({ diff --git a/front/src/dashboard/detail/bsff/BsffDetailContent.tsx b/front/src/dashboard/detail/bsff/BsffDetailContent.tsx index 4c6117ec25..b1253ecb9d 100644 --- a/front/src/dashboard/detail/bsff/BsffDetailContent.tsx +++ b/front/src/dashboard/detail/bsff/BsffDetailContent.tsx @@ -49,7 +49,7 @@ type CompanyProps = { type Props = { form: Bsff }; export function BsffDetailContent({ form: bsff }: Props) { - const { siret } = useParams<{ siret: string }>(); + const { siret = "" } = useParams<{ siret: string }>(); const [isDeleting, setIsDeleting] = useState(false); const [downloadPdf] = useDownloadPdf({ variables: { id: bsff.id } }); const { permissions } = usePermissions(); diff --git a/front/src/dashboard/detail/bspaoh/RouteBSPaohView.tsx b/front/src/dashboard/detail/bspaoh/RouteBSPaohView.tsx index 679c0ddb10..5dc3db9e30 100644 --- a/front/src/dashboard/detail/bspaoh/RouteBSPaohView.tsx +++ b/front/src/dashboard/detail/bspaoh/RouteBSPaohView.tsx @@ -4,7 +4,8 @@ import Loader from "../../../Apps/common/Components/Loader/Loaders"; import { useQuery } from "@apollo/client"; import { Query, QueryBspaohArgs } from "@td/codegen-ui"; import { useParams } from "react-router-dom"; -import { GET_BSPAOH } from "../../../Apps/Dashboard/Creation/bspaoh/utils/queries"; +import { GET_BSPAOH } from "../../../Apps/common/queries/bspaoh/queries"; + import { InlineError } from "../../../Apps/common/Components/Error/Error"; import EmptyDetail from "../common/EmptyDetailView"; diff --git a/front/src/dashboard/detail/bsvhu/RouteBsvhusView.tsx b/front/src/dashboard/detail/bsvhu/RouteBsvhusView.tsx index 36f2d3c3eb..53711dbc70 100644 --- a/front/src/dashboard/detail/bsvhu/RouteBsvhusView.tsx +++ b/front/src/dashboard/detail/bsvhu/RouteBsvhusView.tsx @@ -4,7 +4,7 @@ import { useQuery } from "@apollo/client"; import { Query, QueryBsvhuArgs } from "@td/codegen-ui"; import Loader from "../../../Apps/common/Components/Loader/Loaders"; -import { GET_VHU_FORM } from "../../../Apps/Dashboard/Creation/bsvhu/utils/queries"; +import { GET_VHU_FORM } from "../../../Apps/common/queries/bsvhu/queries"; import { InlineError } from "../../../Apps/common/Components/Error/Error"; import EmptyDetail from "../common/EmptyDetailView"; From f18c658b5216df3d0f222a0e4ed1fc705baa2cea Mon Sep 17 00:00:00 2001 From: Laurent Paoletti Date: Thu, 31 Oct 2024 15:10:54 +0100 Subject: [PATCH 21/74] Skip indexing for some appendix1 bsdds --- Changelog.md | 4 + back/src/bsds/indexation/reindexBsdHelpers.ts | 9 +- .../forms/__tests__/elastic.integration.ts | 115 +++++++++++++++++- back/src/forms/elastic.ts | 44 ++++++- .../__tests__/appendixforms.integration.ts | 40 ++++-- back/src/forms/types.ts | 9 ++ .../bin/reindexDeletedOrphanAppendix1.ts | 49 -------- 7 files changed, 199 insertions(+), 71 deletions(-) delete mode 100644 back/src/scripts/bin/reindexDeletedOrphanAppendix1.ts diff --git a/Changelog.md b/Changelog.md index 2760110bbd..7fafcd17cc 100644 --- a/Changelog.md +++ b/Changelog.md @@ -12,6 +12,10 @@ et le projet suit un schéma de versionning inspiré de [Calendar Versioning](ht - Le champ "Numéro de notification" est obligatoire lorsque la destination ultérieure renseignée est étrangère [PR 3719](https://github.com/MTES-MCT/trackdechets/pull/3719) - La présence d'une quantité reçue est requise pour passer du statut SENT à ACCEPTED via la mutation markAsReceived [PR 3720](https://github.com/MTES-MCT/trackdechets/pull/3720) +#### :bug: Corrections de bugs + +- Corrige l'indexation des annexes 1 orphelines et draft [PR 3721](https://github.com/MTES-MCT/trackdechets/pull/3721) + #### :house: Interne - Modification de la query controlBsds et fermeture de la query bsds aux comptes gouvernementaux [PR 3270](https://github.com/MTES-MCT/trackdechets/pull/3270) diff --git a/back/src/bsds/indexation/reindexBsdHelpers.ts b/back/src/bsds/indexation/reindexBsdHelpers.ts index fe15007ace..62e38bba6b 100644 --- a/back/src/bsds/indexation/reindexBsdHelpers.ts +++ b/back/src/bsds/indexation/reindexBsdHelpers.ts @@ -4,7 +4,11 @@ import { BsdasriForElasticInclude, indexBsdasri } from "../../bsdasris/elastic"; import { getBsffForElastic, indexBsff } from "../../bsffs/elastic"; import { getBsvhuForElastic, indexBsvhu } from "../../bsvhu/elastic"; import { getBspaohForElastic, indexBspaoh } from "../../bspaoh/elastic"; -import { getFormForElastic, indexForm } from "../../forms/elastic"; +import { + getFormForElastic, + indexForm, + isBsddNotIndexable +} from "../../forms/elastic"; import { deleteBsd } from "../../common/elastic"; import { getReadonlyBsdaRepository } from "../../bsda/repository"; import { getReadonlyBsvhuRepository } from "../../bsvhu/repository"; @@ -84,7 +88,8 @@ export async function reindex(bsdId, exitFn) { if (bsdId.startsWith("BSD-") || bsdId.startsWith("TD-")) { const formForElastic = await getFormForElastic({ readableId: bsdId }); - if (formForElastic.isDeleted) { + + if (isBsddNotIndexable(formForElastic)) { await deleteBsd({ id: formForElastic.id }); } else { await indexForm(formForElastic); diff --git a/back/src/forms/__tests__/elastic.integration.ts b/back/src/forms/__tests__/elastic.integration.ts index 5dcbdd4e63..baae4c0697 100644 --- a/back/src/forms/__tests__/elastic.integration.ts +++ b/back/src/forms/__tests__/elastic.integration.ts @@ -2,7 +2,8 @@ import { Company, EmptyReturnADR, Status, - WasteAcceptationStatus + WasteAcceptationStatus, + EmitterType } from "@prisma/client"; import { resetDatabase } from "../../../integration-tests/helper"; import { prisma } from "@td/prisma"; @@ -60,11 +61,15 @@ describe("getSiretsByTab", () => { const user = await userFactory(); const form = await formFactory({ ownerId: user.id, - opt: { status: Status.SEALED, emitterType: "APPENDIX1_PRODUCER" } + opt: { + status: Status.SEALED, + emitterType: EmitterType.APPENDIX1_PRODUCER + } }); const fullForm = await getFullForm(form); const transporter = getFirstTransporterSync(fullForm); const { isToCollectFor, isForActionFor } = getSiretsByTab(fullForm); + expect(isForActionFor).toContain(form.emitterCompanySiret); expect(isToCollectFor).toContain(transporter!.transporterCompanySiret); }); @@ -695,3 +700,109 @@ describe("toBsdElastic > companies Names & OrgIds", () => { ); }); }); + +describe("toBsdElastic > APPENDIX1", () => { + afterEach(resetDatabase); + test.each([Status.DRAFT, Status.SEALED, Status.SENT])( + "orphan APPENDIX1_PRODUCER : status %p should not appear in dashboard", + async status => { + const user = await userFactory(); + const form = await formFactory({ + ownerId: user.id, + opt: { status: status, emitterType: EmitterType.APPENDIX1_PRODUCER } + }); + const formForElastic = await getFormForElastic(form); + + const elasticBsd = toBsdElastic(formForElastic); + + expect(elasticBsd.isDraftFor).toEqual([]); + expect(elasticBsd.isForActionFor).toEqual([]); + expect(elasticBsd.isFollowFor).toEqual([]); + expect(elasticBsd.isArchivedFor).toEqual([]); + expect(elasticBsd.isToCollectFor).toEqual([]); + expect(elasticBsd.isCollectedFor).toEqual([]); + expect(elasticBsd.isInRevisionFor).toEqual([]); + expect(elasticBsd.isReturnFor).toEqual([]); + expect(elasticBsd.isRevisedFor).toEqual([]); + } + ); + + test.each([ + Status.SEALED, + Status.SENT, + Status.RECEIVED, + Status.RECEIVED, + Status.RECEIVED, + Status.PROCESSED + ])( + "grouped APPENDIX1_PRODUCER : status %p should appear in dashboard", + async status => { + const user = await userFactory(); + const appendix1 = await formFactory({ + ownerId: user.id, + opt: { + status: status, + emitterType: EmitterType.APPENDIX1_PRODUCER + } + }); + // top level bsdd + await formFactory({ + ownerId: user.id, + opt: { + status: Status.SENT, + wasteDetailsCode: "16 06 01*", + + emitterType: EmitterType.APPENDIX1, + grouping: { create: { initialFormId: appendix1.id, quantity: 0 } } + } + }); + const formForElastic = await getFormForElastic(appendix1); + + const elasticBsd = toBsdElastic(formForElastic); + const displayedFor = [ + ...elasticBsd.isDraftFor, + ...elasticBsd.isForActionFor, + ...elasticBsd.isFollowFor, + ...elasticBsd.isFollowFor, + ...elasticBsd.isToCollectFor, + ...elasticBsd.isCollectedFor, + ...elasticBsd.isArchivedFor + ].filter(Boolean); + expect(displayedFor.length).toBeTruthy(); + } + ); + + test("grouped APPENDIX1_PRODUCER : DRAFT should appear in dashboard", async () => { + const user = await userFactory(); + const appendix1 = await formFactory({ + ownerId: user.id, + opt: { + status: Status.DRAFT, + emitterType: EmitterType.APPENDIX1_PRODUCER + } + }); + // top level bsdd + await formFactory({ + ownerId: user.id, + opt: { + status: Status.SENT, + wasteDetailsCode: "16 06 01*", + + emitterType: EmitterType.APPENDIX1, + grouping: { create: { initialFormId: appendix1.id, quantity: 0 } } + } + }); + const formForElastic = await getFormForElastic(appendix1); + + const elasticBsd = toBsdElastic(formForElastic); + expect(elasticBsd.isDraftFor).toEqual([]); + expect(elasticBsd.isForActionFor).toEqual([]); + expect(elasticBsd.isFollowFor).toEqual([]); + expect(elasticBsd.isArchivedFor).toEqual([]); + expect(elasticBsd.isToCollectFor).toEqual([]); + expect(elasticBsd.isCollectedFor).toEqual([]); + expect(elasticBsd.isInRevisionFor).toEqual([]); + expect(elasticBsd.isReturnFor).toEqual([]); + expect(elasticBsd.isRevisedFor).toEqual([]); + }); +}); diff --git a/back/src/forms/elastic.ts b/back/src/forms/elastic.ts index 8d199dc75d..5b1656a617 100644 --- a/back/src/forms/elastic.ts +++ b/back/src/forms/elastic.ts @@ -10,7 +10,9 @@ import { FormWithRevisionRequestsInclude, FormWithForwarding, FormWithForwardingInclude, - FormWithForwardedInWithTransporters + FormWithForwardedInWithTransporters, + FormWithAppendix1GroupingInfo, + FormWithAppendix1GroupingInfoInclude } from "./types"; import { GraphQLContext } from "../types"; import { getRegistryFields } from "./registry"; @@ -31,14 +33,16 @@ export type FormForElastic = Form & FormWithForwardedInWithTransporters & FormWithIntermediaries & FormWithForwarding & - FormWithRevisionRequests; + FormWithRevisionRequests & + FormWithAppendix1GroupingInfo; export const FormForElasticInclude = { ...FormWithForwardedInWithTransportersInclude, ...FormWithForwardingInclude, ...FormWithTransportersInclude, ...FormWithIntermediariesInclude, - ...FormWithRevisionRequestsInclude + ...FormWithRevisionRequestsInclude, + ...FormWithAppendix1GroupingInfoInclude // provided to tell apart orphans appendix1 from others }; export async function getFormForElastic( @@ -50,8 +54,32 @@ export async function getFormForElastic( }); } +/** + * + * Utility to know if BSDD indexing should be skipped + * sould not be indexed: + * deleted forms + * forwarding forms + * appendix form in draft state or not linked to another top level form through formGroupement + */ +export function isBsddNotIndexable(form: FormForElastic): boolean { + if (form.isDeleted || !!form.forwarding) { + return true; + } + + if (form.emitterType === "APPENDIX1_PRODUCER") { + if (form.status === "DRAFT") { + return true; + } + + return !form.groupedIn?.length; // no relation + } + return false; +} + /** * Convert a BSD from the forms table to Elastic Search's BSD model. + * NB: some BSDDs should not appear on user dashboard, see `isBsddNotIndexable` */ export function toBsdElastic(form: FormForElastic): BsdElastic { const siretsByTab = getSiretsByTab(form); @@ -137,9 +165,10 @@ export function toBsdElastic(form: FormForElastic): BsdElastic { : null, destinationOperationDate: form.processedAt?.getTime(), ...getFormReturnOrgIds(form), - ...(form.forwarding + + ...(isBsddNotIndexable(form) ? { - // do not display BSD suite in dashboard + // do not display in dashboard : BSDDs suite, deleted BSDs, orphans appendix1 isDraftFor: [], isForActionFor: [], isFollowFor: [], @@ -149,6 +178,7 @@ export function toBsdElastic(form: FormForElastic): BsdElastic { isInRevisionFor: [] } : siretsByTab), + ...getFormRevisionOrgIds(form), revisionRequests: form.bsddRevisionRequests, sirets: Object.values(siretsByTab).flat(), @@ -204,6 +234,7 @@ export async function indexForm( if (form.isDeleted) { return toBsdElastic(form); } + if (form.forwardedIn) { // index next BSD asynchronously indexBsd( @@ -212,7 +243,8 @@ export async function indexForm( intermediaries: [], forwardedIn: null, forwarding: form, - bsddRevisionRequests: [] + bsddRevisionRequests: [], + groupedIn: [] }) ); } diff --git a/back/src/forms/resolvers/queries/__tests__/appendixforms.integration.ts b/back/src/forms/resolvers/queries/__tests__/appendixforms.integration.ts index 35dbf6e81d..4f168bc79f 100644 --- a/back/src/forms/resolvers/queries/__tests__/appendixforms.integration.ts +++ b/back/src/forms/resolvers/queries/__tests__/appendixforms.integration.ts @@ -150,8 +150,12 @@ describe("Test appendixForms", () => { }); expect(appendixForms.length).toBe(2); - expect(appendixForms[0].id).toBe(awaitingGroupForm.id); - expect(appendixForms[1].id).toBe(initialForm2.id); + + expect( + appendixForms.map(bsd => bsd.id).sort((a, b) => a.localeCompare(b)) + ).toEqual( + [awaitingGroupForm.id, initialForm2.id].sort((a, b) => a.localeCompare(b)) + ); }); it("should not return appendixForms data", async () => { @@ -322,10 +326,17 @@ describe("Test appendixForms", () => { }); expect(appendixForms.length).toBe(2); - expect(appendixForms[0].id).toBe(awaitingGroupForm.id); - expect(appendixForms[0].quantityGrouped).toBe(0); - expect(appendixForms[1].id).toBe(partiallyGrouped.id); - expect(appendixForms[1].quantityGrouped).toBe(3); + + expect( + appendixForms.map(bsd => bsd.id).sort((a, b) => a.localeCompare(b)) + ).toEqual( + [awaitingGroupForm.id, partiallyGrouped.id].sort((a, b) => + a.localeCompare(b) + ) + ); + expect(appendixForms.map(bsd => bsd.quantityGrouped).sort()).toEqual([ + 0, 3 + ]); }); it("new + legacy > should return candidates", async () => { @@ -447,12 +458,17 @@ describe("Test appendixForms", () => { }); expect(appendixForms.length).toBe(3); - expect(appendixForms[0].id).toBe(awaitingGroupForm.id); - expect(appendixForms[0].quantityGrouped).toBe(0); - expect(appendixForms[1].id).toBe(awaitingGroupForm2.id); - expect(appendixForms[1].quantityGrouped).toBe(0); - expect(appendixForms[2].id).toBe(partiallyGrouped.id); - expect(appendixForms[2].quantityGrouped).toBe(3); + + expect( + appendixForms.map(bsd => bsd.id).sort((a, b) => a.localeCompare(b)) + ).toEqual( + [awaitingGroupForm.id, awaitingGroupForm2.id, partiallyGrouped.id].sort( + (a, b) => a.localeCompare(b) + ) + ); + expect(appendixForms.map(bsd => bsd.quantityGrouped).sort()).toEqual([ + 0, 0, 3 + ]); }); }); }); diff --git a/back/src/forms/types.ts b/back/src/forms/types.ts index cde614e49d..761fc554ad 100644 --- a/back/src/forms/types.ts +++ b/back/src/forms/types.ts @@ -93,6 +93,15 @@ export type FormWithRevisionRequests = Prisma.FormGetPayload<{ include: typeof FormWithRevisionRequestsInclude; }>; +export const FormWithAppendix1GroupingInfoInclude = + Prisma.validator()({ + groupedIn: { select: { id: true } } + }); + +export type FormWithAppendix1GroupingInfo = Prisma.FormGetPayload<{ + include: typeof FormWithAppendix1GroupingInfoInclude; +}>; + /** * A Prisma Form with linked objects * *********************************** diff --git a/back/src/scripts/bin/reindexDeletedOrphanAppendix1.ts b/back/src/scripts/bin/reindexDeletedOrphanAppendix1.ts deleted file mode 100644 index a9a4fc17e1..0000000000 --- a/back/src/scripts/bin/reindexDeletedOrphanAppendix1.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { prisma } from "@td/prisma"; -import { AuthType, EmitterType, Prisma } from "@prisma/client"; -import { logger } from "@td/logger"; -import { deleteBsd } from "../../common/elastic"; -import { closeQueues } from "../../queue/producers"; - -async function exitScript() { - logger.info("Done reindexAllInBulk script, exiting"); - await prisma.$disconnect(); - await closeQueues(); - process.exit(0); -} - -// ensure deleted orphans appendix1 are removed from ES -(async function () { - const CHUNK_SIZE = 200; - - const where: Prisma.FormWhereInput = { - emitterType: EmitterType.APPENDIX1_PRODUCER, - isDeleted: true, - groupedIn: { none: {} } - }; - const orphansCount = await prisma.form.count({ where }); - - let cursor: string | null = null; - - for (let i = 0; i < orphansCount; i += CHUNK_SIZE) { - console.log(`Chunk ${i + 1}`); - - const orphans = await prisma.form.findMany({ - where, - orderBy: { id: "asc" }, - take: CHUNK_SIZE, - select: { id: true }, - ...(cursor ? { skip: 1, cursor: { id: cursor } } : {}) - }); - - cursor = orphans[orphans.length - 1].id; - - const orphansIds = orphans.map(form => form.id); - - for (const id of orphansIds) { - console.log(`Removing ${id}`); - await deleteBsd({ id }, { user: { auth: AuthType.BEARER } } as any); - } - } - - await exitScript(); -})(); From 1041f178de601d1ff3620aa0b6f23f9d47392884 Mon Sep 17 00:00:00 2001 From: GaelFerrand <45355989+GaelFerrand@users.noreply.github.com> Date: Tue, 12 Nov 2024 10:10:22 +0100 Subject: [PATCH 22/74] =?UTF-8?q?[TRA-15424]=20ETQ=20utilisateur=20je=20pe?= =?UTF-8?q?ux=20faire=20une=20r=C3=A9vision=20sur=20un=20bordereau=20en=20?= =?UTF-8?q?attente=20de=20regroupement=20(#3734)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: user can review a BSDASRI when AWAITING_GROUP * feat: added test --- .../createRevisionRequest.integration.ts | 57 +++++++++++++++++++ back/src/bsdasris/zodSchema.ts | 32 +++++++---- .../RevisionRequestList/common/utils/rules.ts | 16 ++++-- 3 files changed, 89 insertions(+), 16 deletions(-) diff --git a/back/src/bsdasris/resolvers/mutations/revisionRequest/__tests__/createRevisionRequest.integration.ts b/back/src/bsdasris/resolvers/mutations/revisionRequest/__tests__/createRevisionRequest.integration.ts index b3a4267d28..ff68b5fc8a 100644 --- a/back/src/bsdasris/resolvers/mutations/revisionRequest/__tests__/createRevisionRequest.integration.ts +++ b/back/src/bsdasris/resolvers/mutations/revisionRequest/__tests__/createRevisionRequest.integration.ts @@ -714,6 +714,63 @@ describe("Mutation.createBsdasriRevisionRequest", () => { "Vous devez saisir la description du conditionnement quand le type de conditionnement est 'Autre'" ); }); + + it("DASRI in AWAITING_GROUP should be able to be reviewed", async () => { + // Given + const { company: recipientCompany } = await userWithCompanyFactory("ADMIN"); + const { user, company } = await userWithCompanyFactory("ADMIN"); + + const bsdasri = await bsdasriFactory({ + opt: { + emitterCompanySiret: company.siret, + destinationCompanySiret: recipientCompany.siret, + status: "AWAITING_GROUP" + } + }); + + // When + const { mutate } = makeClient(user); + const { data, errors } = await mutate< + Pick, + MutationCreateBsdasriRevisionRequestArgs + >(CREATE_BSDASRI_REVISION_REQUEST, { + variables: { + input: { + bsdasriId: bsdasri.id, + content: { + emitter: { + pickupSite: { + name: "pickup site name", + address: "4 boulevard pasteur", + city: "Nantes", + postalCode: "44100", + infos: "site infos" + } + }, + waste: { + code: "18 01 03*" + }, + destination: { + operation: { + code: "R1", + mode: "VALORISATION_ENERGETIQUE", + weight: 10 + }, + reception: { + packagings: [{ type: "BOITE_CARTON", volume: 22, quantity: 3 }] + } + } + }, + comment: "A comment", + authoringCompanySiret: company.siret! + } + } + }); + + // Then + expect(errors).toBeUndefined(); + expect(data.createBsdasriRevisionRequest.bsdasri.id).toBe(bsdasri.id); + }); }); describe("Mutation.createBsdasriRevisionRequest grouping", () => { diff --git a/back/src/bsdasris/zodSchema.ts b/back/src/bsdasris/zodSchema.ts index e4c5c69311..f5e95d6af9 100644 --- a/back/src/bsdasris/zodSchema.ts +++ b/back/src/bsdasris/zodSchema.ts @@ -141,7 +141,8 @@ const revisionRules: RevisionRules = { return [ BsdasriStatus.SENT, BsdasriStatus.RECEIVED, - BsdasriStatus.PROCESSED + BsdasriStatus.PROCESSED, + BsdasriStatus.AWAITING_GROUP ]; } }, @@ -155,7 +156,8 @@ const revisionRules: RevisionRules = { return [ BsdasriStatus.SENT, BsdasriStatus.RECEIVED, - BsdasriStatus.PROCESSED + BsdasriStatus.PROCESSED, + BsdasriStatus.AWAITING_GROUP ]; } }, @@ -170,12 +172,13 @@ const revisionRules: RevisionRules = { return [ BsdasriStatus.SENT, BsdasriStatus.RECEIVED, - BsdasriStatus.PROCESSED + BsdasriStatus.PROCESSED, + BsdasriStatus.AWAITING_GROUP ]; } }, emitterPickupSitePostalCode: { - readableFieldName: "le doe postal du site d'enlèvement", + readableFieldName: "le code postal du site d'enlèvement", revisableFor: type => { if (type !== BsdasriType.SIMPLE) { @@ -184,7 +187,8 @@ const revisionRules: RevisionRules = { return [ BsdasriStatus.SENT, BsdasriStatus.RECEIVED, - BsdasriStatus.PROCESSED + BsdasriStatus.PROCESSED, + BsdasriStatus.AWAITING_GROUP ]; } }, @@ -198,7 +202,8 @@ const revisionRules: RevisionRules = { return [ BsdasriStatus.SENT, BsdasriStatus.RECEIVED, - BsdasriStatus.PROCESSED + BsdasriStatus.PROCESSED, + BsdasriStatus.AWAITING_GROUP ]; } }, @@ -214,7 +219,8 @@ const revisionRules: RevisionRules = { return [ BsdasriStatus.SENT, BsdasriStatus.RECEIVED, - BsdasriStatus.PROCESSED + BsdasriStatus.PROCESSED, + BsdasriStatus.AWAITING_GROUP ]; } }, @@ -226,21 +232,25 @@ const revisionRules: RevisionRules = { if (type === BsdasriType.SYNTHESIS) { return []; } - return [BsdasriStatus.RECEIVED, BsdasriStatus.PROCESSED]; + return [ + BsdasriStatus.RECEIVED, + BsdasriStatus.PROCESSED, + BsdasriStatus.AWAITING_GROUP + ]; } }, destinationOperationCode: { readableFieldName: "le code de traitement", - revisableFor: () => [BsdasriStatus.PROCESSED] + revisableFor: () => [BsdasriStatus.PROCESSED, BsdasriStatus.AWAITING_GROUP] }, destinationOperationMode: { readableFieldName: "le mode de traitement", - revisableFor: () => [BsdasriStatus.PROCESSED] + revisableFor: () => [BsdasriStatus.PROCESSED, BsdasriStatus.AWAITING_GROUP] }, destinationReceptionWasteWeightValue: { readableFieldName: "le poids de déchet traité", - revisableFor: () => [BsdasriStatus.PROCESSED] + revisableFor: () => [BsdasriStatus.PROCESSED, BsdasriStatus.AWAITING_GROUP] } }; diff --git a/front/src/Apps/Dashboard/Components/RevisionRequestList/common/utils/rules.ts b/front/src/Apps/Dashboard/Components/RevisionRequestList/common/utils/rules.ts index f0fbb91e3f..b098a45c28 100644 --- a/front/src/Apps/Dashboard/Components/RevisionRequestList/common/utils/rules.ts +++ b/front/src/Apps/Dashboard/Components/RevisionRequestList/common/utils/rules.ts @@ -10,7 +10,8 @@ export const revisionDasriRules = { revisable: [ BsdasriStatus.Sent, BsdasriStatus.Received, - BsdasriStatus.Processed + BsdasriStatus.Processed, + BsdasriStatus.AwaitingGroup ] }, @@ -18,19 +19,24 @@ export const revisionDasriRules = { revisable: [ BsdasriStatus.Sent, BsdasriStatus.Received, - BsdasriStatus.Processed + BsdasriStatus.Processed, + BsdasriStatus.AwaitingGroup ] }, "destination.reception.packagings": { - revisable: [BsdasriStatus.Received, BsdasriStatus.Processed] + revisable: [ + BsdasriStatus.Received, + BsdasriStatus.Processed, + BsdasriStatus.AwaitingGroup + ] }, "destination.operation.code": { - revisable: [BsdasriStatus.Processed] + revisable: [BsdasriStatus.Processed, BsdasriStatus.AwaitingGroup] }, "destination.operation.weight": { - revisable: [BsdasriStatus.Processed] + revisable: [BsdasriStatus.Processed, BsdasriStatus.AwaitingGroup] } }; From c0e86490f97597d6b5062f340e1f69fd79b0bbda Mon Sep 17 00:00:00 2001 From: GaelFerrand <45355989+GaelFerrand@users.noreply.github.com> Date: Tue, 12 Nov 2024 10:42:16 +0100 Subject: [PATCH 23/74] =?UTF-8?q?[TRA-14818]=20Correction=20de=20la=20"Men?= =?UTF-8?q?tion=20au=20titre=20des=20r=C3=A8glements=20RID,=20ADNR,=20IMDG?= =?UTF-8?q?=20(optionnel)"=20dans=20le=20formulaire=20de=20cr=C3=A9ation?= =?UTF-8?q?=20du=20BSDD=20(#3737)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- front/src/form/bsdd/utils/initial-state.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/front/src/form/bsdd/utils/initial-state.ts b/front/src/form/bsdd/utils/initial-state.ts index a22414af09..9c2e495f35 100644 --- a/front/src/form/bsdd/utils/initial-state.ts +++ b/front/src/form/bsdd/utils/initial-state.ts @@ -184,6 +184,8 @@ export function getInitialState(f?: Form | null): FormFormikValues { name: f?.wasteDetails?.name ?? "", isSubjectToADR: f?.wasteDetails?.isSubjectToADR ?? true, onuCode: f?.wasteDetails?.onuCode ?? "", + nonRoadRegulationMention: + f?.wasteDetails?.nonRoadRegulationMention ?? null, packagingInfos: f?.wasteDetails?.packagingInfos ?? [], quantity: f?.wasteDetails?.quantity ?? null, quantityType: f?.wasteDetails?.quantityType ?? QuantityType.Estimated, From 9d4c2b767ea37cd643cdd16760874154e8ea4f41 Mon Sep 17 00:00:00 2001 From: GaelFerrand <45355989+GaelFerrand@users.noreply.github.com> Date: Tue, 12 Nov 2024 11:00:10 +0100 Subject: [PATCH 24/74] =?UTF-8?q?[TRA-15404]=20Correction=20du=20formulair?= =?UTF-8?q?e=20de=20s=C3=A9lection=20de=20type=20d'entreprise=20(#3726)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CompanyTypeForm/CompanyTypeCheckbox.tsx | 19 +++++--- .../CompanyTypeForm/CompanyTypeForm.tsx | 8 +++- .../CompanyTypeForm/FormikCompanyTypeForm.tsx | 43 +++++++++++++------ .../CompanyTypeForm/RhfCompanyTypeForm.tsx | 39 +++++++++++------ 4 files changed, 76 insertions(+), 33 deletions(-) diff --git a/front/src/Apps/Companies/common/Components/CompanyTypeForm/CompanyTypeCheckbox.tsx b/front/src/Apps/Companies/common/Components/CompanyTypeForm/CompanyTypeCheckbox.tsx index ee27cba727..a61d2e9644 100644 --- a/front/src/Apps/Companies/common/Components/CompanyTypeForm/CompanyTypeCheckbox.tsx +++ b/front/src/Apps/Companies/common/Components/CompanyTypeForm/CompanyTypeCheckbox.tsx @@ -12,12 +12,17 @@ import { type CompanyTypeCheckboxProps = { label: string; + parentValue?: AllCompanyType | undefined; value: AllCompanyType; helpText?: string; subTypeOptions?: CompanySubTypeOption[]; // Représente un formulaire récépissé, agrément, etc certificationForm?: ReactNode; - handleToggle: (value: AllCompanyType, checked: boolean) => void; + handleToggle: ( + parentValue: AllCompanyType | undefined, + value: AllCompanyType, + checked: boolean + ) => void; inputProps?: CompanyTypeInputProps; inputErrors?: CompanyTypeInputErrors; inputValues: CompanyTypeInputValues; @@ -25,6 +30,7 @@ type CompanyTypeCheckboxProps = { const CompanyTypeCheckbox = ({ label, + parentValue, value, helpText, handleToggle, @@ -33,10 +39,11 @@ const CompanyTypeCheckbox = ({ inputProps, inputErrors }: CompanyTypeCheckboxProps): React.JSX.Element => { - const companyTypeChecked = React.useMemo( - () => inputValues.companyTypes.includes(value), - [value, inputValues.companyTypes] - ); + const companyTypeChecked = React.useMemo(() => { + const fullValue = parentValue ? `${parentValue}.${value}` : value; + return inputValues.companyTypes.includes(fullValue); + }, [parentValue, value, inputValues.companyTypes]); + const showSubTypes = React.useMemo( () => companyTypeChecked && Boolean(subTypeOptions), [companyTypeChecked, subTypeOptions] @@ -61,6 +68,7 @@ const CompanyTypeCheckbox = ({ checked: companyTypeChecked, onChange: e => handleToggle( + parentValue, e.currentTarget.value as AllCompanyType, e.currentTarget.checked ) @@ -84,6 +92,7 @@ const CompanyTypeCheckbox = ({ return ( void; + handleToggle: ( + parentValue: AllCompanyType | undefined, + value: AllCompanyType, + checked: boolean + ) => void; }; /** diff --git a/front/src/Apps/Companies/common/Components/CompanyTypeForm/FormikCompanyTypeForm.tsx b/front/src/Apps/Companies/common/Components/CompanyTypeForm/FormikCompanyTypeForm.tsx index f6c39ba6be..7b03acdbb2 100644 --- a/front/src/Apps/Companies/common/Components/CompanyTypeForm/FormikCompanyTypeForm.tsx +++ b/front/src/Apps/Companies/common/Components/CompanyTypeForm/FormikCompanyTypeForm.tsx @@ -63,12 +63,18 @@ const FormikCompanyTypeForm = ({ const isSubmitted = submitCount > 0; - // La couche d'affichage des données au niveau de ne fait - // pas de différence entre type et sous-type d'établissement. La correspondance - // est gérée ici pour mettre à jour l'un des champs suivants : - // `companyType`, `wasteProcessTypes`, `collectorTypes` ou `wasteVehiclesTypes`, - const handleToggle = (value: AllCompanyType, checked: boolean) => { - if (COMPANY_TYPE_VALUES.includes(value as CompanyType)) { + // Reçoit le type ou sous-type d'établissement qui a été sélectionné, pour mettre + // à jour l'un des champs suivants : `companyType`, `wasteProcessTypes`, `collectorTypes` + // ou `wasteVehiclesTypes`. + // + // Ex pour un type: { parentValue: undefined, value: "PRODUCER"} + // Ex pour un sous-type: { parentValue: "COLLECTOR", value: "OTHER_NON_DANGEROUS_WASTES"} + const handleToggle = ( + parentValue: AllCompanyType | undefined, + value: AllCompanyType, + checked: boolean + ) => { + if (!parentValue && COMPANY_TYPE_VALUES.includes(value as CompanyType)) { if (checked) { setFieldValue("companyTypes", [...companyTypes, value as CompanyType]); } else { @@ -79,7 +85,10 @@ const FormikCompanyTypeForm = ({ } } - if (COLLECTOR_TYPE_VALUES.includes(value as CollectorType)) { + if ( + parentValue === "COLLECTOR" && + COLLECTOR_TYPE_VALUES.includes(value as CollectorType) + ) { if (checked) { setFieldValue("collectorTypes", [ ...collectorTypes, @@ -93,7 +102,10 @@ const FormikCompanyTypeForm = ({ } } - if (WASTE_PROCESSOR_TYPE_VALUES.includes(value as WasteProcessorType)) { + if ( + parentValue === "WASTEPROCESSOR" && + WASTE_PROCESSOR_TYPE_VALUES.includes(value as WasteProcessorType) + ) { if (checked) { setFieldValue("wasteProcessorTypes", [ ...wasteProcessorTypes, @@ -107,7 +119,10 @@ const FormikCompanyTypeForm = ({ } } - if (WASTE_VEHICLES_TYPE_VALUES.includes(value as WasteVehiclesType)) { + if ( + parentValue === "WASTE_VEHICLES" && + WASTE_VEHICLES_TYPE_VALUES.includes(value as WasteVehiclesType) + ) { if (checked) { setFieldValue("wasteVehiclesTypes", [ ...wasteVehiclesTypes, @@ -130,11 +145,11 @@ const FormikCompanyTypeForm = ({ } }; - const allCompanyTypes = [ + const allcompanyTypes = [ ...companyTypes, - ...collectorTypes, - ...wasteProcessorTypes, - ...wasteVehiclesTypes + ...collectorTypes.map(type => `COLLECTOR.${type}`), + ...wasteProcessorTypes.map(type => `WASTEPROCESSOR.${type}`), + ...wasteVehiclesTypes.map(type => `WASTE_VEHICLES.${type}`) ]; function fieldProps(name: string, index?: number) { @@ -157,7 +172,7 @@ const FormikCompanyTypeForm = ({ return ( ne fait - // pas de différence entre type et sous-type d'établissement. La correspondance - // est gérée ici pour mettre à jour l'un des champs suivants : - // `companyType`, `wasteProcessTypes`, `collectorTypes` ou `wasteVehiclesTypes`, - const handleToggle = (value: AllCompanyType, checked: boolean) => { - if (COMPANY_TYPE_VALUES.includes(value as CompanyType)) { + // Reçoit le type ou sous-type d'établissement qui a été sélectionné, pour mettre + // à jour l'un des champs suivants : `companyType`, `wasteProcessTypes`, `collectorTypes` + // ou `wasteVehiclesTypes`. + // + // Ex pour un type: { parentValue: undefined, value: "PRODUCER"} + // Ex pour un sous-type: { parentValue: "COLLECTOR", value: "OTHER_NON_DANGEROUS_WASTES"} + const handleToggle = ( + parentValue: AllCompanyType | undefined, + value: AllCompanyType, + checked: boolean + ) => { + if (!parentValue && COMPANY_TYPE_VALUES.includes(value as CompanyType)) { if (checked) { setValue("companyTypes", [...companyTypes, value as CompanyType], { shouldDirty: true, @@ -81,7 +87,10 @@ const RhfCompanyTypeForm = ({ } } - if (COLLECTOR_TYPE_VALUES.includes(value as CollectorType)) { + if ( + parentValue === "COLLECTOR" && + COLLECTOR_TYPE_VALUES.includes(value as CollectorType) + ) { if (checked) { setValue( "collectorTypes", @@ -101,7 +110,10 @@ const RhfCompanyTypeForm = ({ } } - if (WASTE_PROCESSOR_TYPE_VALUES.includes(value as WasteProcessorType)) { + if ( + parentValue === "WASTEPROCESSOR" && + WASTE_PROCESSOR_TYPE_VALUES.includes(value as WasteProcessorType) + ) { if (checked) { setValue( "wasteProcessorTypes", @@ -121,7 +133,10 @@ const RhfCompanyTypeForm = ({ } } - if (WASTE_VEHICLES_TYPE_VALUES.includes(value as WasteVehiclesType)) { + if ( + parentValue === "WASTE_VEHICLES" && + WASTE_VEHICLES_TYPE_VALUES.includes(value as WasteVehiclesType) + ) { if (checked) { setValue( "wasteVehiclesTypes", @@ -154,9 +169,9 @@ const RhfCompanyTypeForm = ({ const allCompanyTypes = [ ...companyTypes, - ...collectorTypes, - ...wasteProcessorTypes, - ...wasteVehiclesTypes + ...collectorTypes.map(type => `COLLECTOR.${type}`), + ...wasteProcessorTypes.map(type => `WASTEPROCESSOR.${type}`), + ...wasteVehiclesTypes.map(type => `WASTE_VEHICLES.${type}`) ]; const hasSubSectionThree = watch("workerCertification.hasSubSectionThree"); From c3c6ed47b6ec7067be66820b05c7fb85ec720e46 Mon Sep 17 00:00:00 2001 From: Laurent Paoletti Date: Tue, 12 Nov 2024 10:07:24 +0100 Subject: [PATCH 25/74] Fix e2e --- e2e/playwright.config.ts | 6 +++++- e2e/src/plans/quickFilters.spec.ts | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/e2e/playwright.config.ts b/e2e/playwright.config.ts index 1ea6fc15af..34588e2b75 100644 --- a/e2e/playwright.config.ts +++ b/e2e/playwright.config.ts @@ -43,7 +43,11 @@ export default defineConfig({ { name: "chromium", use: { - channel: "chromium" + channel: "chromium", + bypassCSP: true, //to disable cors + launchOptions: { + args: ["--disable-web-security"] // disable cors + } } } ], diff --git a/e2e/src/plans/quickFilters.spec.ts b/e2e/src/plans/quickFilters.spec.ts index 765e3e93ec..7dfd5f1edb 100644 --- a/e2e/src/plans/quickFilters.spec.ts +++ b/e2e/src/plans/quickFilters.spec.ts @@ -102,7 +102,7 @@ test.describe.serial("Cahier des filtres rapides", async () => { ecoOrganisme: companies.companyF, transporters: [companies.companyL] }); - + await seedFormGroupment(bsdd3, bsdd2); // BSDAs bsda1 = await seedBsda({ @@ -479,7 +479,7 @@ test.describe.serial("Cahier des filtres rapides", async () => { out: [bsda1] }, { - desc: '"Supermarché" > bsdd3 devrait remonter', + desc: '"Supermarché" > bsdd3 devrait devrait remonter', in: "Supermarché", out: [bsdd3] }, From ceca7dfb81cd335c3667cf75ca16259b99162f2f Mon Sep 17 00:00:00 2001 From: Laurent Paoletti Date: Tue, 5 Nov 2024 09:00:32 +0100 Subject: [PATCH 26/74] Restrict bsdd recipient according to their profile and subprofile --- .env.model | 5 +- .github/workflows/integration-tests.yml | 2 + Changelog.md | 9 +- back/src/__tests__/factories.ts | 50 +- back/src/__tests__/testWorkflow.ts | 2 + .../bsdd/__tests__/bsdd.integration.ts | 4 +- back/src/bsda/__tests__/factories.ts | 12 +- .../__tests__/bsds.bsdd.integration.ts | 19 +- back/src/bspaoh/__tests__/factories.ts | 6 +- back/src/common/validation.ts | 58 +- back/src/common/workflow.d.ts | 8 +- back/src/companies/companyProfilesRules.ts | 70 + .../forms/__tests__/validation.integration.ts | 8 +- .../examples/workflows/acheminementDirect.ts | 8 +- .../acheminementDirectTransporteurEtranger.ts | 8 +- back/src/forms/examples/workflows/annexe1.ts | 8 +- .../workflows/entreposageProvisoire.ts | 13 +- ...treposageProvisoireTransporteurEtranger.ts | 13 +- .../examples/workflows/importBsdPapier.ts | 7 +- .../forms/examples/workflows/multiModal.ts | 7 +- .../multiModalTransporteurEtranger.ts | 7 +- .../forms/examples/workflows/multiModalv2.ts | 7 +- .../forms/examples/workflows/regroupement.ts | 13 +- .../regroupementTransporteurEtranger.ts | 13 +- .../mutations/__tests__/companyProfiles.ts | 52 + .../__tests__/createForm.integration.ts | 204 ++- .../__tests__/importPaperForm.integration.ts | 79 +- .../__tests__/markAsResealed.integration.ts | 112 +- .../__tests__/markAsResent.integration.ts | 21 +- .../__tests__/markAsSealed.integration.ts | 113 +- .../__tests__/updateForm.integration.ts | 1199 +++++++++++++++-- .../resolvers/mutations/duplicateForm.ts | 4 + .../__tests__/appendixforms.integration.ts | 8 +- back/src/forms/typeDefs/bsdd.inputs.graphql | 12 +- back/src/forms/validation.ts | 2 + libs/back/env/src/index.ts | 7 +- 36 files changed, 1969 insertions(+), 201 deletions(-) create mode 100644 back/src/companies/companyProfilesRules.ts create mode 100644 back/src/forms/resolvers/mutations/__tests__/companyProfiles.ts diff --git a/.env.model b/.env.model index b3dfc6ced4..6f4bf9db93 100644 --- a/.env.model +++ b/.env.model @@ -230,4 +230,7 @@ GERICO_API_KEY="***" # Slug to receive gerico webhooks GERICO_WEBHOOK_SLUG="/lorem" # Token to authenticate gerico webhooks -GERICO_WEBHOOK_TOKEN="***" \ No newline at end of file +GERICO_WEBHOOK_TOKEN="***" + +# For testing purposes, optional and defaulted to november 2024 release date: "2024-11-13T00:00:00.000Z" +VERIFY_DESTINATION_PROFILES_FOR_BSDD_CREATED_AFTER="2024-10-26:00:00.000Z" diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index 91a9cd63b2..a00e22bb75 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -119,3 +119,5 @@ env: S3_SECRET_ACCESS_KEY: password S3_REGISTRY_ERRORS_BUCKET: registry-errors-integration S3_REGISTRY_IMPORTS_BUCKET: registry-imports-integration + VERIFY_DESTINATION_PROFILES_FOR_BSDD_CREATED_AFTER: 2024-10-30T00:00:00.000Z + diff --git a/Changelog.md b/Changelog.md index 2ff972329c..c8a4e0fdb4 100644 --- a/Changelog.md +++ b/Changelog.md @@ -4,18 +4,14 @@ Les changements importants de Trackdéchets sont documentés dans ce fichier. Le format est basé sur [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), et le projet suit un schéma de versionning inspiré de [Calendar Versioning](https://calver.org/). -[2024.11.1] 19/11/2024 - -#### :house: Interne -- Amélioration de l'interface d'admin [PR 3735](https://github.com/MTES-MCT/trackdechets/pull/3735) - -# [2024.11.1] 19/11/2024 +[2024.11.1] 19/11/2024 #### :boom: Breaking changes - Le champ "Numéro de notification" est obligatoire lorsque la destination ultérieure renseignée est étrangère [PR 3719](https://github.com/MTES-MCT/trackdechets/pull/3719) - La présence d'une quantité reçue est requise pour passer du statut SENT à ACCEPTED via la mutation markAsReceived [PR 3720](https://github.com/MTES-MCT/trackdechets/pull/3720) +- Restriction des TTR et Installations de traitement à être visés sur un BSDD selon leur type de profil [PR 3725](https://github.com/MTES-MCT/trackdechets/pull/3725) #### :bug: Corrections de bugs @@ -23,6 +19,7 @@ et le projet suit un schéma de versionning inspiré de [Calendar Versioning](ht #### :house: Interne +- Amélioration de l'interface d'admin [PR 3735](https://github.com/MTES-MCT/trackdechets/pull/3735) - Modification de la query controlBsds et fermeture de la query bsds aux comptes gouvernementaux [PR 3270](https://github.com/MTES-MCT/trackdechets/pull/3270) # [2024.10.1] 22/10/2024 diff --git a/back/src/__tests__/factories.ts b/back/src/__tests__/factories.ts index 0aeae614c8..617f7e3591 100644 --- a/back/src/__tests__/factories.ts +++ b/back/src/__tests__/factories.ts @@ -12,7 +12,10 @@ import { Prisma, Company, TransportMode, - UserNotification + UserNotification, + WasteProcessorType, + CollectorType, + CompanyType } from "@prisma/client"; import { prisma } from "@td/prisma"; import { hashToken } from "../utils"; @@ -193,6 +196,9 @@ export const destinationFactory = async ( ...companyOpts, companyTypes: { set: [CompanyType.WASTEPROCESSOR] + }, + wasteProcessorTypes: { + set: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] } } ); @@ -414,7 +420,17 @@ export const bsddTransporterFactory = async ({ return transporter; }; -export const upsertBaseSiret = async siret => { +export const upsertBaseSiret = async ({ + siret, + companyTypes = ["TRANSPORTER", "WASTEPROCESSOR", "WORKER"], + wasteProcessorTypes = [], + collectorTypes = [] +}: { + siret: string; + companyTypes?: CompanyType[]; + wasteProcessorTypes?: WasteProcessorType[]; + collectorTypes?: CollectorType[]; +}) => { const exists = await prisma.company.findUnique({ where: { siret } }); if (!exists) { // Using prisma.upsert gives us "Unique constraint failed on the fields: (`siret`)" @@ -425,7 +441,13 @@ export const upsertBaseSiret = async siret => { orgId: siret, siret, companyTypes: { - set: ["TRANSPORTER", "WASTEPROCESSOR", "WORKER"] + set: companyTypes + }, + wasteProcessorTypes: { + set: wasteProcessorTypes + }, + collectorTypes: { + set: collectorTypes }, name: `company_${siret}`, securityCode: 1234, @@ -450,10 +472,16 @@ export const formFactory = async ({ opt?: Partial; }) => { // Those sirets are required for the form to be updatable - await upsertBaseSiret( - (formdata.transporters!.create! as any).transporterCompanySiret as any - ); - await upsertBaseSiret(formdata.recipientCompanySiret); + + await upsertBaseSiret({ + siret: (formdata.transporters!.create! as any).transporterCompanySiret + }); + + // recipient needs appropriate profiles and subprofiles + await upsertBaseSiret({ + siret: formdata.recipientCompanySiret!, + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const ownerCompanies = await getUserCompanies(ownerId); const ownerOrgIds = ownerCompanies.map(company => company.orgId); @@ -513,10 +541,10 @@ export const formWithTempStorageFactory = async ({ opt?: Partial; forwardedInOpts?: Partial; }) => { - await upsertBaseSiret( - (forwardedInData.transporters?.create as any).transporterCompanySiret - ); - await upsertBaseSiret(forwardedInData.recipientCompanySiret); + await upsertBaseSiret({ + siret: (forwardedInData.transporters?.create as any).transporterCompanySiret + }); + await upsertBaseSiret({ siret: forwardedInData.recipientCompanySiret! }); const forwardedCreateInput: Omit< Prisma.FormCreateInput, diff --git a/back/src/__tests__/testWorkflow.ts b/back/src/__tests__/testWorkflow.ts index 4317e28461..c31f0df287 100644 --- a/back/src/__tests__/testWorkflow.ts +++ b/back/src/__tests__/testWorkflow.ts @@ -15,6 +15,8 @@ async function testWorkflow(workflow: Workflow) { for (const workflowCompany of workflow.companies) { const { user, company } = await userWithCompanyFactory("MEMBER", { companyTypes: workflowCompany.companyTypes, + wasteProcessorTypes: workflowCompany.wasteProcessorTypes ?? [], + collectorTypes: workflowCompany.collectorTypes ?? [], ...(workflowCompany?.opt || {}) }); if (workflowCompany.companyTypes.includes("ECO_ORGANISME")) { diff --git a/back/src/activity-events/bsdd/__tests__/bsdd.integration.ts b/back/src/activity-events/bsdd/__tests__/bsdd.integration.ts index 0de957af31..914d241fd2 100644 --- a/back/src/activity-events/bsdd/__tests__/bsdd.integration.ts +++ b/back/src/activity-events/bsdd/__tests__/bsdd.integration.ts @@ -14,6 +14,7 @@ import { import makeClient from "../../../__tests__/testClient"; import { getStream } from "../../data"; import { getFirstTransporterSync } from "../../../forms/database"; +import { WasteProcessorType, CompanyType } from "@prisma/client"; const CREATE_FORM = ` mutation CreateForm($createFormInput: CreateFormInput!) { @@ -55,7 +56,8 @@ describe("ActivityEvent.Bsdd", () => { const { company: destinationCompany } = await userWithCompanyFactory( "MEMBER", { - companyTypes: { set: ["WASTEPROCESSOR", "TRANSPORTER"] } + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] } ); const transporterCompany = await companyFactory({ diff --git a/back/src/bsda/__tests__/factories.ts b/back/src/bsda/__tests__/factories.ts index cc2c91c80b..93059939da 100644 --- a/back/src/bsda/__tests__/factories.ts +++ b/back/src/bsda/__tests__/factories.ts @@ -39,14 +39,14 @@ export const bsdaFactory = async ({ contactPhone: bsdaObject.emitterCompanyPhone ?? undefined, contactEmail: bsdaObject.emitterCompanyMail ?? undefined }); - await upsertBaseSiret( - ( + await upsertBaseSiret({ + siret: ( bsdaObject.transporters! .create! as Prisma.BsdaTransporterCreateWithoutBsdaInput - ).transporterCompanySiret // Prisma.BsdaTransporterCreateWithoutBsdaInput[] is wrongly infered - ); - await upsertBaseSiret(bsdaObject.destinationCompanySiret); - await upsertBaseSiret(bsdaObject.workerCompanySiret); + ).transporterCompanySiret! // Prisma.BsdaTransporterCreateWithoutBsdaInput[] is wrongly infered + }); + await upsertBaseSiret({ siret: bsdaObject.destinationCompanySiret! }); + await upsertBaseSiret({ siret: bsdaObject.workerCompanySiret! }); const data: Prisma.BsdaCreateInput = { ...bsdaObject, diff --git a/back/src/bsds/resolvers/queries/__tests__/bsds.bsdd.integration.ts b/back/src/bsds/resolvers/queries/__tests__/bsds.bsdd.integration.ts index cfff9fca8f..ee79395b31 100644 --- a/back/src/bsds/resolvers/queries/__tests__/bsds.bsdd.integration.ts +++ b/back/src/bsds/resolvers/queries/__tests__/bsds.bsdd.integration.ts @@ -1,4 +1,10 @@ -import { Company, User, UserRole } from "@prisma/client"; +import { + Company, + User, + UserRole, + WasteProcessorType, + CompanyType +} from "@prisma/client"; import { Query, QueryBsdsArgs, @@ -84,17 +90,17 @@ describe("Query.bsds workflow", () => { beforeAll(async () => { emitter = await userWithCompanyFactory(UserRole.ADMIN, { companyTypes: { - set: ["PRODUCER"] + set: [CompanyType.PRODUCER] } }); intermediary = await userWithCompanyFactory(UserRole.MEMBER, { companyTypes: { - set: ["TRANSPORTER"] + set: [CompanyType.TRANSPORTER] } }); transporter = await userWithCompanyFactory(UserRole.ADMIN, { companyTypes: { - set: ["TRANSPORTER"] + set: [CompanyType.TRANSPORTER] } }); await transporterReceiptFactory({ @@ -103,7 +109,10 @@ describe("Query.bsds workflow", () => { recipient = await userWithCompanyFactory(UserRole.ADMIN, { companyTypes: { - set: ["WASTEPROCESSOR"] + set: [CompanyType.WASTEPROCESSOR] + }, + wasteProcessorTypes: { + set: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] } }); (searchCompany as jest.Mock).mockResolvedValue({ diff --git a/back/src/bspaoh/__tests__/factories.ts b/back/src/bspaoh/__tests__/factories.ts index 8730b4ad3e..35cfbe9d98 100644 --- a/back/src/bspaoh/__tests__/factories.ts +++ b/back/src/bspaoh/__tests__/factories.ts @@ -85,9 +85,9 @@ export const bspaohFactory = async ({ const destinationCompanySiret = siretify(2); const transporterCompanySiret = siretify(3); - await upsertBaseSiret(emitterCompanySiret); - await upsertBaseSiret(destinationCompanySiret); - await upsertBaseSiret(transporterCompanySiret); + await upsertBaseSiret({ siret: emitterCompanySiret }); + await upsertBaseSiret({ siret: destinationCompanySiret }); + await upsertBaseSiret({ siret: transporterCompanySiret }); await prisma.company.update({ where: { siret: destinationCompanySiret }, diff --git a/back/src/common/validation.ts b/back/src/common/validation.ts index cb46ef0645..05f78f4383 100644 --- a/back/src/common/validation.ts +++ b/back/src/common/validation.ts @@ -14,10 +14,19 @@ import { } from "../companies/validation"; import { CompanyInput } from "../generated/graphql/types"; import { prisma } from "@td/prisma"; -import { isForeignVat, isFRVat, isSiret, isVat } from "@td/constants"; +import { + isForeignVat, + isFRVat, + isSiret, + isVat, + isDangerous +} from "@td/constants"; import { isBase64 } from "../utils"; import { Decimal } from "decimal.js"; - +import { + canProcessDangerousWaste, + canProcessNonDangerousWaste +} from "../companies/companyProfilesRules"; // Poids maximum en tonnes tout mode de transport confondu export const MAX_WEIGHT_TONNES = 50000; @@ -176,6 +185,7 @@ type SiretTests = { role?: "DESTINATION" | "TRANSPORTER" | "WASTE_VEHICLES" ) => yup.TestConfig; isNotDormant: yup.TestConfig; + destinationHasAppropriateSubProfiles: yup.TestConfig; }; export const siretConditions: SiretConditions = { @@ -214,7 +224,14 @@ export const siretConditions: SiretConditions = { } }; -const { VERIFY_COMPANY } = process.env; +const { VERIFY_COMPANY, VERIFY_DESTINATION_PROFILES_FOR_BSDD_CREATED_AFTER } = + process.env; + +// Date de la MAJ 2024.11.1 qui rend obligatoire certtains sous profils pour traiter les déchets dangereux et non dangereux +const v20241101 = new Date( + VERIFY_DESTINATION_PROFILES_FOR_BSDD_CREATED_AFTER || + "2024-11-19T00:00:00.000Z" +); export const siretTests: SiretTests = { isRegistered: role => ({ @@ -302,6 +319,41 @@ export const siretTests: SiretTests = { } return company.isDormantSince == null; } + }, + destinationHasAppropriateSubProfiles: { + name: "destination-has-appropriate-subprofiles", + message: () => + "Les autorisations de l'établissement de destination ne semblent pas correspondre à la caractérisation du déchet " + + "renseigné. Merci de bien vouloir procéder à la mise à jour du profil de l'établissement ou modifier le type de " + + "déchet sans quoi le bordereau ne pourra être enregistré.", + test: async (siret, ctx) => { + if (!siret) return true; + + // do not run on existing bsdds created before release v20241101 + const bsddCreatedAt = ctx.parent.createdAt || new Date(); // new bsd do not have a createdAt yet + const isCreatedAfterV202411011 = + bsddCreatedAt.getTime() - v20241101.getTime() > 0; + + if (!isCreatedAfterV202411011) { + return true; + } + + const hasDangerousWaste = + isDangerous(ctx.parent.wasteDetailCode) || + ctx.parent.wasteDetailsPop || + ctx.parent.wasteDetailsIsDangerous; + + const company = await prisma.company.findUnique({ + where: { siret } + }); + if (company === null) { + return true; // catched by siretTests.isRegistered + } + + return hasDangerousWaste + ? canProcessDangerousWaste(company) + : canProcessNonDangerousWaste(company); + } } }; diff --git a/back/src/common/workflow.d.ts b/back/src/common/workflow.d.ts index da9fc8394d..fd6393853e 100644 --- a/back/src/common/workflow.d.ts +++ b/back/src/common/workflow.d.ts @@ -11,7 +11,13 @@ export type Workflow = { // Longer description of the workflow explaining the traceability use case; description?: string; // Name and profile of the companies involved in the workflow - companies: { name: string; companyTypes: string[]; opt?: any }[]; + companies: { + name: string; + companyTypes: string[]; + wasteProcessorTypes?: string[]; + collectorTypes?: string[]; + opt?: any; + }[]; // List of steps to be applied to the BSD steps: WorkflowStep[]; // Mocked context used in the documentation code examples diff --git a/back/src/companies/companyProfilesRules.ts b/back/src/companies/companyProfilesRules.ts new file mode 100644 index 0000000000..3f2361439f --- /dev/null +++ b/back/src/companies/companyProfilesRules.ts @@ -0,0 +1,70 @@ +import { CollectorType, WasteProcessorType, Company } from "@prisma/client"; + +const hasAuthorization = (requiredAuthorizations, companySubTypes): boolean => { + const matching = requiredAuthorizations.filter(i => + companySubTypes.includes(i) + ); + return !!matching.length; +}; + +export const canProcessDangerousWaste = (company: Company): boolean => { + const collectorAuthorizations = [ + CollectorType.DANGEROUS_WASTES, + CollectorType.DEEE_WASTES, + CollectorType.OTHER_DANGEROUS_WASTES + // NON_DANGEROUS_WASTES + // OTHER_NON_DANGEROUS_WASTES + ]; + const wasteProcessorAuthorizations = [ + WasteProcessorType.DANGEROUS_WASTES_INCINERATION, + WasteProcessorType.DANGEROUS_WASTES_STORAGE, + WasteProcessorType.NON_DANGEROUS_WASTES_STORAGE, + WasteProcessorType.OTHER_DANGEROUS_WASTES + // NON_DANGEROUS_WASTES_INCINERATION + // CREMATION + // INERT_WASTES_STORAGE + // OTHER_NON_DANGEROUS_WASTES + ]; + + const requiredAuthorizations = [ + ...collectorAuthorizations, + ...wasteProcessorAuthorizations + ]; + const companySubTypes = [ + ...company.collectorTypes, + ...company.wasteProcessorTypes + ]; + + return hasAuthorization(requiredAuthorizations, companySubTypes); +}; +export const canProcessNonDangerousWaste = (company: Company): boolean => { + const collectorAuthorizations = [ + CollectorType.NON_DANGEROUS_WASTES, + CollectorType.DEEE_WASTES, + CollectorType.OTHER_NON_DANGEROUS_WASTES + // DANGEROUS_WASTES + //OTHER_DANGEROUS_WASTES + ]; + + const wasteProcessorAuthorizations = [ + WasteProcessorType.DANGEROUS_WASTES_INCINERATION, + WasteProcessorType.NON_DANGEROUS_WASTES_INCINERATION, + WasteProcessorType.CREMATION, + WasteProcessorType.NON_DANGEROUS_WASTES_STORAGE, + WasteProcessorType.INERT_WASTES_STORAGE, + WasteProcessorType.OTHER_NON_DANGEROUS_WASTES + // DANGEROUS_WASTES_STORAGE + // OTHER_DANGEROUS_WASTES + ]; + + const requiredAuthorizations = [ + ...collectorAuthorizations, + ...wasteProcessorAuthorizations + ]; + const companySubTypes = [ + ...company.collectorTypes, + ...company.wasteProcessorTypes + ]; + + return hasAuthorization(requiredAuthorizations, companySubTypes); +}; diff --git a/back/src/forms/__tests__/validation.integration.ts b/back/src/forms/__tests__/validation.integration.ts index 983d74aec8..3e8adcf851 100644 --- a/back/src/forms/__tests__/validation.integration.ts +++ b/back/src/forms/__tests__/validation.integration.ts @@ -3,7 +3,8 @@ import { EmitterType, Form, OperationMode, - TransportMode + TransportMode, + WasteProcessorType } from "@prisma/client"; import { draftFormSchema, @@ -91,7 +92,10 @@ describe("sealedFormSchema", () => { companyTypes: ["TRANSPORTER"] }); const destinationCompany = await companyFactory({ - companyTypes: ["WASTEPROCESSOR"] + companyTypes: ["WASTEPROCESSOR"], + wasteProcessorTypes: { + set: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + } }); sealedForm = { ...formData, diff --git a/back/src/forms/examples/workflows/acheminementDirect.ts b/back/src/forms/examples/workflows/acheminementDirect.ts index 8de089fb0c..44eea875c2 100644 --- a/back/src/forms/examples/workflows/acheminementDirect.ts +++ b/back/src/forms/examples/workflows/acheminementDirect.ts @@ -5,7 +5,7 @@ import { markAsReceived } from "../steps/markAsReceived"; import { markAsProcessed } from "../steps/markAsProcessed"; import { signEmissionForm } from "../steps/signEmissionForm"; import { signTransportForm } from "../steps/signTransportForm"; - +import { WasteProcessorType } from "@prisma/client"; const workflow: Workflow = { title: "Acheminement direct du producteur à l'installation de traitement", description: `Les informations du BSDD sont remplies par le producteur du déchet. @@ -14,7 +14,11 @@ const workflow: Workflow = { companies: [ { name: "producteur", companyTypes: ["PRODUCER"] }, { name: "transporteur", companyTypes: ["TRANSPORTER"] }, - { name: "traiteur", companyTypes: ["WASTEPROCESSOR"] } + { + name: "traiteur", + companyTypes: ["WASTEPROCESSOR"], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + } ], steps: [ createForm("producteur"), diff --git a/back/src/forms/examples/workflows/acheminementDirectTransporteurEtranger.ts b/back/src/forms/examples/workflows/acheminementDirectTransporteurEtranger.ts index cba0a4344e..4919b6fc3e 100644 --- a/back/src/forms/examples/workflows/acheminementDirectTransporteurEtranger.ts +++ b/back/src/forms/examples/workflows/acheminementDirectTransporteurEtranger.ts @@ -6,7 +6,7 @@ import { markAsProcessed } from "../steps/markAsProcessed"; import { signEmissionForm } from "../steps/signEmissionForm"; import { signTransportForm } from "../steps/signTransportForm"; import fixtures from "../fixturesForeignTransporter"; - +import { WasteProcessorType } from "@prisma/client"; const workflow: Workflow = { title: "Acheminement direct du producteur à l'installation de traitement avec un transporteur étranger", @@ -23,7 +23,11 @@ const workflow: Workflow = { vatNumber: "BE0541696005" } }, - { name: "traiteur", companyTypes: ["WASTEPROCESSOR"] } + { + name: "traiteur", + companyTypes: ["WASTEPROCESSOR"], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + } ], steps: [ createForm("producteur", fixtures as any), diff --git a/back/src/forms/examples/workflows/annexe1.ts b/back/src/forms/examples/workflows/annexe1.ts index ca5f4c6163..b526ec3a16 100644 --- a/back/src/forms/examples/workflows/annexe1.ts +++ b/back/src/forms/examples/workflows/annexe1.ts @@ -12,7 +12,7 @@ import { groupAppendix1Producer, switchAppendixContext } from "../steps/updateForm"; - +import { WasteProcessorType } from "@prisma/client"; const workflow: Workflow = { title: "Bordereau chapeau et annexe 1", description: `Le collecteur crée un bordereau chapeau. Il crée ensuite ses bordereaux d'annexe 1 et les rattache à ce chapeau. @@ -20,7 +20,11 @@ const workflow: Workflow = { companies: [ { name: "collecteur", companyTypes: ["COLLECTOR", "TRANSPORTER"] }, { name: "producteur", companyTypes: ["PRODUCER"] }, - { name: "traiteur", companyTypes: ["WASTEPROCESSOR"] } + { + name: "traiteur", + companyTypes: ["WASTEPROCESSOR"], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + } ], steps: [ createAppendix1Form("collecteur"), diff --git a/back/src/forms/examples/workflows/entreposageProvisoire.ts b/back/src/forms/examples/workflows/entreposageProvisoire.ts index d1e416ca1f..7bc29a63d4 100644 --- a/back/src/forms/examples/workflows/entreposageProvisoire.ts +++ b/back/src/forms/examples/workflows/entreposageProvisoire.ts @@ -13,6 +13,7 @@ import { signTransportForm, signTransportFormAfterTempStorage } from "../steps/signTransportForm"; +import { WasteProcessorType } from "@prisma/client"; const workflow: Workflow = { title: "Entreposage provisoire", @@ -26,9 +27,17 @@ de destination finale accepte le déchet et valide le traitement.`, companies: [ { name: "producteur", companyTypes: ["PRODUCER"] }, { name: "transporteur1", companyTypes: ["TRANSPORTER"] }, - { name: "ttr", companyTypes: ["COLLECTOR"] }, + { + name: "ttr", + companyTypes: ["COLLECTOR"], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }, { name: "transporteur2", companyTypes: ["TRANSPORTER"] }, - { name: "traiteur", companyTypes: ["WASTEPROCESSOR"] } + { + name: "traiteur", + companyTypes: ["WASTEPROCESSOR"], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + } ], steps: [ createFormTempStorage("producteur"), diff --git a/back/src/forms/examples/workflows/entreposageProvisoireTransporteurEtranger.ts b/back/src/forms/examples/workflows/entreposageProvisoireTransporteurEtranger.ts index 7e72ae28d4..8a434bd667 100644 --- a/back/src/forms/examples/workflows/entreposageProvisoireTransporteurEtranger.ts +++ b/back/src/forms/examples/workflows/entreposageProvisoireTransporteurEtranger.ts @@ -14,6 +14,7 @@ import { signTransportFormAfterTempStorage } from "../steps/signTransportForm"; import fixtures from "../fixturesForeignTransporter"; +import { WasteProcessorType } from "@prisma/client"; const workflow: Workflow = { title: "Entreposage provisoire avec transporteur étranger", @@ -31,13 +32,21 @@ de destination finale accepte le déchet et valide le traitement.`, companyTypes: ["TRANSPORTER"], opt: { siret: null, vatNumber: "BE0541696005" } }, - { name: "ttr", companyTypes: ["COLLECTOR"] }, + { + name: "ttr", + companyTypes: ["COLLECTOR"], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }, { name: "transporteur2", companyTypes: ["TRANSPORTER"], opt: { siret: null, vatNumber: "IT13029381004" } }, - { name: "traiteur", companyTypes: ["WASTEPROCESSOR"] } + { + name: "traiteur", + companyTypes: ["WASTEPROCESSOR"], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + } ], steps: [ createFormTempStorage("producteur", fixtures as any), diff --git a/back/src/forms/examples/workflows/importBsdPapier.ts b/back/src/forms/examples/workflows/importBsdPapier.ts index cc44069756..5eccc4167f 100644 --- a/back/src/forms/examples/workflows/importBsdPapier.ts +++ b/back/src/forms/examples/workflows/importBsdPapier.ts @@ -2,6 +2,7 @@ import { createForm } from "../steps/createForm"; import { markAsSealed } from "../steps/markAsSealed"; import { importPaperForm } from "../steps/importPaperForm"; import { Workflow } from "../../../common/workflow"; +import { WasteProcessorType } from "@prisma/client"; const workflow: Workflow = { title: `Acheminement direct du producteur à l'installation de traitement avec import de BSD signé papier.`, @@ -12,7 +13,11 @@ dans Trackdéchets par l'installation de destination pour assurer la traçabilit companies: [ { name: "producteur", companyTypes: ["PRODUCER"] }, { name: "transporteur", companyTypes: ["TRANSPORTER"] }, - { name: "traiteur", companyTypes: ["WASTEPROCESSOR"] } + { + name: "traiteur", + companyTypes: ["WASTEPROCESSOR"], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + } ], steps: [ createForm("producteur"), diff --git a/back/src/forms/examples/workflows/multiModal.ts b/back/src/forms/examples/workflows/multiModal.ts index e6e83b4799..cd3075eaf3 100644 --- a/back/src/forms/examples/workflows/multiModal.ts +++ b/back/src/forms/examples/workflows/multiModal.ts @@ -8,6 +8,7 @@ import { markAsProcessed } from "../steps/markAsProcessed"; import { Workflow } from "../../../common/workflow"; import { signEmissionForm } from "../steps/signEmissionForm"; import { signTransportForm } from "../steps/signTransportForm"; +import { WasteProcessorType } from "@prisma/client"; const workflow: Workflow = { title: "Transport multi-modal", @@ -20,7 +21,11 @@ mis à jour au fur et mesure de la prise en charge du déchet sur les différent { name: "producteur", companyTypes: ["PRODUCER"] }, { name: "transporteur1", companyTypes: ["TRANSPORTER"] }, { name: "transporteur2", companyTypes: ["TRANSPORTER"] }, - { name: "traiteur", companyTypes: ["WASTEPROCESSOR"] } + { + name: "traiteur", + companyTypes: ["WASTEPROCESSOR"], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + } ], steps: [ createFormMultiModal("producteur"), diff --git a/back/src/forms/examples/workflows/multiModalTransporteurEtranger.ts b/back/src/forms/examples/workflows/multiModalTransporteurEtranger.ts index 1be235edd5..ced6b54988 100644 --- a/back/src/forms/examples/workflows/multiModalTransporteurEtranger.ts +++ b/back/src/forms/examples/workflows/multiModalTransporteurEtranger.ts @@ -9,6 +9,7 @@ import { Workflow } from "../../../common/workflow"; import { signEmissionForm } from "../steps/signEmissionForm"; import { signTransportForm } from "../steps/signTransportForm"; import fixtures from "../fixturesForeignTransporter"; +import { WasteProcessorType } from "@prisma/client"; const workflow: Workflow = { title: "Transport multi-modal avec transporteurs étrangers", @@ -29,7 +30,11 @@ mis à jour au fur et mesure de la prise en charge du déchet sur les différent companyTypes: ["TRANSPORTER"], opt: { siret: null, vatNumber: "RO17579668" } }, - { name: "traiteur", companyTypes: ["WASTEPROCESSOR"] } + { + name: "traiteur", + companyTypes: ["WASTEPROCESSOR"], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + } ], steps: [ createFormMultiModal("producteur", fixtures as any), diff --git a/back/src/forms/examples/workflows/multiModalv2.ts b/back/src/forms/examples/workflows/multiModalv2.ts index b19c7c4dd4..b9df8a7780 100644 --- a/back/src/forms/examples/workflows/multiModalv2.ts +++ b/back/src/forms/examples/workflows/multiModalv2.ts @@ -8,6 +8,7 @@ import { signTransportForm } from "../steps/signTransportForm"; import { createFormTransporter } from "../steps/createFormTransporter"; import { updateFormTransporterPlates } from "../steps/updateFormTransporter"; import { updateFormTransporters } from "../steps/updateForm"; +import { WasteProcessorType } from "@prisma/client"; const workflow: Workflow = { title: "Transport multi-modal (amélioration juillet 2023)", @@ -25,7 +26,11 @@ const workflow: Workflow = { { name: "transporteur1", companyTypes: ["TRANSPORTER"] }, { name: "transporteur2", companyTypes: ["TRANSPORTER"] }, { name: "transporteur3", companyTypes: ["TRANSPORTER"] }, - { name: "traiteur", companyTypes: ["WASTEPROCESSOR"] } + { + name: "traiteur", + companyTypes: ["WASTEPROCESSOR"], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + } ], steps: [ { diff --git a/back/src/forms/examples/workflows/regroupement.ts b/back/src/forms/examples/workflows/regroupement.ts index 42a63d9ac9..d412644174 100644 --- a/back/src/forms/examples/workflows/regroupement.ts +++ b/back/src/forms/examples/workflows/regroupement.ts @@ -5,6 +5,7 @@ import { markAsReceived } from "../steps/markAsReceived"; import { markAsAwaitingGroup } from "../steps/markAsProcessed"; import { signEmissionForm } from "../steps/signEmissionForm"; import { signTransportForm } from "../steps/signTransportForm"; +import { WasteProcessorType } from "@prisma/client"; const workflow: Workflow = { title: @@ -20,9 +21,17 @@ const workflow: Workflow = { companies: [ { name: "producteur", companyTypes: ["PRODUCER"] }, { name: "transporteur", companyTypes: ["TRANSPORTER"] }, - { name: "ttr", companyTypes: ["COLLECTOR"] }, + { + name: "ttr", + companyTypes: ["COLLECTOR"], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }, { name: "transporteur2", companyTypes: ["TRANSPORTER"] }, - { name: "traiteur", companyTypes: ["WASTEPROCESSOR"] } + { + name: "traiteur", + companyTypes: ["WASTEPROCESSOR"], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + } ], steps: [ createInitialForm("producteur"), diff --git a/back/src/forms/examples/workflows/regroupementTransporteurEtranger.ts b/back/src/forms/examples/workflows/regroupementTransporteurEtranger.ts index 3ca34c3db0..6d03f16bfd 100644 --- a/back/src/forms/examples/workflows/regroupementTransporteurEtranger.ts +++ b/back/src/forms/examples/workflows/regroupementTransporteurEtranger.ts @@ -6,6 +6,7 @@ import { markAsAwaitingGroup } from "../steps/markAsProcessed"; import { signEmissionForm } from "../steps/signEmissionForm"; import { signTransportForm } from "../steps/signTransportForm"; import fixtures from "../fixturesForeignTransporter"; +import { WasteProcessorType, CollectorType } from "@prisma/client"; const workflow: Workflow = { title: @@ -25,13 +26,21 @@ const workflow: Workflow = { companyTypes: ["TRANSPORTER"], opt: { siret: null, vatNumber: "BE0541696005" } }, - { name: "ttr", companyTypes: ["COLLECTOR"] }, + { + name: "ttr", + companyTypes: ["COLLECTOR"], + collectorTypes: [CollectorType.DANGEROUS_WASTES] + }, { name: "transporteur2", companyTypes: ["TRANSPORTER"], opt: { siret: null, vatNumber: "RO17579668" } }, - { name: "traiteur", companyTypes: ["WASTEPROCESSOR"] } + { + name: "traiteur", + companyTypes: ["WASTEPROCESSOR"], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + } ], steps: [ createInitialForm("producteur", fixtures as any), diff --git a/back/src/forms/resolvers/mutations/__tests__/companyProfiles.ts b/back/src/forms/resolvers/mutations/__tests__/companyProfiles.ts new file mode 100644 index 0000000000..7631fc774a --- /dev/null +++ b/back/src/forms/resolvers/mutations/__tests__/companyProfiles.ts @@ -0,0 +1,52 @@ +import { CompanyType, WasteProcessorType, CollectorType } from "@prisma/client"; + +export const forbbidenProfilesForDangerousWaste = [ + { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [] + }, + { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.NON_DANGEROUS_WASTES_INCINERATION] + }, + { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.CREMATION] + }, + { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.INERT_WASTES_STORAGE] + }, + { + companyTypes: [CompanyType.COLLECTOR], + collectorTypes: [CollectorType.NON_DANGEROUS_WASTES] + }, + { + companyTypes: [CompanyType.COLLECTOR], + collectorTypes: [CollectorType.OTHER_NON_DANGEROUS_WASTES] + } +]; + +export const forbbidenProfilesForNonDangerousWaste = [ + { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [] + }, + { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_STORAGE] + }, + + { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.OTHER_DANGEROUS_WASTES] + }, + { + companyTypes: [CompanyType.COLLECTOR], + collectorTypes: [CollectorType.DANGEROUS_WASTES] + }, + { + companyTypes: [CompanyType.COLLECTOR], + collectorTypes: [CollectorType.OTHER_DANGEROUS_WASTES] + } +]; diff --git a/back/src/forms/resolvers/mutations/__tests__/createForm.integration.ts b/back/src/forms/resolvers/mutations/__tests__/createForm.integration.ts index f2b05b6d2d..28b1785e76 100644 --- a/back/src/forms/resolvers/mutations/__tests__/createForm.integration.ts +++ b/back/src/forms/resolvers/mutations/__tests__/createForm.integration.ts @@ -25,7 +25,9 @@ import { EmitterType, Status, UserRole, - WasteAcceptationStatus + WasteAcceptationStatus, + CompanyType, + WasteProcessorType } from "@prisma/client"; import getReadableId from "../../../readableId"; import { sirenifyFormInput } from "../../../sirenify"; @@ -33,6 +35,11 @@ import { getFirstTransporterSync } from "../../../database"; import { updateAppendix2Queue } from "../../../../queue/producers/updateAppendix2"; import { waitForJobsCompletion } from "../../../../queue/helpers"; +import { + forbbidenProfilesForDangerousWaste, + forbbidenProfilesForNonDangerousWaste +} from "./companyProfiles"; + jest.mock("../../../sirenify"); (sirenifyFormInput as jest.Mock).mockImplementation(input => Promise.resolve(input) @@ -184,7 +191,8 @@ describe("Mutation.createForm", () => { ]); }); - it.each(["emitter", "trader", "recipient", "transporter"])( + it.each(["emitter", "trader", "transporter"])( + // recipient: see below "should allow %p to create a form", async role => { const { user, company } = await userWithCompanyFactory("MEMBER"); @@ -208,6 +216,176 @@ describe("Mutation.createForm", () => { } ); + it("should allow recipient to create a form", async () => { + // recipient needs appropriate profiles and subprofiles + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + + const { mutate } = makeClient(user); + const { data } = await mutate< + Pick, + MutationCreateFormArgs + >(CREATE_FORM, { + variables: { + createFormInput: { + recipient: { + company: { siret: company.siret } + } + } + } + }); + + expect(data.createForm.id).toBeTruthy(); + // check input is sirenified + expect(sirenifyFormInput as jest.Mock).toHaveBeenCalledTimes(1); + }); + + it.each(forbbidenProfilesForDangerousWaste)( + "should forbid recipient with inappropriate profile %o on a bsdd with dangerous waste code (*)", + async opt => { + // recipient needs appropriate profiles and subprofiles + const { user, company } = await userWithCompanyFactory("MEMBER", opt); + + const { mutate } = makeClient(user); + const { errors } = await mutate< + Pick, + MutationCreateFormArgs + >(CREATE_FORM, { + variables: { + createFormInput: { + wasteDetails: { code: "10 05 10*" }, + recipient: { + company: { siret: company.siret } + } + } + } + }); + + expect(errors).toEqual([ + expect.objectContaining({ + message: + "Les autorisations de l'établissement de destination ne semblent pas correspondre " + + "à la caractérisation du déchet renseigné. Merci de bien vouloir procéder à la mise à " + + "jour du profil de l'établissement ou modifier le type de déchet sans quoi le bordereau ne " + + "pourra être enregistré.", + extensions: { + code: "BAD_USER_INPUT" + } + }) + ]); + } + ); + + it.each(forbbidenProfilesForDangerousWaste)( + "should forbid recipient with inappropriate profile %o on a bsdd with non dangerous waste code and wasteDetailsIsDangerous", + async opt => { + // recipient needs appropriate profiles and subprofiles + const { user, company } = await userWithCompanyFactory("MEMBER", opt); + + const { mutate } = makeClient(user); + const { errors } = await mutate< + Pick, + MutationCreateFormArgs + >(CREATE_FORM, { + variables: { + createFormInput: { + wasteDetails: { code: "10 05 09", isDangerous: true }, + recipient: { + company: { siret: company.siret } + } + } + } + }); + + expect(errors).toEqual([ + expect.objectContaining({ + message: + "Les autorisations de l'établissement de destination ne semblent pas correspondre " + + "à la caractérisation du déchet renseigné. Merci de bien vouloir procéder à la mise à " + + "jour du profil de l'établissement ou modifier le type de déchet sans quoi le bordereau ne " + + "pourra être enregistré.", + extensions: { + code: "BAD_USER_INPUT" + } + }) + ]); + } + ); + + it.each(forbbidenProfilesForDangerousWaste)( + "should forbid recipient with inappropriate profile %o on a bsdd with non dangerous waste code and pop", + async opt => { + // recipient needs appropriate profiles and subprofiles + const { user, company } = await userWithCompanyFactory("MEMBER", opt); + + const { mutate } = makeClient(user); + const { errors } = await mutate< + Pick, + MutationCreateFormArgs + >(CREATE_FORM, { + variables: { + createFormInput: { + wasteDetails: { code: "10 05 09", pop: true }, + recipient: { + company: { siret: company.siret } + } + } + } + }); + + expect(errors).toEqual([ + expect.objectContaining({ + message: + "Les autorisations de l'établissement de destination ne semblent pas correspondre " + + "à la caractérisation du déchet renseigné. Merci de bien vouloir procéder à la mise à " + + "jour du profil de l'établissement ou modifier le type de déchet sans quoi le bordereau ne " + + "pourra être enregistré.", + extensions: { + code: "BAD_USER_INPUT" + } + }) + ]); + } + ); + + it.each(forbbidenProfilesForNonDangerousWaste)( + "should forbid recipient with inappropriate profile %o on a non dangerous bsdd ", + async opt => { + // recipient needs appropriate profiles and subprofiles + const { user, company } = await userWithCompanyFactory("MEMBER", opt); + + const { mutate } = makeClient(user); + const { errors } = await mutate< + Pick, + MutationCreateFormArgs + >(CREATE_FORM, { + variables: { + createFormInput: { + wasteDetails: { code: "10 05 09" }, // non dnagerous + recipient: { + company: { siret: company.siret } + } + } + } + }); + + expect(errors).toEqual([ + expect.objectContaining({ + message: + "Les autorisations de l'établissement de destination ne semblent pas correspondre " + + "à la caractérisation du déchet renseigné. Merci de bien vouloir procéder à la mise à " + + "jour du profil de l'établissement ou modifier le type de déchet sans quoi le bordereau ne " + + "pourra être enregistré.", + extensions: { + code: "BAD_USER_INPUT" + } + }) + ]); + } + ); + it("should allow a transporter listed in the transporters list to create a form", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); @@ -398,7 +576,12 @@ describe("Mutation.createForm", () => { it("should allow to create a form without space in recipientProcessingOperation", async () => { const { user, company: emitter } = await userWithCompanyFactory("MEMBER"); const transporter = await companyFactory(); - const destination = await companyFactory(); + + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const { mutate } = makeClient(user); const { data, errors } = await mutate< @@ -765,7 +948,11 @@ describe("Mutation.createForm", () => { it("create a form with a recipient", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); const { company: recipientCompany } = await userWithCompanyFactory( - "MEMBER" + "MEMBER", + { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + } ); const createFormInput = { @@ -2109,6 +2296,11 @@ describe("Mutation.createForm", () => { it("should fill denormalized fields upon creation", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); + // recipient needs appropriate profiles and subprofiles + const recipient = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const { mutate } = makeClient(user); const intermediaryCreation = toIntermediaryCompany(company); @@ -2124,7 +2316,7 @@ describe("Mutation.createForm", () => { company: { siret: company.siret } }, transporter: { company: { siret: company.siret } }, - recipient: { company: { siret: company.siret } }, + recipient: { company: { siret: recipient.siret } }, intermediaries: [intermediaryCreation] } } @@ -2134,7 +2326,7 @@ describe("Mutation.createForm", () => { where: { id: data.createForm.id } }); - expect(form.recipientsSirets).toContain(company.siret); + expect(form.recipientsSirets).toContain(recipient.siret); expect(form.transportersSirets).toContain(company.siret); expect(form.intermediariesSirets).toContain(company.siret); }); diff --git a/back/src/forms/resolvers/mutations/__tests__/importPaperForm.integration.ts b/back/src/forms/resolvers/mutations/__tests__/importPaperForm.integration.ts index 7418fbb8fa..c0468556b4 100644 --- a/back/src/forms/resolvers/mutations/__tests__/importPaperForm.integration.ts +++ b/back/src/forms/resolvers/mutations/__tests__/importPaperForm.integration.ts @@ -5,7 +5,9 @@ import { Prisma, QuantityType, Status, - WasteAcceptationStatus + WasteAcceptationStatus, + CompanyType, + WasteProcessorType } from "@prisma/client"; import { format } from "date-fns"; import { prisma } from "@td/prisma"; @@ -43,7 +45,13 @@ describe("mutation / importPaperForm", () => { "MEMBER" ); const { company: recipientCompany } = await userWithCompanyFactory( - "MEMBER" + "MEMBER", + { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [ + WasteProcessorType.DANGEROUS_WASTES_INCINERATION + ] + } ); const input = { @@ -127,7 +135,10 @@ describe("mutation / importPaperForm", () => { }); it("should import a BSD where user is recipient", async () => { - const { user, company } = await userWithCompanyFactory("MEMBER"); + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const { mutate } = makeClient(user); @@ -166,7 +177,10 @@ describe("mutation / importPaperForm", () => { }); it("should fail if data is incomplete", async () => { - const { user, company } = await userWithCompanyFactory("MEMBER"); + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const { mutate } = makeClient(user); @@ -189,7 +203,10 @@ describe("mutation / importPaperForm", () => { }); it("should import a form with an ecoOrganisme", async () => { - const { user, company } = await userWithCompanyFactory("MEMBER"); + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const ecoOrganisme = await prisma.ecoOrganisme.create({ data: { name: "EO", @@ -228,7 +245,10 @@ describe("mutation / importPaperForm", () => { }); it("should fail if eco-organisme is not known", async () => { - const { user, company } = await userWithCompanyFactory("MEMBER"); + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const { mutate } = makeClient(user); @@ -257,7 +277,12 @@ describe("mutation / importPaperForm", () => { test.each(allowedFormats)( "%p should be a valid format form date fields", async f => { - const { user, company } = await userWithCompanyFactory("MEMBER"); + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [ + WasteProcessorType.DANGEROUS_WASTES_INCINERATION + ] + }); const { mutate } = makeClient(user); @@ -295,7 +320,10 @@ describe("mutation / importPaperForm", () => { ); it("should set status to AWAITING_GROUP in case of groupement code", async () => { - const { user, company } = await userWithCompanyFactory("MEMBER"); + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const { mutate } = makeClient(user); @@ -328,7 +356,10 @@ describe("mutation / importPaperForm", () => { }); it("should set status to NO_TREACEABILITY in case of no traceability", async () => { - const { user, company } = await userWithCompanyFactory("MEMBER"); + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const { mutate } = makeClient(user); @@ -436,7 +467,10 @@ describe("mutation / importPaperForm", () => { it("should update a sealed form with imported data when user is recipient", async () => { const owner = await userFactory(); - const { user, company } = await userWithCompanyFactory("MEMBER"); + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); // create a form with a sealed status const form = await formFactory({ @@ -525,7 +559,10 @@ describe("mutation / importPaperForm", () => { it("should update as sealed form and overwrite existing data", async () => { const owner = await userFactory(); - const { user, company } = await userWithCompanyFactory("MEMBER"); + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); // create a form with a sealed status const form = await formFactory({ @@ -630,7 +667,10 @@ describe("mutation / importPaperForm", () => { it("should fail to update a sealed form if data is missing", async () => { const owner = await userFactory(); - const { user, company } = await userWithCompanyFactory("MEMBER"); + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: owner.id, @@ -668,7 +708,10 @@ describe("mutation / importPaperForm", () => { it("should fail when trying to update a SIRET", async () => { const owner = await userFactory(); - const { user, company } = await userWithCompanyFactory("MEMBER"); + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); // create a form with a sealed status const form = await formFactory({ @@ -708,7 +751,10 @@ describe("mutation / importPaperForm", () => { it("should set status to AWAITING_GROUP in case of groupement code", async () => { const owner = await userFactory(); - const { user, company } = await userWithCompanyFactory("MEMBER"); + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: owner.id, @@ -755,7 +801,10 @@ describe("mutation / importPaperForm", () => { it("should set status to NO_TRACEABILITY in case of no traceability", async () => { const owner = await userFactory(); - const { user, company } = await userWithCompanyFactory("MEMBER"); + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: owner.id, diff --git a/back/src/forms/resolvers/mutations/__tests__/markAsResealed.integration.ts b/back/src/forms/resolvers/mutations/__tests__/markAsResealed.integration.ts index 40d24fd601..4195d32292 100644 --- a/back/src/forms/resolvers/mutations/__tests__/markAsResealed.integration.ts +++ b/back/src/forms/resolvers/mutations/__tests__/markAsResealed.integration.ts @@ -11,7 +11,13 @@ import { userWithCompanyFactory } from "../../../../__tests__/factories"; import makeClient from "../../../../__tests__/testClient"; -import { CompanyType, CompanyVerificationStatus, Status } from "@prisma/client"; +import { + CompanyType, + CompanyVerificationStatus, + Status, + CollectorType, + WasteProcessorType +} from "@prisma/client"; import { Mutation, MutationMarkAsResealedArgs @@ -19,7 +25,10 @@ import { import { gql } from "graphql-tag"; import { sirenifyResealedFormInput } from "../../../sirenify"; import { getFirstTransporterSync } from "../../../database"; - +import { + forbbidenProfilesForDangerousWaste, + forbbidenProfilesForNonDangerousWaste +} from "./companyProfiles"; jest.mock("../../../sirenify"); (sirenifyResealedFormInput as jest.Mock).mockImplementation(input => Promise.resolve(input) @@ -355,11 +364,14 @@ describe("Mutation markAsResealed", () => { const owner = await userFactory(); const { user, company: collector } = await userWithCompanyFactory( "MEMBER", - { companyTypes: { set: [CompanyType.COLLECTOR] } } + { + companyTypes: { set: [CompanyType.COLLECTOR] } + } ); const destination = await companyFactory({ - companyTypes: [CompanyType.WASTEPROCESSOR] + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] }); const { mutate } = makeClient(user); @@ -539,6 +551,95 @@ describe("Mutation markAsResealed", () => { ]); }); + it.each(forbbidenProfilesForDangerousWaste)( + "should fail if destination after temp storage does not have appropriate subprofile (%o) when waste is dangerous", + async opt => { + const owner = await userFactory(); + const { user, company: collector } = await userWithCompanyFactory( + "MEMBER", + { + companyTypes: { set: [CompanyType.COLLECTOR] } + } + ); + + const { mutate } = makeClient(user); + + const destination = await companyFactory(opt); + + const form = await formWithTempStorageFactory({ + ownerId: owner.id, + opt: { + status: Status.TEMP_STORER_ACCEPTED, + recipientCompanySiret: collector.siret, + quantityReceived: 1 + }, + forwardedInOpts: { + recipientCompanySiret: destination.siret + } + }); + + const { errors } = await mutate(MARK_AS_RESEALED, { + variables: { + id: form.id, + resealedInfos: {} + } + }); + + expect(errors).toEqual([ + expect.objectContaining({ + message: + "Les autorisations de l'établissement de destination ne semblent pas correspondre à la caractérisation du déchet renseigné. Merci de bien vouloir procéder à la mise à jour du profil de l'établissement ou modifier le type de déchet sans quoi le bordereau ne pourra être enregistré." + }) + ]); + } + ); + + it.each(forbbidenProfilesForNonDangerousWaste)( + "should fail if destination after temp storage does not have appropriate subprofile (%o) whenwaste is not dangerous", + async opt => { + const owner = await userFactory(); + const { user, company: collector } = await userWithCompanyFactory( + "MEMBER", + { + companyTypes: { set: [CompanyType.COLLECTOR] } + } + ); + + const { mutate } = makeClient(user); + + const destination = await companyFactory(opt); + + const form = await formWithTempStorageFactory({ + ownerId: owner.id, + opt: { + status: Status.TEMP_STORER_ACCEPTED, + recipientCompanySiret: collector.siret, + wasteDetailsCode: "10 05 09", + wasteDetailsIsDangerous: false, + wasteDetailsPop: false, + quantityReceived: 1 + }, + forwardedInOpts: { + recipientCompanySiret: destination.siret + } + }); + + const { errors } = await mutate(MARK_AS_RESEALED, { + variables: { + id: form.id, + resealedInfos: {} + } + }); + + expect(errors).toEqual([ + expect.objectContaining({ + message: + "Les autorisations de l'établissement de destination ne semblent pas correspondre à la caractérisation du déchet renseigné. Merci de bien vouloir procéder à la mise à jour du profil de l'établissement ou modifier le type de déchet sans quoi le bordereau ne pourra être enregistré." + }) + ]); + } + ); + it("should throw an error if VERIFY_COMPANY=true and destination after temp storage is not verified", async () => { // patch process.env and reload server process.env.VERIFY_COMPANY = "true"; @@ -687,7 +788,8 @@ describe("Mutation markAsResealed", () => { const { mutate } = makeClient(user); const destination = await companyFactory({ - companyTypes: [CompanyType.COLLECTOR] + companyTypes: [CompanyType.COLLECTOR], + collectorTypes: { set: [CollectorType.DANGEROUS_WASTES] } }); const form = await formWithTempStorageFactory({ diff --git a/back/src/forms/resolvers/mutations/__tests__/markAsResent.integration.ts b/back/src/forms/resolvers/mutations/__tests__/markAsResent.integration.ts index 181e2eab84..1b6525a196 100644 --- a/back/src/forms/resolvers/mutations/__tests__/markAsResent.integration.ts +++ b/back/src/forms/resolvers/mutations/__tests__/markAsResent.integration.ts @@ -7,7 +7,7 @@ import { userWithCompanyFactory } from "../../../../__tests__/factories"; import makeClient from "../../../../__tests__/testClient"; -import { CompanyType } from "@prisma/client"; +import { CompanyType, WasteProcessorType } from "@prisma/client"; const MARK_AS_RESENT = ` mutation MarkAsResent($id: ID!, $resentInfos: ResentFormInput!){ @@ -24,11 +24,16 @@ describe("Mutation markAsResent", () => { test("it fails when form is not TEMP_STORER_ACCEPTED", async () => { const owner = await userFactory(); const { user, company } = await userWithCompanyFactory("MEMBER", { - companyTypes: { set: [CompanyType.COLLECTOR] } + companyTypes: { + set: [CompanyType.COLLECTOR] + } }); const { company: destination } = await userWithCompanyFactory("MEMBER", { - companyTypes: { set: [CompanyType.WASTEPROCESSOR] } + companyTypes: { set: [CompanyType.WASTEPROCESSOR] }, + wasteProcessorTypes: { + set: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + } }); const { mutate } = makeClient(user); @@ -65,7 +70,10 @@ describe("Mutation markAsResent", () => { }); const { company: destination } = await userWithCompanyFactory("MEMBER", { - companyTypes: { set: [CompanyType.WASTEPROCESSOR] } + companyTypes: { set: [CompanyType.WASTEPROCESSOR] }, + wasteProcessorTypes: { + set: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + } }); const { mutate } = makeClient(user); @@ -150,7 +158,10 @@ describe("Mutation markAsResent", () => { companyTypes: { set: [CompanyType.COLLECTOR] } }); const { company: destination } = await userWithCompanyFactory("MEMBER", { - companyTypes: { set: [CompanyType.WASTEPROCESSOR] } + companyTypes: { set: [CompanyType.WASTEPROCESSOR] }, + wasteProcessorTypes: { + set: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + } }); const { mutate } = makeClient(user); diff --git a/back/src/forms/resolvers/mutations/__tests__/markAsSealed.integration.ts b/back/src/forms/resolvers/mutations/__tests__/markAsSealed.integration.ts index 08ce4a7639..9f66c831e0 100644 --- a/back/src/forms/resolvers/mutations/__tests__/markAsSealed.integration.ts +++ b/back/src/forms/resolvers/mutations/__tests__/markAsSealed.integration.ts @@ -1,4 +1,10 @@ -import { CompanyType, CompanyVerificationStatus, Status } from "@prisma/client"; +import { + CompanyType, + CompanyVerificationStatus, + Status, + WasteProcessorType, + CollectorType +} from "@prisma/client"; import { resetDatabase } from "../../../../../integration-tests/helper"; import { Mutation, @@ -55,14 +61,12 @@ describe("Mutation.markAsSealed", () => { it("should fail if SEALED is not a possible next state", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); - const destination = await destinationFactory(); const form = await formFactory({ ownerId: user.id, opt: { status: "SENT", - emitterCompanySiret: company.siret, - recipientCompanySiret: destination.siret + emitterCompanySiret: company.siret } }); @@ -79,6 +83,41 @@ describe("Mutation.markAsSealed", () => { ); }); + it("should fail if destination has inappropriate profile", async () => { + const { user, company } = await userWithCompanyFactory("MEMBER"); + const destination = await companyFactory(); + + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "DRAFT", + emitterCompanySiret: company.siret, + recipientCompanySiret: destination.siret + } + }); + + const { mutate } = makeClient(user); + const { errors } = await mutate(MARK_AS_SEALED, { + variables: { + id: form.id + } + }); + + expect(errors).toEqual([ + expect.objectContaining({ + message: + "Erreur, impossible de valider le bordereau car des champs obligatoires ne sont pas renseignés.\n" + + "Erreur(s): Les autorisations de l'établissement de destination ne semblent pas correspondre à la " + + "caractérisation du déchet renseigné. Merci de bien vouloir procéder à la mise à jour du profil de " + + "l'établissement ou modifier le type de déchet sans quoi le bordereau ne pourra être enregistré.", + + extensions: { + code: "BAD_USER_INPUT" + } + }) + ]); + }); + it.each(["emitter", "recipient", "trader", "broker", "transporter"])( "%p of the BSD can seal it", async role => { @@ -92,7 +131,14 @@ describe("Mutation.markAsSealed", () => { }[role]); const { user, company } = await userWithCompanyFactory("MEMBER", { - companyTypes: { set: [companyType(role) as CompanyType] } + companyTypes: { set: [companyType(role) as CompanyType] }, + ...(role === "recipient" + ? { + wasteProcessorTypes: [ + WasteProcessorType.DANGEROUS_WASTES_INCINERATION + ] + } + : {}) }); const form = await formFactory({ @@ -382,7 +428,10 @@ describe("Mutation.markAsSealed", () => { it("the BSD can not be sealed if data do not validate", async () => { const { user, company } = await userWithCompanyFactory("MEMBER", { - companyTypes: { set: [CompanyType.WASTEPROCESSOR] } + companyTypes: { set: [CompanyType.WASTEPROCESSOR] }, + wasteProcessorTypes: { + set: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + } }); let form = await formFactory({ @@ -921,7 +970,6 @@ describe("Mutation.markAsSealed", () => { it("should mark appendix2 forms as grouped", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); - const destination = await destinationFactory(); const groupedForm1 = await formFactory({ ownerId: user.id, opt: { status: "AWAITING_GROUP", quantityReceived: 1 } @@ -943,7 +991,6 @@ describe("Mutation.markAsSealed", () => { status: "DRAFT", emitterType: "APPENDIX2", emitterCompanySiret: company.siret, - recipientCompanySiret: destination.siret, grouping: { create: [ { @@ -1209,7 +1256,10 @@ describe("Mutation.markAsSealed", () => { expect.objectContaining({ message: [ "Erreur, impossible de valider le bordereau car des champs obligatoires ne sont pas renseignés.", - `Erreur(s): L'installation de destination ou d’entreposage ou de reconditionnement avec le SIRET "${destination.siret}" n'est pas inscrite sur Trackdéchets en tant qu'installation de traitement ou de tri transit regroupement. Cette installation ne peut donc pas être visée sur le bordereau. Veuillez vous rapprocher de l'administrateur de cette installation pour qu'il modifie le profil de l'établissement depuis l'interface Trackdéchets dans Mes établissements` + `Erreur(s): L'installation de destination ou d’entreposage ou de reconditionnement avec le SIRET "${destination.siret}" n'est pas inscrite sur Trackdéchets en tant qu'installation de traitement ou de tri transit regroupement. Cette installation ne peut donc pas être visée sur le bordereau. Veuillez vous rapprocher de l'administrateur de cette installation pour qu'il modifie le profil de l'établissement depuis l'interface Trackdéchets dans Mes établissements`, + "Les autorisations de l'établissement de destination ne semblent pas correspondre à la caractérisation " + + "du déchet renseigné. Merci de bien vouloir procéder à la mise à jour du profil de l'établissement ou modifier " + + "le type de déchet sans quoi le bordereau ne pourra être enregistré." ].join("\n") }) ]); @@ -1220,7 +1270,8 @@ describe("Mutation.markAsSealed", () => { "MEMBER" ); const collector = await companyFactory({ - companyTypes: { set: [CompanyType.COLLECTOR] } + companyTypes: { set: [CompanyType.COLLECTOR] }, + collectorTypes: { set: [CollectorType.DANGEROUS_WASTES] } }); const form = await formWithTempStorageFactory({ @@ -1256,7 +1307,8 @@ describe("Mutation.markAsSealed", () => { "MEMBER" ); const collector = await companyFactory({ - companyTypes: { set: [CompanyType.COLLECTOR] } + companyTypes: { set: [CompanyType.COLLECTOR] }, + collectorTypes: { set: [CollectorType.DANGEROUS_WASTES] } }); const destination = await companyFactory({ // assume profile is not COLLECTOR or WASTEPROCESSOR @@ -1300,8 +1352,14 @@ describe("Mutation.markAsSealed", () => { ); const destination = await companyFactory({ companyTypes: { set: [CompanyType.WASTEPROCESSOR] }, + + wasteProcessorTypes: { + set: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }, + verificationStatus: CompanyVerificationStatus.TO_BE_VERIFIED }); + const form = await formFactory({ ownerId: user.id, opt: { @@ -1336,7 +1394,9 @@ describe("Mutation.markAsSealed", () => { "MEMBER" ); const collector = await companyFactory({ - companyTypes: { set: [CompanyType.COLLECTOR] }, + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION], + verificationStatus: CompanyVerificationStatus.VERIFIED }); const destination = await companyFactory({ @@ -1374,7 +1434,8 @@ describe("Mutation.markAsSealed", () => { const { user, company: destination } = await userWithCompanyFactory( "MEMBER", { - companyTypes: [CompanyType.WASTEPROCESSOR] + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] } ); const form = await formFactory({ @@ -1461,7 +1522,8 @@ describe("Mutation.markAsSealed", () => { companyTypes: [CompanyType.PRODUCER] }); const recipient = await companyFactory({ - companyTypes: [CompanyType.WASTEPROCESSOR] + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] }); const broker = await companyFactory(); @@ -1503,7 +1565,8 @@ describe("Mutation.markAsSealed", () => { companyTypes: [CompanyType.PRODUCER] }); const recipient = await companyFactory({ - companyTypes: [CompanyType.WASTEPROCESSOR] + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] }); const broker = await companyFactory(); @@ -1541,7 +1604,10 @@ describe("Mutation.markAsSealed", () => { }); it("should fail if bsd has a foreign ship and the wrong emitterType", async () => { - const { user, company } = await userWithCompanyFactory("MEMBER"); + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, @@ -1573,7 +1639,10 @@ describe("Mutation.markAsSealed", () => { }); it("should fail if bsd has a private producer and the wrong emitterType", async () => { - const { user, company } = await userWithCompanyFactory("MEMBER"); + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, @@ -1605,7 +1674,10 @@ describe("Mutation.markAsSealed", () => { }); it("should seal and automatically transition to SIGNED_BY_PRODUCER when private individual emitter", async () => { - const { user, company } = await userWithCompanyFactory("MEMBER"); + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, @@ -1637,7 +1709,10 @@ describe("Mutation.markAsSealed", () => { }); it("should seal and automatically transition to SIGNED_BY_PRODUCER when foreign ship emitter", async () => { - const { user, company } = await userWithCompanyFactory("MEMBER"); + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, diff --git a/back/src/forms/resolvers/mutations/__tests__/updateForm.integration.ts b/back/src/forms/resolvers/mutations/__tests__/updateForm.integration.ts index 79ac69a44c..df1c67fcc0 100644 --- a/back/src/forms/resolvers/mutations/__tests__/updateForm.integration.ts +++ b/back/src/forms/resolvers/mutations/__tests__/updateForm.integration.ts @@ -1,4 +1,10 @@ -import { EmitterType, Status, UserRole } from "@prisma/client"; +import { + EmitterType, + Status, + UserRole, + CompanyType, + WasteProcessorType +} from "@prisma/client"; import { resetDatabase } from "../../../../../integration-tests/helper"; import { prisma } from "@td/prisma"; import { ErrorCode } from "../../../../common/errors"; @@ -27,6 +33,10 @@ import { getFirstTransporter, getTransportersSync } from "../../../database"; import { getStream } from "../../../../activity-events"; import { updateAppendix2Queue } from "../../../../queue/producers/updateAppendix2"; import { waitForJobsCompletion } from "../../../../queue/helpers"; +import { + forbbidenProfilesForDangerousWaste, + forbbidenProfilesForNonDangerousWaste +} from "./companyProfiles"; jest.mock("../../../sirenify"); (sirenifyFormInput as jest.Mock).mockImplementation(input => @@ -247,7 +257,10 @@ describe("Mutation.updateForm", () => { it("should be possible for the TTR to resend the same data on the temporaryStorateDetail input", async () => { const emitter = await userWithCompanyFactory("ADMIN"); - const ttr = await userWithCompanyFactory("ADMIN"); + const ttr = await userWithCompanyFactory("ADMIN", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const destination = await companyFactory(); const form = await formWithTempStorageFactory({ @@ -279,7 +292,10 @@ describe("Mutation.updateForm", () => { it("should not be possible to update intermediaries when emitter has signed", async () => { const emitter = await userWithCompanyFactory("ADMIN"); - const destination = await userWithCompanyFactory("ADMIN"); + const destination = await userWithCompanyFactory("ADMIN", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const intermediary1 = await companyFactory(); const intermediary2 = await companyFactory(); const form = await formFactory({ @@ -339,7 +355,10 @@ describe("Mutation.updateForm", () => { it("should be possible to resend same intermediaries data when emitter has signed", async () => { const emitter = await userWithCompanyFactory("ADMIN"); - const destination = await userWithCompanyFactory("ADMIN"); + const destination = await userWithCompanyFactory("ADMIN", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const intermediary1 = await companyFactory(); const form = await formFactory({ ownerId: emitter.user.id, @@ -370,7 +389,10 @@ describe("Mutation.updateForm", () => { it("should be possible to resend same Decimal value when emitter has signed", async () => { const emitter = await userWithCompanyFactory("ADMIN"); - const destination = await userWithCompanyFactory("ADMIN"); + const destination = await userWithCompanyFactory("ADMIN", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const intermediary1 = await companyFactory(); const form = await formFactory({ ownerId: emitter.user.id, @@ -399,13 +421,21 @@ describe("Mutation.updateForm", () => { expect(errors).toBeUndefined(); }); - it.each(["emitter", "trader", "broker", "recipient", "transporter"])( + it.each(["emitter", "trader", "broker", "transporter"])( "should allow %p to update a draft form", async role => { const { user, company } = await userWithCompanyFactory("MEMBER"); + + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formFactory({ ownerId: user.id, opt: { + recipientCompanySiret: destination.siret, status: "DRAFT", ...(role === "transporter" ? { @@ -432,6 +462,7 @@ describe("Mutation.updateForm", () => { const { data } = await mutate>(UPDATE_FORM, { variables: { updateFormInput } }); + expect(data.updateForm.wasteDetails).toMatchObject( updateFormInput.wasteDetails ); @@ -440,6 +471,290 @@ describe("Mutation.updateForm", () => { } ); + it("should allow recipient to update a draft form", async () => { + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "DRAFT", + recipientCompanySiret: company.siret + } + }); + + const { mutate } = makeClient(user); + const updateFormInput = { + id: form.id, + wasteDetails: { + code: "01 01 01" + } + }; + const { data } = await mutate>(UPDATE_FORM, { + variables: { updateFormInput } + }); + expect(data.updateForm.wasteDetails).toMatchObject( + updateFormInput.wasteDetails + ); + // check input is sirenified + expect(sirenifyFormInput as jest.Mock).toHaveBeenCalledTimes(1); + }); + + it.each(forbbidenProfilesForDangerousWaste)( + "should forbid recipient without inappropriate profile %o on a draft bsdd with dangerous waste code", + async opt => { + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "DRAFT", + emitterCompanySiret: company.siret + } + }); + + const { mutate } = makeClient(user); + const destination = await companyFactory(opt); + const updateFormInput = { + id: form.id, + recipient: { + company: { siret: destination.siret } + } + }; + const { errors } = await mutate>( + UPDATE_FORM, + { + variables: { updateFormInput } + } + ); + expect(errors).toEqual([ + expect.objectContaining({ + message: + "Les autorisations de l'établissement de destination ne semblent pas correspondre " + + "à la caractérisation du déchet renseigné. Merci de bien vouloir procéder à la mise à " + + "jour du profil de l'établissement ou modifier le type de déchet sans quoi le bordereau ne " + + "pourra être enregistré.", + extensions: { + code: "BAD_USER_INPUT" + } + }) + ]); + } + ); + + it.each(forbbidenProfilesForDangerousWaste)( + "should forbid recipient without inappropriate profile %o on a draft bsdd with non dangerous waste and isDangerous", + async opt => { + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "DRAFT", + emitterCompanySiret: company.siret, + wasteDetailsCode: "10 05 09", + wasteDetailsIsDangerous: true + } + }); + + const { mutate } = makeClient(user); + const destination = await companyFactory(opt); + const updateFormInput = { + id: form.id, + recipient: { + company: { siret: destination.siret } + } + }; + const { errors } = await mutate>( + UPDATE_FORM, + { + variables: { updateFormInput } + } + ); + expect(errors).toEqual([ + expect.objectContaining({ + message: + "Les autorisations de l'établissement de destination ne semblent pas correspondre " + + "à la caractérisation du déchet renseigné. Merci de bien vouloir procéder à la mise à " + + "jour du profil de l'établissement ou modifier le type de déchet sans quoi le bordereau ne " + + "pourra être enregistré.", + extensions: { + code: "BAD_USER_INPUT" + } + }) + ]); + } + ); + + it.each(forbbidenProfilesForDangerousWaste)( + "should forbid recipient without inappropriate profile %o on a draft bsdd with non dangerous waste code and pop", + async opt => { + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "DRAFT", + emitterCompanySiret: company.siret, + wasteDetailsCode: "10 05 09", + wasteDetailsPop: true + } + }); + + const { mutate } = makeClient(user); + const destination = await companyFactory(opt); + const updateFormInput = { + id: form.id, + recipient: { + company: { siret: destination.siret } + } + }; + const { errors } = await mutate>( + UPDATE_FORM, + { + variables: { updateFormInput } + } + ); + expect(errors).toEqual([ + expect.objectContaining({ + message: + "Les autorisations de l'établissement de destination ne semblent pas correspondre " + + "à la caractérisation du déchet renseigné. Merci de bien vouloir procéder à la mise à " + + "jour du profil de l'établissement ou modifier le type de déchet sans quoi le bordereau ne " + + "pourra être enregistré.", + extensions: { + code: "BAD_USER_INPUT" + } + }) + ]); + } + ); + + it.each(forbbidenProfilesForNonDangerousWaste)( + "should forbid recipient without inappropriate profile %o on a draft bsdd with non dangerous waste", + async opt => { + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "DRAFT", + emitterCompanySiret: company.siret, + wasteDetailsCode: "10 05 09", + wasteDetailsIsDangerous: false, + wasteDetailsPop: false + } + }); + + const { mutate } = makeClient(user); + const destination = await companyFactory(opt); + const updateFormInput = { + id: form.id, + recipient: { + company: { siret: destination.siret } + } + }; + const { errors } = await mutate>( + UPDATE_FORM, + { + variables: { updateFormInput } + } + ); + expect(errors).toEqual([ + expect.objectContaining({ + message: + "Les autorisations de l'établissement de destination ne semblent pas correspondre " + + "à la caractérisation du déchet renseigné. Merci de bien vouloir procéder à la mise à " + + "jour du profil de l'établissement ou modifier le type de déchet sans quoi le bordereau ne " + + "pourra être enregistré.", + extensions: { + code: "BAD_USER_INPUT" + } + }) + ]); + } + ); + + it.each(forbbidenProfilesForDangerousWaste)( + "should allow recipient with inappropriate profile %o on a draft bsdd with dangerous waste code on bsdd created before VERIFY_DESTINATION_PROFILES_FOR_BSDD_CREATED_AFTER", + async opt => { + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "DRAFT", + emitterCompanySiret: company.siret, + createdAt: new Date("2024-10-01T00:00:00.000Z") // created before VERIFY_DESTINATION_PROFILES_FOR_BSDD_CREATED_AFTER + } + }); + + const { mutate } = makeClient(user); + const destination = await companyFactory(opt); + const updateFormInput = { + id: form.id, + recipient: { + company: { siret: destination.siret } + } + }; + const { errors } = await mutate>( + UPDATE_FORM, + { + variables: { updateFormInput } + } + ); + expect(errors).toBe(undefined); + } + ); + + it.each(forbbidenProfilesForNonDangerousWaste)( + "should allow recipient with inappropriate profile %o on a draft bsdd with non dangerous waste on bsdd created before VERIFY_DESTINATION_PROFILES_FOR_BSDD_CREATED_AFTER", + async opt => { + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "DRAFT", + emitterCompanySiret: company.siret, + wasteDetailsCode: "10 05 09", + wasteDetailsIsDangerous: false, + wasteDetailsPop: false, + createdAt: new Date("2024-10-01T00:00:00.000Z") // created before VERIFY_DESTINATION_PROFILES_FOR_BSDD_CREATED_AFTER + } + }); + + const { mutate } = makeClient(user); + const destination = await companyFactory(opt); + const updateFormInput = { + id: form.id, + recipient: { + company: { siret: destination.siret } + } + }; + const { errors } = await mutate>( + UPDATE_FORM, + { + variables: { updateFormInput } + } + ); + expect(errors).toBe(undefined); + } + ); + it("should autocomplete transporter receipt with receipt pulled from db", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); @@ -449,11 +764,19 @@ describe("Mutation.updateForm", () => { await transporterReceiptFactory({ company: transporterCompany }); + + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formFactory({ ownerId: user.id, opt: { status: "DRAFT", emitterCompanySiret: company.siret, + recipientCompanySiret: destination.siret, transporters: { create: { transporterCompanySiret: company.siret, @@ -487,11 +810,19 @@ describe("Mutation.updateForm", () => { const transporterCompany = await companyFactory({ companyTypes: ["TRANSPORTER"] }); + + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formFactory({ ownerId: user.id, opt: { status: "DRAFT", emitterCompanySiret: company.siret, + recipientCompanySiret: destination.siret, transporters: { create: { transporterCompanySiret: company.siret, @@ -523,12 +854,20 @@ describe("Mutation.updateForm", () => { it("should let the transporter receipt unchanged if transporter is unchanged", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); const receipt = await transporterReceiptFactory({ company }); - // form receipt is fileld + + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + + // form receipt is filled const form = await formFactory({ ownerId: user.id, opt: { status: "DRAFT", emitterCompanySiret: company.siret, + recipientCompanySiret: destination.siret, transporters: { create: { transporterCompanySiret: company.siret, @@ -560,64 +899,364 @@ describe("Mutation.updateForm", () => { ); }); - it.each(["emitter", "trader", "broker", "recipient", "transporter"])( - "should allow %p to update a sealed form", - async role => { - const { user, company } = await userWithCompanyFactory("MEMBER"); + it.each(["emitter", "trader", "broker", "transporter"])( + "should allow %p to update a sealed form", + async role => { + const { user, company } = await userWithCompanyFactory("MEMBER"); + + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + + const form = await formFactory({ + ownerId: user.id, + opt: { + recipientCompanySiret: destination.siret, + + status: "SEALED", + ...(role === "transporter" + ? { + transporters: { + create: { + [`${role}CompanySiret`]: company.siret, + number: 1 + } + } + } + : { + [`${role}CompanySiret`]: company.siret + }), + ...(["trader", "broker"].includes(role) + ? { + [`${role}CompanyName`]: "Trader or Broker", + [`${role}CompanyContact`]: "Mr Trader or Broker", + [`${role}CompanyMail`]: "traderbroker@trackdechets.fr", + [`${role}CompanyAddress`]: "Wall street", + [`${role}CompanyPhone`]: "00 00 00 00 00", + [`${role}Receipt`]: "receipt", + [`${role}Department`]: "07", + [`${role}ValidityLimit`]: new Date("2023-01-01") + } + : {}) + } + }); + + const { mutate } = makeClient(user); + const updateFormInput = { + id: form.id, + wasteDetails: { + code: "08 01 11*" + } + }; + const { data } = await mutate>(UPDATE_FORM, { + variables: { updateFormInput } + }); + + expect(data.updateForm.wasteDetails).toMatchObject( + updateFormInput.wasteDetails + ); + } + ); + + it("should allow recipient to update a sealed form", async () => { + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "SEALED", + + recipientCompanySiret: company.siret + } + }); + + const { mutate } = makeClient(user); + const updateFormInput = { + id: form.id, + wasteDetails: { + code: "08 01 11*" + } + }; + const { data } = await mutate>(UPDATE_FORM, { + variables: { updateFormInput } + }); + + expect(data.updateForm.wasteDetails).toMatchObject( + updateFormInput.wasteDetails + ); + }); + + it.each(forbbidenProfilesForDangerousWaste)( + "should forbid recipient without inappropriate profile %o on a sealed bsdd with dangerous waste code", + async opt => { + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "SEALED", + emitterCompanySiret: company.siret + } + }); + + const { mutate } = makeClient(user); + const destination = await companyFactory(opt); + const updateFormInput = { + id: form.id, + recipient: { + company: { siret: destination.siret } + } + }; + const { errors } = await mutate>( + UPDATE_FORM, + { + variables: { updateFormInput } + } + ); + expect(errors).toEqual([ + expect.objectContaining({ + message: + "Les autorisations de l'établissement de destination ne semblent pas correspondre " + + "à la caractérisation du déchet renseigné. Merci de bien vouloir procéder à la mise à " + + "jour du profil de l'établissement ou modifier le type de déchet sans quoi le bordereau ne " + + "pourra être enregistré.", + extensions: { + code: "BAD_USER_INPUT" + } + }) + ]); + } + ); + + it.each(forbbidenProfilesForDangerousWaste)( + "should forbid recipient without inappropriate profile %o on a SEALED bsdd with non dangerous waste and isDangerous", + async opt => { + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "SEALED", + emitterCompanySiret: company.siret, + wasteDetailsCode: "10 05 09", + wasteDetailsIsDangerous: true + } + }); + + const { mutate } = makeClient(user); + const destination = await companyFactory(opt); + const updateFormInput = { + id: form.id, + recipient: { + company: { siret: destination.siret } + } + }; + const { errors } = await mutate>( + UPDATE_FORM, + { + variables: { updateFormInput } + } + ); + expect(errors).toEqual([ + expect.objectContaining({ + message: + "Les autorisations de l'établissement de destination ne semblent pas correspondre " + + "à la caractérisation du déchet renseigné. Merci de bien vouloir procéder à la mise à " + + "jour du profil de l'établissement ou modifier le type de déchet sans quoi le bordereau ne " + + "pourra être enregistré.", + extensions: { + code: "BAD_USER_INPUT" + } + }) + ]); + } + ); + + it.each(forbbidenProfilesForDangerousWaste)( + "should forbid recipient without inappropriate profile %o on a sealed bsdd with non dangerous waste code and pop", + async opt => { + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "SEALED", + emitterCompanySiret: company.siret, + wasteDetailsCode: "10 05 09", + wasteDetailsPop: true + } + }); + + const { mutate } = makeClient(user); + const destination = await companyFactory(opt); + const updateFormInput = { + id: form.id, + recipient: { + company: { siret: destination.siret } + } + }; + const { errors } = await mutate>( + UPDATE_FORM, + { + variables: { updateFormInput } + } + ); + expect(errors).toEqual([ + expect.objectContaining({ + message: + "Les autorisations de l'établissement de destination ne semblent pas correspondre " + + "à la caractérisation du déchet renseigné. Merci de bien vouloir procéder à la mise à " + + "jour du profil de l'établissement ou modifier le type de déchet sans quoi le bordereau ne " + + "pourra être enregistré.", + extensions: { + code: "BAD_USER_INPUT" + } + }) + ]); + } + ); + + it.each(forbbidenProfilesForNonDangerousWaste)( + "should forbid recipient without inappropriate profile %o on a sealed bsdd with non dangerous waste", + async opt => { + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "SEALED", + emitterCompanySiret: company.siret, + wasteDetailsCode: "10 05 09", + wasteDetailsIsDangerous: false, + wasteDetailsPop: false + } + }); + + const { mutate } = makeClient(user); + const destination = await companyFactory(opt); + const updateFormInput = { + id: form.id, + recipient: { + company: { siret: destination.siret } + } + }; + const { errors } = await mutate>( + UPDATE_FORM, + { + variables: { updateFormInput } + } + ); + expect(errors).toEqual([ + expect.objectContaining({ + message: + "Les autorisations de l'établissement de destination ne semblent pas correspondre " + + "à la caractérisation du déchet renseigné. Merci de bien vouloir procéder à la mise à " + + "jour du profil de l'établissement ou modifier le type de déchet sans quoi le bordereau ne " + + "pourra être enregistré.", + extensions: { + code: "BAD_USER_INPUT" + } + }) + ]); + } + ); + + it.each(forbbidenProfilesForDangerousWaste)( + "should allow recipient with inappropriate profile %o on a sealed bsdd with dangerous waste code on bsdd created before VERIFY_DESTINATION_PROFILES_FOR_BSDD_CREATED_AFTER", + async opt => { + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, opt: { status: "SEALED", - ...(role === "transporter" - ? { - transporters: { - create: { - [`${role}CompanySiret`]: company.siret, - number: 1 - } - } - } - : { - [`${role}CompanySiret`]: company.siret - }), - ...(["trader", "broker"].includes(role) - ? { - [`${role}CompanyName`]: "Trader or Broker", - [`${role}CompanyContact`]: "Mr Trader or Broker", - [`${role}CompanyMail`]: "traderbroker@trackdechets.fr", - [`${role}CompanyAddress`]: "Wall street", - [`${role}CompanyPhone`]: "00 00 00 00 00", - [`${role}Receipt`]: "receipt", - [`${role}Department`]: "07", - [`${role}ValidityLimit`]: new Date("2023-01-01") - } - : {}) + emitterCompanySiret: company.siret, + createdAt: new Date("2024-10-01T00:00:00.000Z") // created before VERIFY_DESTINATION_PROFILES_FOR_BSDD_CREATED_AFTER } }); const { mutate } = makeClient(user); + const destination = await companyFactory(opt); const updateFormInput = { id: form.id, - wasteDetails: { - code: "08 01 11*" + recipient: { + company: { siret: destination.siret } } }; - const { data } = await mutate>(UPDATE_FORM, { - variables: { updateFormInput } + const { errors } = await mutate>( + UPDATE_FORM, + { + variables: { updateFormInput } + } + ); + expect(errors).toBe(undefined); + } + ); + + it.each(forbbidenProfilesForNonDangerousWaste)( + "should allow recipient with inappropriate profile %o on a sealed bsdd with non dangerous waste on bsdd created before VERIFY_DESTINATION_PROFILES_FOR_BSDD_CREATED_AFTER", + async opt => { + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formFactory({ + ownerId: user.id, + opt: { + status: "SEALED", + emitterCompanySiret: company.siret, + wasteDetailsCode: "10 05 09", + wasteDetailsIsDangerous: false, + wasteDetailsPop: false, + createdAt: new Date("2024-10-01T00:00:00.000Z") // created before VERIFY_DESTINATION_PROFILES_FOR_BSDD_CREATED_AFTER + } }); - expect(data.updateForm.wasteDetails).toMatchObject( - updateFormInput.wasteDetails + const { mutate } = makeClient(user); + const destination = await companyFactory(opt); + const updateFormInput = { + id: form.id, + recipient: { + company: { siret: destination.siret } + } + }; + const { errors } = await mutate>( + UPDATE_FORM, + { + variables: { updateFormInput } + } ); + expect(errors).toBe(undefined); } ); it("should allow a destination after temp storage to update a form", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formWithTempStorageFactory({ ownerId: user.id, - opt: { status: "DRAFT" }, + opt: { status: "DRAFT", recipientCompanySiret: destination.siret }, forwardedInOpts: { recipientCompanySiret: company.siret } }); @@ -715,13 +1354,21 @@ describe("Mutation.updateForm", () => { siret: eo.siret! } }); + + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, + opt: { status: "DRAFT", emitterType: "OTHER", ecoOrganismeName: eo.name, - ecoOrganismeSiret: eo.siret + ecoOrganismeSiret: eo.siret, + recipientCompanySiret: destination.siret } }); @@ -805,6 +1452,12 @@ describe("Mutation.updateForm", () => { it("should update the eco-organisme", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); + + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const originalEO = await companyFactory({ companyTypes: { set: ["ECO_ORGANISME"] @@ -823,7 +1476,8 @@ describe("Mutation.updateForm", () => { status: "DRAFT", emitterCompanySiret: company.siret, ecoOrganismeName: originalEO.name, - ecoOrganismeSiret: originalEO.siret + ecoOrganismeSiret: originalEO.siret, + recipientCompanySiret: destination.siret } }); const newEO = await companyFactory({ @@ -872,13 +1526,19 @@ describe("Mutation.updateForm", () => { siret: eo.siret! } }); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, opt: { status: "DRAFT", emitterCompanySiret: company.siret, ecoOrganismeName: eo.name, - ecoOrganismeSiret: eo.siret + ecoOrganismeSiret: eo.siret, + recipientCompanySiret: destination.siret } }); @@ -898,12 +1558,17 @@ describe("Mutation.updateForm", () => { it("should add the first intermediary on an existing draft", async () => { const { user, company } = await userWithCompanyFactory(UserRole.MEMBER); const intermediary = await userWithCompanyFactory(UserRole.MEMBER); - + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, opt: { status: "DRAFT", - emitterCompanySiret: company.siret + emitterCompanySiret: company.siret, + recipientCompanySiret: destination.siret } }); @@ -930,11 +1595,18 @@ describe("Mutation.updateForm", () => { const intermediary = await userWithCompanyFactory(UserRole.MEMBER); const intermediary2 = await userWithCompanyFactory(UserRole.MEMBER); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formFactory({ ownerId: user.id, opt: { status: "DRAFT", emitterCompanySiret: company.siret, + recipientCompanySiret: destination.siret, intermediaries: { create: [toIntermediaryCompany(intermediary.company)] } @@ -994,12 +1666,17 @@ describe("Mutation.updateForm", () => { it("should remove the intermediary when input is an empty array", async () => { const { user, company } = await userWithCompanyFactory(UserRole.MEMBER); const intermediary = await userWithCompanyFactory(UserRole.MEMBER); - + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, opt: { status: "DRAFT", emitterCompanySiret: company.siret, + recipientCompanySiret: destination.siret, intermediaries: { create: [toIntermediaryCompany(intermediary.company)] } @@ -1025,12 +1702,17 @@ describe("Mutation.updateForm", () => { it("should remove the intermediary when input intermediaries is null", async () => { const { user, company } = await userWithCompanyFactory(UserRole.MEMBER); const intermediary = await userWithCompanyFactory(UserRole.MEMBER); - + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, opt: { status: "DRAFT", emitterCompanySiret: company.siret, + recipientCompanySiret: destination.siret, intermediaries: { create: [toIntermediaryCompany(intermediary.company)] } @@ -1056,12 +1738,17 @@ describe("Mutation.updateForm", () => { it("should not update the intermediary when no input", async () => { const { user, company } = await userWithCompanyFactory(UserRole.MEMBER); const intermediary = await userWithCompanyFactory(UserRole.MEMBER); - + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, opt: { status: "DRAFT", emitterCompanySiret: company.siret, + recipientCompanySiret: destination.siret, intermediaries: { create: [toIntermediaryCompany(intermediary.company)] } @@ -1091,11 +1778,17 @@ describe("Mutation.updateForm", () => { it("should update a form as an intermediary", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); const intermediary = await userWithCompanyFactory(UserRole.MEMBER); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, opt: { status: "SEALED", emitterCompanySiret: company.siret, + recipientCompanySiret: destination.siret, intermediaries: { create: [toIntermediaryCompany(intermediary.company)] } @@ -1125,11 +1818,17 @@ describe("Mutation.updateForm", () => { it("should update a form", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, opt: { status: "DRAFT", - emitterCompanySiret: company.siret + emitterCompanySiret: company.siret, + recipientCompanySiret: destination.siret } }); @@ -1150,11 +1849,17 @@ describe("Mutation.updateForm", () => { it("should update a form with a PIPELINE packaging, erasing transporter infos and forcing transporter mode OTHER", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, opt: { status: "DRAFT", - emitterCompanySiret: company.siret + emitterCompanySiret: company.siret, + recipientCompanySiret: destination.siret } }); @@ -1226,11 +1931,17 @@ describe("Mutation.updateForm", () => { it("should add a temporary storage", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, opt: { status: "DRAFT", - emitterCompanySiret: company.siret + emitterCompanySiret: company.siret, + recipientCompanySiret: destination.siret } }); @@ -1259,11 +1970,17 @@ describe("Mutation.updateForm", () => { it("should add a temporary storage even if temporaryStorageDetail is empty ", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, opt: { status: "DRAFT", - emitterCompanySiret: company.siret + emitterCompanySiret: company.siret, + recipientCompanySiret: destination.siret } }); @@ -1291,12 +2008,18 @@ describe("Mutation.updateForm", () => { it("should update the temporary storage", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, opt: { status: "DRAFT", emitterCompanySiret: company.siret, recipientIsTempStorage: true, + recipientCompanySiret: destination.siret, forwardedIn: { create: { readableId: getReadableId(), @@ -1329,11 +2052,17 @@ describe("Mutation.updateForm", () => { it("should remove a temporary storage", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, opt: { status: "DRAFT", emitterCompanySiret: company.siret, + recipientCompanySiret: destination.siret, forwardedIn: { create: { readableId: getReadableId(), @@ -1360,14 +2089,23 @@ describe("Mutation.updateForm", () => { it("should add a recipient", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, opt: { status: "DRAFT", - emitterCompanySiret: company.siret + emitterCompanySiret: company.siret, + recipientCompanySiret: destination.siret } }); - const newRecipientCompany = await companyFactory(); + const newRecipientCompany = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const { mutate } = makeClient(user); const updateFormInput = { @@ -1391,7 +2129,12 @@ describe("Mutation.updateForm", () => { it("should update the recipient", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); - const originalRecipientCompany = await companyFactory(); + // recipient needs appropriate profiles and subprofiles + const originalRecipientCompany = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formFactory({ ownerId: user.id, opt: { @@ -1400,8 +2143,11 @@ describe("Mutation.updateForm", () => { recipientCompanySiret: originalRecipientCompany.siret } }); - const newRecipientCompany = await companyFactory(); + const newRecipientCompany = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const updateFormInput = { id: form.id, recipient: { @@ -1513,6 +2259,11 @@ describe("Mutation.updateForm", () => { quantityGrouped: 0 } }); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, @@ -1520,6 +2271,8 @@ describe("Mutation.updateForm", () => { emitterType: EmitterType.APPENDIX2, status: "SEALED", emitterCompanySiret: ttr.siret, + recipientCompanySiret: destination.siret, + grouping: { create: { initialFormId: appendixForm.id, @@ -1575,6 +2328,11 @@ describe("Mutation.updateForm", () => { quantityReceived: 1 } }); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, @@ -1582,6 +2340,8 @@ describe("Mutation.updateForm", () => { status: "SEALED", emitterCompanySiret: ttr.siret, emitterType: EmitterType.APPENDIX2, + recipientCompanySiret: destination.siret, + grouping: { create: { initialFormId: appendixForm.id, @@ -1620,6 +2380,11 @@ describe("Mutation.updateForm", () => { quantityReceived: 1 } }); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: ttrUser.id, @@ -1627,6 +2392,8 @@ describe("Mutation.updateForm", () => { status: "SEALED", emitterCompanySiret: ttr.siret, emitterType: EmitterType.APPENDIX2, + recipientCompanySiret: destination.siret, + grouping: { create: { initialFormId: appendixForm.id, @@ -1676,6 +2443,11 @@ describe("Mutation.updateForm", () => { quantityReceived: 1 } }); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, @@ -1683,6 +2455,8 @@ describe("Mutation.updateForm", () => { status: Status.SEALED, emitterCompanySiret: ttr.siret, emitterType: EmitterType.APPENDIX2, + recipientCompanySiret: destination.siret, + grouping: { create: { initialFormId: initialAppendix2.id, @@ -1729,6 +2503,11 @@ describe("Mutation.updateForm", () => { quantityReceived: 1 } }); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, @@ -1736,6 +2515,8 @@ describe("Mutation.updateForm", () => { status: Status.SEALED, emitterCompanySiret: ttr.siret, emitterType: EmitterType.APPENDIX2, + recipientCompanySiret: destination.siret, + grouping: { create: { initialFormId: initialAppendix2.id, @@ -1785,6 +2566,11 @@ describe("Mutation.updateForm", () => { quantityReceived: 1 } }); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, @@ -1792,6 +2578,8 @@ describe("Mutation.updateForm", () => { status: "DRAFT", emitterCompanySiret: ttr.siret, emitterType: EmitterType.APPENDIX2, + recipientCompanySiret: destination.siret, + grouping: { create: { initialFormId: appendixForm.id, @@ -1836,13 +2624,19 @@ describe("Mutation.updateForm", () => { recipientCompanySiret: producer.siret } }); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, opt: { status: "DRAFT", emitterCompanySiret: producer.siret, - emitterType: EmitterType.PRODUCER + emitterType: EmitterType.PRODUCER, + recipientCompanySiret: destination.siret } }); @@ -1884,12 +2678,19 @@ describe("Mutation.updateForm", () => { } }); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formFactory({ ownerId: user.id, opt: { status: "DRAFT", emitterCompanySiret: producer.siret, - emitterType: EmitterType.PRODUCER + emitterType: EmitterType.PRODUCER, + recipientCompanySiret: destination.siret } }); @@ -1930,6 +2731,11 @@ describe("Mutation.updateForm", () => { quantityReceived: 1 } }); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, @@ -1937,6 +2743,8 @@ describe("Mutation.updateForm", () => { status: "DRAFT", emitterCompanySiret: ttr.siret, emitterType: EmitterType.APPENDIX2, + recipientCompanySiret: destination.siret, + grouping: { create: { initialFormId: appendixForm.id, @@ -1974,6 +2782,11 @@ describe("Mutation.updateForm", () => { quantityReceived: 1 } }); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, @@ -1981,6 +2794,8 @@ describe("Mutation.updateForm", () => { status: "DRAFT", emitterCompanySiret: ttr.siret, emitterType: EmitterType.APPENDIX2, + recipientCompanySiret: destination.siret, + grouping: { create: { initialFormId: appendixForm.id, @@ -2019,13 +2834,19 @@ describe("Mutation.updateForm", () => { quantityGrouped: 1 } }); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, opt: { status: "SEALED", emitterCompanySiret: ttr.siret, - emitterType: EmitterType.APPENDIX2 + emitterType: EmitterType.APPENDIX2, + recipientCompanySiret: destination.siret } }); @@ -2076,13 +2897,19 @@ describe("Mutation.updateForm", () => { quantityReceived: 1 } }); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const groupingForm1 = await formFactory({ ownerId: user.id, opt: { status: "SEALED", emitterCompanySiret: ttr.siret, - emitterType: EmitterType.APPENDIX2 + emitterType: EmitterType.APPENDIX2, + recipientCompanySiret: destination.siret } }); @@ -2091,7 +2918,8 @@ describe("Mutation.updateForm", () => { opt: { status: "SEALED", emitterCompanySiret: ttr.siret, - emitterType: EmitterType.APPENDIX2 + emitterType: EmitterType.APPENDIX2, + recipientCompanySiret: destination.siret } }); @@ -2159,6 +2987,8 @@ describe("Mutation.updateForm", () => { }); it("should default to quantity left when no quantity is specified in grouping", async () => { + // recipient needs appropriate profiles and subprofiles + const { user, company: ttr } = await userWithCompanyFactory("MEMBER"); const appendix2Form = await formFactory({ @@ -2183,13 +3013,19 @@ describe("Mutation.updateForm", () => { } } }); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const groupingForm = await formFactory({ ownerId: user.id, opt: { status: "SEALED", emitterCompanySiret: ttr.siret, - emitterType: EmitterType.APPENDIX2 + emitterType: EmitterType.APPENDIX2, + recipientCompanySiret: destination.siret } }); @@ -2243,13 +3079,20 @@ describe("Mutation.updateForm", () => { it("should be possible to set isDangerous=true with a waste code without *", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formFactory({ ownerId: user.id, opt: { status: "DRAFT", emitterCompanySiret: company.siret, wasteDetailsCode: "20 03 01", - wasteDetailsIsDangerous: false + wasteDetailsIsDangerous: false, + recipientCompanySiret: destination.siret } }); @@ -2268,6 +3111,11 @@ describe("Mutation.updateForm", () => { it("should perform update in transaction", async () => { const { user, company: ttr } = await userWithCompanyFactory("MEMBER"); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, @@ -2275,7 +3123,8 @@ describe("Mutation.updateForm", () => { status: "SEALED", emitterCompanySiret: ttr.siret, emitterType: EmitterType.APPENDIX2, - wasteDetailsCode: "01 03 04*" + wasteDetailsCode: "01 03 04*", + recipientCompanySiret: destination.siret } }); @@ -2311,10 +3160,19 @@ describe("Mutation.updateForm", () => { }); it("should update denormalized fields", async () => { - const { user, company } = await userWithCompanyFactory("MEMBER"); + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const transporterCompany = await companyFactory({ companyTypes: ["TRANSPORTER"] }); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + await transporterReceiptFactory({ company: transporterCompany }); const intermediaryCompany = await companyFactory(); @@ -2326,7 +3184,8 @@ describe("Mutation.updateForm", () => { status: "SEALED", emitterCompanySiret: company.siret, emitterType: EmitterType.APPENDIX2, - wasteDetailsCode: "01 03 04*" + wasteDetailsCode: "01 03 04*", + recipientCompanySiret: destination.siret } }); @@ -2357,6 +3216,12 @@ describe("Mutation.updateForm", () => { it("should not be possible to update a weight > 40 T when transport mode is ROAD", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const { mutate } = makeClient(user); const form = await formFactory({ ownerId: user.id, @@ -2365,6 +3230,7 @@ describe("Mutation.updateForm", () => { emitterCompanySiret: company.siret, emitterType: EmitterType.APPENDIX2, wasteDetailsCode: "01 03 04*", + recipientCompanySiret: destination.siret, transporters: { create: { transporterTransportMode: "ROAD", @@ -2394,6 +3260,12 @@ describe("Mutation.updateForm", () => { it("should be possible to update a weight > 40 T when transport mode is not ROAD", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const { mutate } = makeClient(user); const form = await formFactory({ ownerId: user.id, @@ -2403,6 +3275,7 @@ describe("Mutation.updateForm", () => { emitterType: EmitterType.APPENDIX2, wasteDetailsCode: "01 03 04*", wasteDetailsQuantity: 10, + recipientCompanySiret: destination.siret, transporters: { create: { transporterTransportMode: "ROAD", @@ -2438,6 +3311,12 @@ describe("Mutation.updateForm", () => { it("should be possible to update a weight > 40 T when deleting first transporter by road", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); const { mutate } = makeClient(user); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const form = await formFactory({ ownerId: user.id, opt: { @@ -2446,6 +3325,7 @@ describe("Mutation.updateForm", () => { emitterType: EmitterType.APPENDIX2, wasteDetailsCode: "01 03 04*", wasteDetailsQuantity: 10, + recipientCompanySiret: destination.siret, transporters: { create: { transporterTransportMode: "ROAD", number: 1 } } @@ -2485,6 +3365,12 @@ describe("Mutation.updateForm", () => { it("should clean appendix1 items on update", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); const { company: producerCompany } = await userWithCompanyFactory("MEMBER"); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const { mutate } = makeClient(user); const appendix1_1 = await prisma.form.create({ @@ -2526,6 +3412,7 @@ describe("Mutation.updateForm", () => { wasteDetailsCode: "16 06 01*", emitterCompanySiret: company.siret, emitterType: EmitterType.APPENDIX1, + recipientCompanySiret: destination.siret, grouping: { create: { initialFormId: appendix1_1.id, quantity: 0 } } } }); @@ -2555,6 +3442,12 @@ describe("Mutation.updateForm", () => { it("should append appendix1 item on update", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); const { company: producerCompany } = await userWithCompanyFactory("MEMBER"); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + const { mutate } = makeClient(user); const appendix1_1 = await prisma.form.create({ @@ -2568,6 +3461,7 @@ describe("Mutation.updateForm", () => { emitterCompanyContact: "Contact", emitterCompanyPhone: "01 01 01 01 01", emitterCompanyMail: "annexe1@test.com", + recipientCompanySiret: destination.siret, wasteDetailsCode: "16 06 01*", owner: { connect: { id: user.id } } } @@ -2596,6 +3490,8 @@ describe("Mutation.updateForm", () => { wasteDetailsCode: "16 06 01*", emitterCompanySiret: company.siret, emitterType: EmitterType.APPENDIX1, + recipientCompanySiret: destination.siret, + grouping: { create: { initialFormId: appendix1_1.id, quantity: 0 } } } }); @@ -2646,6 +3542,11 @@ describe("Mutation.updateForm", () => { }); // Group with appendix1_1 + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, opt: { @@ -2653,6 +3554,8 @@ describe("Mutation.updateForm", () => { wasteDetailsCode: "16 06 01*", emitterCompanySiret: company.siret, emitterType: EmitterType.APPENDIX1, + recipientCompanySiret: destination.siret, + grouping: { create: { initialFormId: appendix1_1.id, quantity: 0 } } } }); @@ -2714,6 +3617,11 @@ describe("Mutation.updateForm", () => { } }); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); // Group with appendix1_1 const form = await formFactory({ ownerId: user.id, @@ -2721,7 +3629,8 @@ describe("Mutation.updateForm", () => { status: Status.SEALED, wasteDetailsCode: "16 06 01*", emitterCompanySiret: company.siret, - emitterType: EmitterType.APPENDIX1 + emitterType: EmitterType.APPENDIX1, + recipientCompanySiret: destination.siret } }); @@ -2781,6 +3690,12 @@ describe("Mutation.updateForm", () => { } }); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); + // Group with appendix1_1 const form = await formFactory({ ownerId: user.id, @@ -2790,7 +3705,8 @@ describe("Mutation.updateForm", () => { emitterCompanySiret: company.siret, emitterType: EmitterType.APPENDIX1, ecoOrganismeName: ecoOrganisme.company.name, - ecoOrganismeSiret: ecoOrganisme.company.siret + ecoOrganismeSiret: ecoOrganisme.company.siret, + recipientCompanySiret: destination.siret } }); @@ -2816,6 +3732,11 @@ describe("Mutation.updateForm", () => { async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); const { mutate } = makeClient(user); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, opt: { @@ -2823,6 +3744,8 @@ describe("Mutation.updateForm", () => { status: "SEALED", emitterCompanySiret: company.siret, emitterType: EmitterType.APPENDIX2, + recipientCompanySiret: destination.siret, + wasteDetailsCode: "01 03 04*", wasteDetailsQuantity: 50, transporters: { @@ -2872,6 +3795,11 @@ describe("Mutation.updateForm", () => { } }); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); // Group with appendix1_1 const form = await formFactory({ ownerId: user.id, @@ -2880,6 +3808,8 @@ describe("Mutation.updateForm", () => { wasteDetailsCode: "16 06 01*", emitterCompanySiret: company.siret, emitterType: EmitterType.APPENDIX1, + recipientCompanySiret: destination.siret, + grouping: { create: { initialFormId: appendix1_1.id, quantity: 0 } } } }); @@ -2926,7 +3856,11 @@ describe("Mutation.updateForm", () => { const { user, company } = await userWithCompanyFactory("MEMBER"); const { company: producerCompany } = await userWithCompanyFactory("MEMBER"); const { mutate } = makeClient(user); - + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); // Group with appendix1_1 const form = await formFactory({ ownerId: user.id, @@ -2934,7 +3868,8 @@ describe("Mutation.updateForm", () => { status: Status.DRAFT, wasteDetailsCode: "16 06 01*", emitterCompanySiret: company.siret, - emitterType: EmitterType.APPENDIX1 + emitterType: EmitterType.APPENDIX1, + recipientCompanySiret: destination.siret } }); @@ -2996,6 +3931,11 @@ describe("Mutation.updateForm", () => { } }); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); // Group with appendix1_1 const form = await formFactory({ ownerId: user.id, @@ -3004,6 +3944,8 @@ describe("Mutation.updateForm", () => { wasteDetailsCode: "16 06 01*", emitterCompanySiret: company.siret, emitterType: EmitterType.APPENDIX1, + recipientCompanySiret: destination.siret, + grouping: { create: { initialFormId: appendix1_1.id, quantity: 0 } } } }); @@ -3046,10 +3988,14 @@ describe("Mutation.updateForm", () => { it.each([Status.DRAFT, Status.SEALED, Status.SIGNED_BY_PRODUCER])( "should be possible to update transporter when status is %p", async status => { - const { user, company } = await userWithCompanyFactory("MEMBER"); + const { user, company } = await userWithCompanyFactory("MEMBER", { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const transporter = await companyFactory({ companyTypes: ["TRANSPORTER"] }); + const form = await formFactory({ ownerId: user.id, opt: { @@ -3093,6 +4039,11 @@ describe("Mutation.updateForm", () => { await prisma.transporterReceipt.findUniqueOrThrow({ where: { id: transporter.company.transporterReceiptId! } }); + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: emitter.user.id, opt: { @@ -3103,6 +4054,8 @@ describe("Mutation.updateForm", () => { emitterCompanyContact: emitter.company.contact, emitterCompanyPhone: emitter.company.contactPhone, emitterCompanyMail: emitter.company.contactEmail, + recipientCompanySiret: destination.siret, + transporters: { create: { transporterCompanySiret: transporter.company.siret, @@ -3145,12 +4098,17 @@ describe("Mutation.updateForm", () => { const transporter3 = await userWithCompanyFactory("MEMBER"); const transporter4 = await userWithCompanyFactory("MEMBER"); const transporter5 = await userWithCompanyFactory("MEMBER"); - + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: emitter.user.id, opt: { status: Status.DRAFT, - emitterCompanySiret: emitter.company.siret + emitterCompanySiret: emitter.company.siret, + recipientCompanySiret: destination.siret } }); @@ -3260,12 +4218,17 @@ describe("Mutation.updateForm", () => { const emitter = await userWithCompanyFactory("ADMIN"); const transporter1 = await userWithCompanyFactory("MEMBER"); const transporter2 = await userWithCompanyFactory("MEMBER"); - + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: emitter.user.id, opt: { status: Status.DRAFT, - emitterCompanySiret: emitter.company.siret + emitterCompanySiret: emitter.company.siret, + recipientCompanySiret: destination.siret } }); @@ -3326,12 +4289,17 @@ describe("Mutation.updateForm", () => { const emitter = await userWithCompanyFactory("ADMIN"); const transporter1 = await userWithCompanyFactory("MEMBER"); const transporter2 = await userWithCompanyFactory("MEMBER"); - + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: emitter.user.id, opt: { status: Status.DRAFT, - emitterCompanySiret: emitter.company.siret + emitterCompanySiret: emitter.company.siret, + recipientCompanySiret: destination.siret } }); @@ -3409,12 +4377,17 @@ describe("Mutation.updateForm", () => { const emitter = await userWithCompanyFactory("ADMIN"); const transporter1 = await userWithCompanyFactory("MEMBER"); const transporter2 = await userWithCompanyFactory("MEMBER"); - + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: emitter.user.id, opt: { status: Status.DRAFT, - emitterCompanySiret: emitter.company.siret + emitterCompanySiret: emitter.company.siret, + recipientCompanySiret: destination.siret } }); @@ -3472,12 +4445,17 @@ describe("Mutation.updateForm", () => { const transporter1 = await userWithCompanyFactory("MEMBER"); const transporter2 = await userWithCompanyFactory("MEMBER"); const transporter3 = await userWithCompanyFactory("MEMBER"); - + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: emitter.user.id, opt: { status: Status.DRAFT, - emitterCompanySiret: emitter.company.siret + emitterCompanySiret: emitter.company.siret, + recipientCompanySiret: destination.siret } }); @@ -3540,7 +4518,11 @@ describe("Mutation.updateForm", () => { const emitter = await userWithCompanyFactory("ADMIN"); const transporter1 = await userWithCompanyFactory("MEMBER"); const transporter2 = await userWithCompanyFactory("MEMBER"); - + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); // Create a form that has already been received const form = await formFactory({ ownerId: emitter.user.id, @@ -3550,6 +4532,8 @@ describe("Mutation.updateForm", () => { takenOverAt: new Date(), receivedAt: new Date(), emitterCompanySiret: emitter.company.siret, + recipientCompanySiret: destination.siret, + transporters: { create: { transporterCompanySiret: transporter1.company.siret, @@ -3594,7 +4578,11 @@ describe("Mutation.updateForm", () => { const emitter = await userWithCompanyFactory("ADMIN"); const transporter1 = await userWithCompanyFactory("MEMBER"); const transporter2 = await userWithCompanyFactory("MEMBER"); - + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); // Create a form that has already been sent const form = await formFactory({ ownerId: emitter.user.id, @@ -3603,6 +4591,8 @@ describe("Mutation.updateForm", () => { emittedAt: new Date(), takenOverAt: new Date(), emitterCompanySiret: emitter.company.siret, + recipientCompanySiret: destination.siret, + transporters: { create: { transporterCompanySiret: transporter1.company.siret, @@ -3648,7 +4638,11 @@ describe("Mutation.updateForm", () => { const transporter1 = await userWithCompanyFactory("MEMBER"); const transporter2 = await userWithCompanyFactory("MEMBER"); const transporter3 = await userWithCompanyFactory("MEMBER"); - + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); // Create a form that has already been signed by the first transporter const form = await formFactory({ ownerId: emitter.user.id, @@ -3657,6 +4651,8 @@ describe("Mutation.updateForm", () => { emittedAt: new Date(), takenOverAt: new Date(), emitterCompanySiret: emitter.company.siret, + recipientCompanySiret: destination.siret, + transporters: { create: { transporterCompanySiret: transporter1.company.siret, @@ -3709,7 +4705,11 @@ describe("Mutation.updateForm", () => { it("should not be possible to update `transporter` (first transporter) when the form has been sent", async () => { const emitter = await userWithCompanyFactory("ADMIN"); const transporter = await userWithCompanyFactory("MEMBER"); - + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); // Create a form that has already been sent const form = await formFactory({ ownerId: emitter.user.id, @@ -3718,6 +4718,8 @@ describe("Mutation.updateForm", () => { emittedAt: new Date(), takenOverAt: new Date(), emitterCompanySiret: emitter.company.siret, + recipientCompanySiret: destination.siret, + transporters: { create: { transporterCompanySiret: transporter.company.siret, @@ -3752,7 +4754,11 @@ describe("Mutation.updateForm", () => { const emitter = await userWithCompanyFactory("ADMIN"); const transporter1 = await userWithCompanyFactory("MEMBER"); const transporter2 = await userWithCompanyFactory("MEMBER"); - + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); // Create a form that has already been received const form = await formFactory({ ownerId: emitter.user.id, @@ -3761,6 +4767,8 @@ describe("Mutation.updateForm", () => { emittedAt: new Date(), takenOverAt: new Date(), emitterCompanySiret: emitter.company.siret, + recipientCompanySiret: destination.siret, + transporters: { create: { transporterCompanySiret: transporter1.company.siret, @@ -3864,13 +4872,19 @@ describe("Mutation.updateForm", () => { name: "Nom intermédiaire 2", siret: siretify() }); - + // recipient needs appropriate profiles and subprofiles + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: emitter.user.id, opt: { status: Status.SENT, takenOverAt: new Date(), emitterCompanySiret: emitter.company.siret, + recipientCompanySiret: destination.siret, + transporters: { create: { transporterCompanySiret: transporter1.company.siret, @@ -3940,11 +4954,16 @@ describe("Mutation.updateForm", () => { it("should log in an event the updated data", async () => { const { company, user } = await userWithCompanyFactory(UserRole.ADMIN); + const destination = await companyFactory({ + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + }); const form = await formFactory({ ownerId: user.id, opt: { status: "SEALED", - emitterCompanySiret: company.siret + emitterCompanySiret: company.siret, + recipientCompanySiret: destination.siret } }); diff --git a/back/src/forms/resolvers/mutations/duplicateForm.ts b/back/src/forms/resolvers/mutations/duplicateForm.ts index df08e1384f..caa5a1d428 100644 --- a/back/src/forms/resolvers/mutations/duplicateForm.ts +++ b/back/src/forms/resolvers/mutations/duplicateForm.ts @@ -297,6 +297,10 @@ const duplicateFormResolver: MutationResolvers["duplicateForm"] = async ( const sirenified = await sirenifyFormCreateInput(newFormInput, []); + // We do not check destination company profiles here, hence duplicating a bsdd created before rules enforcement + // will produce a bsdd whose destination does not match current subprofile requirements. + // The markAsSealed mutation will raise an error and the rule will be enforced then. + const newForm = await formRepository.create(sirenified, { duplicate: { id: existingForm.id } }); diff --git a/back/src/forms/resolvers/queries/__tests__/appendixforms.integration.ts b/back/src/forms/resolvers/queries/__tests__/appendixforms.integration.ts index 4f168bc79f..5d8b199997 100644 --- a/back/src/forms/resolvers/queries/__tests__/appendixforms.integration.ts +++ b/back/src/forms/resolvers/queries/__tests__/appendixforms.integration.ts @@ -11,7 +11,7 @@ import { gql } from "graphql-tag"; import { prisma } from "@td/prisma"; import { updateAppendix2Fn } from "../../../updateAppendix2"; import { AuthType } from "../../../../auth"; - +import { CompanyType, WasteProcessorType } from "@prisma/client"; const APPENDIX_FORMS = gql` query AppendixForm($siret: String!) { appendixForms(siret: $siret) { @@ -33,7 +33,11 @@ describe("Test appendixForms", () => { const { user: emitter, company: emitterCompany } = await userWithCompanyFactory("ADMIN"); const { user: ttr, company: ttrCompany } = await userWithCompanyFactory( - "ADMIN" + "ADMIN", + { + companyTypes: [CompanyType.WASTEPROCESSOR], + wasteProcessorTypes: [WasteProcessorType.DANGEROUS_WASTES_INCINERATION] + } ); const { company: destinationCompany } = await userWithCompanyFactory( "ADMIN" diff --git a/back/src/forms/typeDefs/bsdd.inputs.graphql b/back/src/forms/typeDefs/bsdd.inputs.graphql index 31672aaee8..16de1791b4 100644 --- a/back/src/forms/typeDefs/bsdd.inputs.graphql +++ b/back/src/forms/typeDefs/bsdd.inputs.graphql @@ -511,7 +511,17 @@ input RecipientInput { "Opération d'élimination / valorisation prévue (code D/R)" processingOperation: String - "Établissement de destination" + """ + Établissement de destination + + Des restrictions reltives aux profils et sous-profils de l'établissment s'appliquent en fonction du caractère de dangerosité du déchet concerné. + + Sous-profils requis pour déchet dangereux (code déchet avec * ou marqué comme dangereux (isDanegrous) ou présence de pop) : + collectorTypes : DANGEROUS_WASTES, DEEE_WASTES, OTHER_DANGEROUS_WASTES, wasteProcessorTypes: DANGEROUS_WASTES_INCINERATION, DANGEROUS_WASTES_STORAGE, NON_DANGEROUS_WASTES_STORAGE, OTHER_DANGEROUS_WASTES + + Sous-profils requis pour déchet non dangereux : + collectorTypes : NON_DANGEROUS_WASTES, DEEE_WASTES, OTHER_NON_DANGEROUS_WASTES, wasteProcessorTypes : DANGEROUS_WASTES_INCINERATION, NON_DANGEROUS_WASTES_INCINERATION, CREMATION, NON_DANGEROUS_WASTES_STORAGE, INERT_WASTES_STORAGE, OTHER_NON_DANGEROUS_WASTES + """ company: CompanyInput "Si c'est un entreprosage provisoire ou reconditionnement" diff --git a/back/src/forms/validation.ts b/back/src/forms/validation.ts index 5ddd28f27b..230c04f822 100644 --- a/back/src/forms/validation.ts +++ b/back/src/forms/validation.ts @@ -43,6 +43,7 @@ import { weightConditions, WeightUnits } from "../common/validation"; + import configureYup, { FactorySchemaOf } from "../common/yup/configureYup"; import { CiterneNotWashedOutReason, @@ -620,6 +621,7 @@ const recipientSchemaFn: FactorySchemaOf = ({ .label("Destinataire") .test(siretTests.isRegistered("DESTINATION")) .test(siretTests.isNotDormant) + .test(siretTests.destinationHasAppropriateSubProfiles) .requiredIf(!isDraft, `Destinataire: ${MISSING_COMPANY_SIRET}`), recipientCompanyAddress: yup .string() diff --git a/libs/back/env/src/index.ts b/libs/back/env/src/index.ts index ad78c5c393..fd05674f4e 100644 --- a/libs/back/env/src/index.ts +++ b/libs/back/env/src/index.ts @@ -150,7 +150,12 @@ export const schema = z.object({ GERICO_API_URL: z.string().optional(), GERICO_API_KEY: z.string().optional(), GERICO_WEBHOOK_SLUG: z.string(), - GERICO_WEBHOOK_TOKEN: z.string() + GERICO_WEBHOOK_TOKEN: z.string(), + + VERIFY_DESTINATION_PROFILES_FOR_BSDD_CREATED_AFTER: z + .string() + .datetime() + .optional() }); export const envVariables = schema.superRefine((val, ctx) => { From 2f2afc5e870d34c46b276b90581c6ab651202879 Mon Sep 17 00:00:00 2001 From: Laurent Paoletti Date: Tue, 29 Oct 2024 14:44:19 +0100 Subject: [PATCH 27/74] Add customid on bsvhu --- Changelog.md | 4 + .../resolvers/mutations/utils/clone.utils.ts | 1 + .../__tests__/bsds.bsvhu.integration.ts | 35 +++++++ .../bsvhu/__tests__/elastic.integration.ts | 18 ++++ back/src/bsvhu/converter.ts | 5 +- back/src/bsvhu/elastic.ts | 2 +- back/src/bsvhu/pdf/components/BsvhuPdf.tsx | 3 +- back/src/bsvhu/registry.ts | 2 +- .../__tests__/createBsvhu.integration.ts | 59 ++++++++++++ .../__tests__/createDraftBsvhu.integration.ts | 33 +++++++ .../__tests__/duplicateBsvhu.integration.ts | 1 + .../__tests__/updateBsvhu.integration.ts | 27 ++++++ .../queries/__tests__/bsvhu.integration.ts | 58 +++++++++++- .../queries/__tests__/bsvhus.integration.ts | 94 +++++++++++++++++++ back/src/bsvhu/resolvers/queries/bsvhus.ts | 1 - back/src/bsvhu/typeDefs/bsvhu.inputs.graphql | 8 +- back/src/bsvhu/typeDefs/bsvhu.objects.graphql | 5 + back/src/bsvhu/validation/rules.ts | 4 + back/src/bsvhu/validation/schema.ts | 1 + back/src/bsvhu/where.ts | 1 + .../Apps/Dashboard/Creation/bsvhu/schema.ts | 1 + .../Dashboard/Creation/bsvhu/steps/Waste.tsx | 8 +- .../Creation/bsvhu/utils/initial-state.ts | 1 + front/src/Apps/Dashboard/bsdMapper.ts | 1 + .../Apps/common/queries/fragments/bsvhu.ts | 3 + .../detail/bsvhu/BsvhuDetailContent.tsx | 4 + .../migration.sql | 5 + libs/back/prisma/src/schema.prisma | 2 + 28 files changed, 379 insertions(+), 8 deletions(-) create mode 100644 libs/back/prisma/src/migrations/20241028144237_bsvhu_custom_id/migration.sql diff --git a/Changelog.md b/Changelog.md index c8a4e0fdb4..ec3f38bc13 100644 --- a/Changelog.md +++ b/Changelog.md @@ -7,6 +7,10 @@ et le projet suit un schéma de versionning inspiré de [Calendar Versioning](ht [2024.11.1] 19/11/2024 +#### :rocket: Nouvelles fonctionnalités + +- Permettre l'ajout d'un numéro libre sur le Bsvhu [PR 3718](https://github.com/MTES-MCT/trackdechets/pull/3718) + #### :boom: Breaking changes - Le champ "Numéro de notification" est obligatoire lorsque la destination ultérieure renseignée est étrangère [PR 3719](https://github.com/MTES-MCT/trackdechets/pull/3719) diff --git a/back/src/bsds/resolvers/mutations/utils/clone.utils.ts b/back/src/bsds/resolvers/mutations/utils/clone.utils.ts index 159e5fb89b..d77a9c5e34 100644 --- a/back/src/bsds/resolvers/mutations/utils/clone.utils.ts +++ b/back/src/bsds/resolvers/mutations/utils/clone.utils.ts @@ -545,6 +545,7 @@ export const cloneBsvhu = async (user: Express.User, id: string) => { > = { id: getReadableId(ReadableIdPrefix.VHU), createdAt: bsvhu.createdAt, + customId: null, destinationAgrementNumber: bsvhu.destinationAgrementNumber, destinationCompanyAddress: bsvhu.destinationCompanyAddress, destinationCompanyContact: bsvhu.destinationCompanyContact, diff --git a/back/src/bsds/resolvers/queries/__tests__/bsds.bsvhu.integration.ts b/back/src/bsds/resolvers/queries/__tests__/bsds.bsvhu.integration.ts index ce4bbfb842..0937d22b4c 100644 --- a/back/src/bsds/resolvers/queries/__tests__/bsds.bsvhu.integration.ts +++ b/back/src/bsds/resolvers/queries/__tests__/bsds.bsvhu.integration.ts @@ -114,6 +114,7 @@ describe("Query.bsds.vhus base workflow", () => { >(CREATE_DRAFT_VHU, { variables: { input: { + customId: "theCustomId", emitter: { company: { siret: emitter.company.siret, @@ -203,6 +204,40 @@ describe("Query.bsds.vhus base workflow", () => { expect.objectContaining({ node: { id: vhuId } }) ]); }); + + it("draft vhu should be found with custom id", async () => { + const { query } = makeClient(emitter.user); + const { data: data1 } = await query, QueryBsdsArgs>( + GET_BSDS, + { + variables: { + where: { + customId: { _contains: "nope" }, + isDraftFor: [emitter.company.siret!] + } + } + } + ); + + expect(data1.bsds.edges.length).toEqual(0); + + const { data: data2 } = await query, QueryBsdsArgs>( + GET_BSDS, + { + variables: { + where: { + customId: { _contains: "theCustomId" }, + isDraftFor: [emitter.company.siret!] + } + } + } + ); + + expect(data2.bsds.edges).toEqual([ + expect.objectContaining({ node: { id: vhuId } }) + ]); + }); + it("draft vhu should not be isDraftFor transporter", async () => { const { query } = makeClient(transporter.user); const { data } = await query, QueryBsdsArgs>( diff --git a/back/src/bsvhu/__tests__/elastic.integration.ts b/back/src/bsvhu/__tests__/elastic.integration.ts index 2779c57332..4320a553d1 100644 --- a/back/src/bsvhu/__tests__/elastic.integration.ts +++ b/back/src/bsvhu/__tests__/elastic.integration.ts @@ -52,6 +52,7 @@ describe("toBsdElastic > companies Names & OrgIds", () => { trader = await companyFactory({ name: "Trader" }); bsvhu = await bsvhuFactory({ opt: { + customId: "my custom id", emitterCompanyName: emitter.name, emitterCompanySiret: emitter.siret, transporterCompanyName: transporter.name, @@ -80,6 +81,11 @@ describe("toBsdElastic > companies Names & OrgIds", () => { elasticBsvhu = toBsdElastic(bsvhu); }); + test("customId should be indexed", async () => { + // Then + expect(elasticBsvhu.customId).toContain("my custom id"); + }); + test("companyNames > should contain the names of ALL BSVHU companies", async () => { // Then expect(elasticBsvhu.companyNames).toContain(emitter.name); @@ -104,6 +110,18 @@ describe("toBsdElastic > companies Names & OrgIds", () => { expect(elasticBsvhu.companyOrgIds).toContain(trader.siret); }); + test("companyOrgIds > should contain the orgIds of ALL BSVHU companies", async () => { + // Then + expect(elasticBsvhu.companyOrgIds).toContain(emitter.siret); + expect(elasticBsvhu.companyOrgIds).toContain(transporter.vatNumber); + expect(elasticBsvhu.companyOrgIds).toContain(destination.siret); + expect(elasticBsvhu.companyOrgIds).toContain(intermediary1.siret); + expect(elasticBsvhu.companyOrgIds).toContain(intermediary2.siret); + expect(elasticBsvhu.companyOrgIds).toContain(ecoOrganisme.siret); + expect(elasticBsvhu.companyOrgIds).toContain(broker.siret); + expect(elasticBsvhu.companyOrgIds).toContain(trader.siret); + }); + describe("isReturnFor", () => { it.each([ WasteAcceptationStatus.REFUSED, diff --git a/back/src/bsvhu/converter.ts b/back/src/bsvhu/converter.ts index 9cdf54c67a..e5f635d24c 100644 --- a/back/src/bsvhu/converter.ts +++ b/back/src/bsvhu/converter.ts @@ -54,6 +54,7 @@ export const getAddress = ({ export function expandVhuFormFromDb(form: PrismaVhuForm): GraphqlVhuForm { return { id: form.id, + customId: form.customId, createdAt: processDate(form.createdAt), updatedAt: processDate(form.updatedAt), isDraft: form.isDraft, @@ -212,9 +213,11 @@ export function flattenVhuInput(formInput: BsvhuInput) { packaging: chain(formInput, f => f.packaging), wasteCode: chain(formInput, f => f.wasteCode), quantity: chain(formInput, f => f.quantity), + ...flattenVhuIdentificationInput(formInput), ...flattenVhuWeightInput(formInput), - intermediaries: formInput.intermediaries + intermediaries: formInput.intermediaries, + customId: chain(formInput, f => f.customId) }); } diff --git a/back/src/bsvhu/elastic.ts b/back/src/bsvhu/elastic.ts index 5776ef6793..d522a15ce2 100644 --- a/back/src/bsvhu/elastic.ts +++ b/back/src/bsvhu/elastic.ts @@ -184,7 +184,7 @@ export function toBsdElastic(bsvhu: BsvhuForElastic): BsdElastic { updatedAt: bsvhu.updatedAt?.getTime(), id: bsvhu.id, readableId: bsvhu.id, - customId: "", + customId: bsvhu.customId ?? "", status: bsvhu.status, wasteCode: bsvhu.wasteCode ?? "", wasteAdr: "", diff --git a/back/src/bsvhu/pdf/components/BsvhuPdf.tsx b/back/src/bsvhu/pdf/components/BsvhuPdf.tsx index c300141f07..aa32b8f619 100644 --- a/back/src/bsvhu/pdf/components/BsvhuPdf.tsx +++ b/back/src/bsvhu/pdf/components/BsvhuPdf.tsx @@ -63,7 +63,8 @@ export function BsvhuPdf({ bsvhu, qrCode, renderEmpty }: Props) {

    - N° Bordereau : {bsvhu.id} + N° Bordereau : {bsvhu.id}{" "} + {bsvhu?.customId ? ({bsvhu.customId}) : ""}

    diff --git a/back/src/bsvhu/registry.ts b/back/src/bsvhu/registry.ts index 861a775c78..6b0c04f649 100644 --- a/back/src/bsvhu/registry.ts +++ b/back/src/bsvhu/registry.ts @@ -189,7 +189,7 @@ export function toGenericWaste(bsvhu: RegistryBsvhu): GenericWaste { bsdType: "BSVHU", bsdSubType: getBsvhuSubType(bsvhu), status: bsvhu.status, - customId: null, + customId: bsvhu.customId, destinationCap: null, destinationOperationNoTraceability: false, destinationReceptionAcceptationStatus: diff --git a/back/src/bsvhu/resolvers/mutations/__tests__/createBsvhu.integration.ts b/back/src/bsvhu/resolvers/mutations/__tests__/createBsvhu.integration.ts index f584a942ee..4304997807 100644 --- a/back/src/bsvhu/resolvers/mutations/__tests__/createBsvhu.integration.ts +++ b/back/src/bsvhu/resolvers/mutations/__tests__/createBsvhu.integration.ts @@ -16,6 +16,7 @@ const CREATE_VHU_FORM = gql` mutation CreateVhuForm($input: BsvhuInput!) { createBsvhu(input: $input) { id + customId destination { company { siret @@ -173,6 +174,64 @@ describe("Mutation.Vhu.create", () => { ); }); + it("should create a valid form with customid", async () => { + const { user, company } = await userWithCompanyFactory("MEMBER"); + const destinationCompany = await companyFactory({ + companyTypes: ["WASTE_VEHICLES"], + wasteVehiclesTypes: ["BROYEUR", "DEMOLISSEUR"] + }); + + const input = { + customId: "my custom id", + emitter: { + company: { + siret: company.siret, + name: "The crusher", + address: "Rue de la carcasse", + contact: "Un centre VHU", + phone: "0101010101", + mail: "emitter@mail.com" + }, + agrementNumber: "1234" + }, + wasteCode: "16 01 06", + packaging: "UNITE", + identification: { + numbers: ["123", "456"], + type: "NUMERO_ORDRE_REGISTRE_POLICE" + }, + quantity: 2, + weight: { + isEstimate: false, + value: 1.3 + }, + destination: { + type: "BROYEUR", + plannedOperationCode: "R 12", + company: { + siret: destinationCompany.siret, + name: "destination", + address: "address", + contact: "contactEmail", + phone: "contactPhone", + mail: "contactEmail@mail.com" + }, + agrementNumber: "9876" + } + }; + const { mutate } = makeClient(user); + const { data } = await mutate>( + CREATE_VHU_FORM, + { + variables: { + input + } + } + ); + + expect(data.createBsvhu.customId).toBe("my custom id"); + }); + it("should create a bsvhu and autocomplete transporter recepisse", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); const destinationCompany = await companyFactory({ diff --git a/back/src/bsvhu/resolvers/mutations/__tests__/createDraftBsvhu.integration.ts b/back/src/bsvhu/resolvers/mutations/__tests__/createDraftBsvhu.integration.ts index 45dfb0e077..79459b0c9e 100644 --- a/back/src/bsvhu/resolvers/mutations/__tests__/createDraftBsvhu.integration.ts +++ b/back/src/bsvhu/resolvers/mutations/__tests__/createDraftBsvhu.integration.ts @@ -13,6 +13,7 @@ const CREATE_VHU_FORM = ` mutation CreateVhuForm($input: BsvhuInput!) { createDraftBsvhu(input: $input) { id + customId destination { company { siret @@ -125,4 +126,36 @@ describe("Mutation.Vhu.createDraft", () => { input.destination.company ); }); + + it("create a form with a customid", async () => { + const { user, company } = await userWithCompanyFactory("MEMBER"); + const destination = await companyFactory({ + companyTypes: ["WASTE_VEHICLES"] + }); + + const input = { + customId: "my custom id", + emitter: { + company: { + siret: company.siret + } + }, + destination: { + company: { + siret: destination.siret + } + } + }; + const { mutate } = makeClient(user); + const { data } = await mutate>( + CREATE_VHU_FORM, + { + variables: { + input + } + } + ); + + expect(data.createDraftBsvhu.customId).toEqual("my custom id"); + }); }); diff --git a/back/src/bsvhu/resolvers/mutations/__tests__/duplicateBsvhu.integration.ts b/back/src/bsvhu/resolvers/mutations/__tests__/duplicateBsvhu.integration.ts index 2ece1440b7..84f488ff01 100644 --- a/back/src/bsvhu/resolvers/mutations/__tests__/duplicateBsvhu.integration.ts +++ b/back/src/bsvhu/resolvers/mutations/__tests__/duplicateBsvhu.integration.ts @@ -277,6 +277,7 @@ describe("mutaion.duplicateBsvhu", () => { const expectedSkipped = [ "id", + "customId", "createdAt", "updatedAt", "rowNumber", diff --git a/back/src/bsvhu/resolvers/mutations/__tests__/updateBsvhu.integration.ts b/back/src/bsvhu/resolvers/mutations/__tests__/updateBsvhu.integration.ts index b3f78c3df9..ba98bf781d 100644 --- a/back/src/bsvhu/resolvers/mutations/__tests__/updateBsvhu.integration.ts +++ b/back/src/bsvhu/resolvers/mutations/__tests__/updateBsvhu.integration.ts @@ -139,6 +139,33 @@ describe("Mutation.Vhu.update", () => { expect(updatedBsvhu.quantity).toEqual(4); }); + it("should allow user to update a draft BSVHU customId", async () => { + const { company, user } = await userWithCompanyFactory(UserRole.ADMIN); + const bsvhu = await bsvhuFactory({ + userId: user.id, + opt: { + isDraft: true, + status: "INITIAL", + emitterCompanySiret: company.siret + } + }); + const { mutate } = makeClient(user); + const input = { + customId: "the custom id" + }; + const { errors } = await mutate>( + UPDATE_VHU_FORM, + { + variables: { id: bsvhu.id, input } + } + ); + expect(errors).toBeUndefined(); + const updatedBsvhu = await prisma.bsvhu.findFirstOrThrow({ + where: { id: bsvhu.id } + }); + expect(updatedBsvhu.customId).toEqual("the custom id"); + }); + it("should disallow user who isn't part of the creator's companies to update a draft BSVHU", async () => { const { company, user } = await userWithCompanyFactory(UserRole.ADMIN); const { company: company2, user: user2 } = await userWithCompanyFactory( diff --git a/back/src/bsvhu/resolvers/queries/__tests__/bsvhu.integration.ts b/back/src/bsvhu/resolvers/queries/__tests__/bsvhu.integration.ts index f1fe73ec4c..80c24c7629 100644 --- a/back/src/bsvhu/resolvers/queries/__tests__/bsvhu.integration.ts +++ b/back/src/bsvhu/resolvers/queries/__tests__/bsvhu.integration.ts @@ -15,6 +15,7 @@ const GET_BSVHU = ` query GetBsvhu($id: ID!) { bsvhu(id: $id) { id + customId isDraft destination { company { @@ -72,7 +73,6 @@ describe("Query.Bsvhu", () => { afterEach(resetDatabase); it("should disallow unauthenticated user", async () => { - const { query } = makeClient(); const { company } = await userWithCompanyFactory("MEMBER"); const bsvhu = await bsvhuFactory({ @@ -81,6 +81,8 @@ describe("Query.Bsvhu", () => { } }); + const { query } = makeClient(); + const { errors } = await query>(GET_BSVHU, { variables: { id: bsvhu.id } }); @@ -180,4 +182,58 @@ describe("Query.Bsvhu", () => { expect(data.bsvhu.id).toBe(bsvhu.id); }); + + it("should retrieve queried fields", async () => { + const { user, company } = await userWithCompanyFactory("MEMBER"); + const bsvhu = await bsvhuFactory({ + opt: { + customId: "some custom ID", + emitterCompanySiret: company.siret + } + }); + + const { query } = makeClient(user); + + const { data } = await query>(GET_BSVHU, { + variables: { id: bsvhu.id } + }); + + const expected = { + id: bsvhu.id, + customId: "some custom ID", + isDraft: false, + destination: { company: { siret: bsvhu.destinationCompanySiret } }, + emitter: { + agrementNumber: bsvhu.emitterAgrementNumber, + company: { siret: bsvhu.emitterCompanySiret } + }, + transporter: { + company: { + siret: bsvhu.transporterCompanySiret, + name: bsvhu.transporterCompanyName, + address: bsvhu.transporterCompanyAddress, + contact: bsvhu.transporterCompanyContact, + mail: bsvhu.transporterCompanyMail, + phone: bsvhu.transporterCompanyPhone, + vatNumber: null + }, + recepisse: { number: bsvhu.transporterRecepisseNumber } + }, + ecoOrganisme: { + name: bsvhu.ecoOrganismeName, + siret: bsvhu.ecoOrganismeSiret + }, + broker: { + company: { siret: bsvhu.brokerCompanySiret }, + recepisse: { number: bsvhu.brokerRecepisseNumber } + }, + trader: { + company: { siret: bsvhu.traderCompanySiret }, + recepisse: { number: bsvhu.traderRecepisseNumber } + }, + weight: { value: 0.0014 } // cf. getVhuFormdata() + }; + + expect(data.bsvhu).toEqual(expected); + }); }); diff --git a/back/src/bsvhu/resolvers/queries/__tests__/bsvhus.integration.ts b/back/src/bsvhu/resolvers/queries/__tests__/bsvhus.integration.ts index 5734ffd9a9..1da4bc843b 100644 --- a/back/src/bsvhu/resolvers/queries/__tests__/bsvhus.integration.ts +++ b/back/src/bsvhu/resolvers/queries/__tests__/bsvhus.integration.ts @@ -11,6 +11,7 @@ import { toIntermediaryCompany } from "../../../__tests__/factories.vhu"; import { UserRole } from "@prisma/client"; +import { ErrorCode } from "../../../../common/errors"; const GET_BSVHUS = ` query GetBsvhus($where: BsvhuWhere) { @@ -24,6 +25,7 @@ const GET_BSVHUS = ` edges { node { id + customId isDraft destination { company { @@ -78,6 +80,25 @@ const GET_BSVHUS = ` describe("Query.Bsvhus", () => { afterEach(resetDatabase); + it("should disallow unauthenticated user", async () => { + const { query } = makeClient(); + const { company } = await userWithCompanyFactory("MEMBER"); + + await bsvhuFactory({ + opt: { emitterCompanySiret: company.siret, customId: "some custom ID" } + }); + + const { errors } = await query>(GET_BSVHUS); + expect(errors).toEqual([ + expect.objectContaining({ + message: "Vous n'êtes pas connecté.", + extensions: expect.objectContaining({ + code: ErrorCode.UNAUTHENTICATED + }) + }) + ]); + }); + it("should get a list of bsvhus when user belongs to only 1 company", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); const opt = { @@ -96,6 +117,55 @@ describe("Query.Bsvhus", () => { expect(data.bsvhus.edges.length).toBe(4); }); + it("should retrieve queried fields", async () => { + const { user, company } = await userWithCompanyFactory("MEMBER"); + + const bsvhu = await bsvhuFactory({ + opt: { emitterCompanySiret: company.siret, customId: "some custom ID" } + }); + + const { query } = makeClient(user); + + const { data } = await query>(GET_BSVHUS); + + expect(data.bsvhus.edges.length).toBe(1); + + const expected = { + id: bsvhu.id, + customId: "some custom ID", + isDraft: false, + destination: { company: { siret: bsvhu.destinationCompanySiret } }, + emitter: { + agrementNumber: bsvhu.emitterAgrementNumber, + company: { siret: bsvhu.emitterCompanySiret } + }, + transporter: { + company: { + siret: bsvhu.transporterCompanySiret, + name: bsvhu.transporterCompanyName, + address: bsvhu.transporterCompanyAddress, + contact: bsvhu.transporterCompanyContact, + mail: bsvhu.transporterCompanyMail, + phone: bsvhu.transporterCompanyPhone, + vatNumber: null + }, + recepisse: { number: bsvhu.transporterRecepisseNumber } + }, + + broker: { + company: { siret: bsvhu.brokerCompanySiret }, + recepisse: { number: bsvhu.brokerRecepisseNumber } + }, + trader: { + company: { siret: bsvhu.traderCompanySiret }, + recepisse: { number: bsvhu.traderRecepisseNumber } + }, + weight: { value: 0.0014 } // cf. getVhuFormdata() + }; + + expect(data.bsvhus.edges[0].node).toEqual(expected); + }); + it("should return bsvhus where user company is an intermediary", async () => { const otherCompany = await companyFactory(); const { company, user } = await userWithCompanyFactory(UserRole.ADMIN); @@ -159,6 +229,30 @@ describe("Query.Bsvhus", () => { expect(data.bsvhus.edges.length).toBe(1); }); + it("should get a filtered list of bsvhus when wehre condition filters by customId", async () => { + const { user, company } = await userWithCompanyFactory("MEMBER"); + const opt = { + emitterCompanySiret: company.siret + }; + // Create 3 forms on emitter Company + const bsvhu = await bsvhuFactory({ + opt: { ...opt, customId: "mycustomid" } + }); + await bsvhuFactory({ opt }); + await bsvhuFactory({ opt }); + await bsvhuFactory({ opt }); + + const { query } = makeClient(user); + const { data } = await query>(GET_BSVHUS, { + variables: { + where: { customId: { _eq: "mycustomid" } } + } + }); + + expect(data.bsvhus.edges.length).toBe(1); + expect(data.bsvhus.edges[0].node.id).toBe(bsvhu.id); + }); + it("should get bsvhus from every companies when no filter is passed and user belongs to several companies", async () => { const { user, company } = await userWithCompanyFactory("MEMBER"); const secondCompany = await companyAssociatedToExistingUserFactory( diff --git a/back/src/bsvhu/resolvers/queries/bsvhus.ts b/back/src/bsvhu/resolvers/queries/bsvhus.ts index a0c0911db1..b743d82d0e 100644 --- a/back/src/bsvhu/resolvers/queries/bsvhus.ts +++ b/back/src/bsvhu/resolvers/queries/bsvhus.ts @@ -52,7 +52,6 @@ export default async function bsvhus( ...(whereArgs ? toPrismaWhereInput(whereArgs) : {}), isDeleted: false }; - const where = applyMask(prismaWhere, draftMask); const bsvhuRepository = getReadonlyBsvhuRepository(); const totalCount = await bsvhuRepository.count(where); diff --git a/back/src/bsvhu/typeDefs/bsvhu.inputs.graphql b/back/src/bsvhu/typeDefs/bsvhu.inputs.graphql index 1457a9f1d6..dde06673e8 100644 --- a/back/src/bsvhu/typeDefs/bsvhu.inputs.graphql +++ b/back/src/bsvhu/typeDefs/bsvhu.inputs.graphql @@ -2,6 +2,8 @@ input BsvhuWhere { "Filtre sur l'ID" id: IdFilter + "" + customId: StringFilter "Filtre sur le statut de brouillon." isDraft: Boolean "Filtre sur le statut" @@ -87,7 +89,11 @@ input BsvhuOperationWhere { input BsvhuInput { "Détails sur l'émetteur" emitter: BsvhuEmitterInput - + """ + Identifiant personnalisé permettant de faire le lien avec un + objet un système d'information tierce + """ + customId: String "Code déchet. Presque toujours 16 01 06" wasteCode: String "Conditionnement du déchet" diff --git a/back/src/bsvhu/typeDefs/bsvhu.objects.graphql b/back/src/bsvhu/typeDefs/bsvhu.objects.graphql index ad5379216c..866790f97b 100644 --- a/back/src/bsvhu/typeDefs/bsvhu.objects.graphql +++ b/back/src/bsvhu/typeDefs/bsvhu.objects.graphql @@ -29,6 +29,11 @@ type BsvhuError { type Bsvhu { "Numéro unique attribué par Trackdéchets" id: ID! + """ + Identifiant personnalisé permettant de faire le lien avec un + objet un système d'information tierce + """ + customId: String "Date de création" createdAt: DateTime "Date de dernière modification" diff --git a/back/src/bsvhu/validation/rules.ts b/back/src/bsvhu/validation/rules.ts index ec1f4742c6..9e3eee7b22 100644 --- a/back/src/bsvhu/validation/rules.ts +++ b/back/src/bsvhu/validation/rules.ts @@ -91,6 +91,10 @@ const sealedFromEmissionExceptForEmitter: GetBsvhuSignatureTypeFn = ( }; export const bsvhuEditionRules: BsvhuEditionRules = { + customId: { + sealed: { from: "OPERATION" }, + readableFieldName: "Le numéro libre" + }, createdAt: { sealed: { from: "EMISSION" } }, diff --git a/back/src/bsvhu/validation/schema.ts b/back/src/bsvhu/validation/schema.ts index e0aaafae72..f1bb6560a8 100644 --- a/back/src/bsvhu/validation/schema.ts +++ b/back/src/bsvhu/validation/schema.ts @@ -74,6 +74,7 @@ const rawBsvhuSchema = z.object({ // Cela permet de faire évoluer le schéma existant lors d'une MEP sans bloquer // en cours de route des bordereaux qui ont déjà été publié sur la base d'une // ancienne version du schéma. + customId: z.string().nullish(), createdAt: z.date().nullish(), isDraft: z.boolean().default(false), isDeleted: z.boolean().default(false), diff --git a/back/src/bsvhu/where.ts b/back/src/bsvhu/where.ts index 810e633c61..58668c4c1a 100644 --- a/back/src/bsvhu/where.ts +++ b/back/src/bsvhu/where.ts @@ -13,6 +13,7 @@ function toPrismaBsvhuWhereInput(where: BsvhuWhere): Prisma.BsvhuWhereInput { return safeInput({ ...toPrismaGenericWhereInput(where), status: toPrismaEnumFilter(where.status), + customId: toPrismaStringFilter(where.customId), emitterCompanySiret: toPrismaStringFilter(where.emitter?.company?.siret), emitterEmissionSignatureDate: toPrismaDateFilter( where.emitter?.emission?.signature?.date diff --git a/front/src/Apps/Dashboard/Creation/bsvhu/schema.ts b/front/src/Apps/Dashboard/Creation/bsvhu/schema.ts index 0883bd7588..d76b8b0ac7 100644 --- a/front/src/Apps/Dashboard/Creation/bsvhu/schema.ts +++ b/front/src/Apps/Dashboard/Creation/bsvhu/schema.ts @@ -120,6 +120,7 @@ const zodDestination = z.object({ }); export const rawBsvhuSchema = z.object({ + customId: z.string().nullish(), wasteCode: z.enum(BSVHU_WASTE_CODES).nullish(), emitter: zodEmitter, transporter: zodTransporter, diff --git a/front/src/Apps/Dashboard/Creation/bsvhu/steps/Waste.tsx b/front/src/Apps/Dashboard/Creation/bsvhu/steps/Waste.tsx index 9c875e5f8d..ec047dfa56 100644 --- a/front/src/Apps/Dashboard/Creation/bsvhu/steps/Waste.tsx +++ b/front/src/Apps/Dashboard/Creation/bsvhu/steps/Waste.tsx @@ -46,7 +46,13 @@ const WasteBsvhu = ({ errors }: { errors: TabError[] }) => { return ( <> {!!sealedFields.length && } - +
    + +
    { }; export default { + customId: "", emitter: { company: getInitialEmitterCompany(), agrementNumber: "", diff --git a/front/src/Apps/Dashboard/bsdMapper.ts b/front/src/Apps/Dashboard/bsdMapper.ts index 3b87d7a193..b62039ad08 100644 --- a/front/src/Apps/Dashboard/bsdMapper.ts +++ b/front/src/Apps/Dashboard/bsdMapper.ts @@ -337,6 +337,7 @@ const mapBsvhu = (bsvhu: Bsvhu): BsdDisplay => { const bsvhuFormatted: BsdDisplay = { id: bsvhu.id, readableid: bsvhu.id, + customId: bsvhu?.customId || "", type: mapBsdTypeNameToBsdType(bsvhu.__typename) || BsdType.Bsvhu, isDraft: bsvhu.isDraft, status: mapBsdStatusToBsdStatusEnum(statusCode), diff --git a/front/src/Apps/common/queries/fragments/bsvhu.ts b/front/src/Apps/common/queries/fragments/bsvhu.ts index e39aaeeb6a..1f406dd245 100644 --- a/front/src/Apps/common/queries/fragments/bsvhu.ts +++ b/front/src/Apps/common/queries/fragments/bsvhu.ts @@ -4,6 +4,7 @@ import { companyFragment, dashboardCompanyFragment } from "./company"; export const vhuFragment = gql` fragment VhuFragment on Bsvhu { id + customId bsvhuStatus: status isDraft emitter { @@ -54,6 +55,7 @@ export const vhuFragment = gql` export const dashboardVhuFragment = gql` fragment DashboardVhuFragment on Bsvhu { id + customId bsvhuStatus: status isDraft emitter { @@ -96,6 +98,7 @@ export const dashboardVhuFragment = gql` export const FullBsvhuFragment = gql` fragment FullBsvhu on Bsvhu { id + customId isDraft status createdAt diff --git a/front/src/dashboard/detail/bsvhu/BsvhuDetailContent.tsx b/front/src/dashboard/detail/bsvhu/BsvhuDetailContent.tsx index f43a24e2de..ec7783d15f 100644 --- a/front/src/dashboard/detail/bsvhu/BsvhuDetailContent.tsx +++ b/front/src/dashboard/detail/bsvhu/BsvhuDetailContent.tsx @@ -48,6 +48,10 @@ export function BsvhuDetailContent({ form }: Props) { [{form.isDraft ? "Brouillon" : VHU_VERBOSE_STATUSES[form.status]}]
    {!form.isDraft && {form.id}} + + {!!form.customId && ( + Numéro libre: {form.customId} + )}
    diff --git a/libs/back/prisma/src/migrations/20241028144237_bsvhu_custom_id/migration.sql b/libs/back/prisma/src/migrations/20241028144237_bsvhu_custom_id/migration.sql new file mode 100644 index 0000000000..ef626ce87d --- /dev/null +++ b/libs/back/prisma/src/migrations/20241028144237_bsvhu_custom_id/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE "Bsvhu" ADD COLUMN "customId" TEXT; + +-- CreateIndex +CREATE INDEX "_BsvhuCustomIdIdx" ON "Bsvhu"("customId"); diff --git a/libs/back/prisma/src/schema.prisma b/libs/back/prisma/src/schema.prisma index 98165fca97..3360ccb515 100644 --- a/libs/back/prisma/src/schema.prisma +++ b/libs/back/prisma/src/schema.prisma @@ -1017,6 +1017,7 @@ model Bsvhu { updatedAt DateTime @updatedAt @db.Timestamptz(6) isDraft Boolean @default(false) isDeleted Boolean @default(false) + customId String? status BsvhuStatus @default(INITIAL) @@ -1131,6 +1132,7 @@ model Bsvhu { @@index([canAccessDraftOrgIds], map: "_BsvhuCanAccessDraftOrgIdsIdx", type: Gin) @@index([status], map: "_BsvhuStatusIdx") @@index([updatedAt], map: "_BsvhuUpdatedAtIdx") + @@index([customId], map: "_Bsvhumigrations/CustomIdIdx") } model RegistryDelegation { From df7be27f8d5e497aa1fada7ba2561f9f6cd25a88 Mon Sep 17 00:00:00 2001 From: Julien Seren-Rosso Date: Tue, 12 Nov 2024 13:57:12 +0100 Subject: [PATCH 28/74] Fix scrollable inputs (#3716) --- .../Validation/BSDD/SignReception.tsx | 7 ++--- .../NonScrollableInput/NonScrollableInput.tsx | 26 +++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 front/src/Apps/common/Components/NonScrollableInput/NonScrollableInput.tsx diff --git a/front/src/Apps/Dashboard/Validation/BSDD/SignReception.tsx b/front/src/Apps/Dashboard/Validation/BSDD/SignReception.tsx index 1f1d4608c3..6a1e430140 100644 --- a/front/src/Apps/Dashboard/Validation/BSDD/SignReception.tsx +++ b/front/src/Apps/Dashboard/Validation/BSDD/SignReception.tsx @@ -18,6 +18,7 @@ import { z } from "zod"; import { useForm, Controller } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { SignForm } from "./SignForm"; +import NonScrollableInput from "../../../common/Components/NonScrollableInput/NonScrollableInput"; import RadioButtons from "@codegouvfr/react-dsfr/RadioButtons"; import Input from "@codegouvfr/react-dsfr/Input"; import Button from "@codegouvfr/react-dsfr/Button"; @@ -473,7 +474,7 @@ function SignReceptionModal({
    - Poids refusé - Poids accepté - (null); + + useEffect(() => { + const handleOnWheel = event => { + event.preventDefault(); + }; + + if (inputRef && inputRef.current) { + const input = inputRef.current; + + input.addEventListener("wheel", handleOnWheel, { + passive: false + }); + + return () => { + input.removeEventListener("wheel", handleOnWheel); + }; + } + }, [inputRef]); + + return ; +} From 6410f4952d9ae375ab7ee1e749e20cf391a852ac Mon Sep 17 00:00:00 2001 From: Benoit Guigal Date: Fri, 18 Oct 2024 10:05:14 +0200 Subject: [PATCH 29/74] refacto(notifications) : use several boolean fields instead of array --- .../onboarding.helpers.integration.ts | 48 +++-- .../__tests__/sendmails.integration.ts | 12 +- apps/cron/src/commands/onboarding.helpers.ts | 10 +- back/src/__tests__/factories.ts | 19 +- back/src/bsda/resolvers/mutations/sign.ts | 8 +- back/src/companies/converters.ts | 8 +- back/src/companies/database.ts | 20 ++- .../src/companies/resolvers/CompanyPrivate.ts | 17 +- .../__tests__/createCompany.integration.ts | 9 +- .../resolvers/mutations/createCompany.ts | 8 +- .../mutations/renewSecurityCodeService.ts | 9 +- .../typeDefs/company.objects.graphql | 4 +- back/src/forms/mail/renderFormRefusedEmail.ts | 7 +- .../__tests__/markAsAccepted.integration.ts | 22 +-- back/src/index.ts | 1 + .../src/users/__tests__/notifications.test.ts | 28 +++ back/src/users/database.ts | 16 +- back/src/users/notifications.ts | 165 ++++++++++++++---- .../acceptMembershipRequest.integration.ts | 8 +- .../__tests__/changeUserRole.integration.ts | 27 +-- .../inviteUserToCompany.integration.ts | 4 +- .../__tests__/joinWithInvite.integration.ts | 2 +- .../sendMembershipRequest.integration.ts | 7 +- .../setCompanyNotifications.integration.ts | 165 +++++++++--------- .../resolvers/mutations/changeUserRole.ts | 4 +- .../mutations/sendMembershipRequest.ts | 6 +- .../mutations/setCompanyNotifications.ts | 42 ++++- .../typeDefs/private/user.inputs.graphql | 19 +- back/src/users/typeDefs/user.enums.graphql | 18 -- back/src/users/typeDefs/user.objects.graphql | 18 ++ .../NotificationsDisplay.tsx | 40 +++-- .../NotificationsUpdateButton.tsx | 8 +- .../NotificationsUpdateModal.tsx | 67 ++++--- front/src/common/notifications.ts | 34 ---- .../migration.sql | 54 ++++++ libs/back/prisma/src/schema.prisma | 23 +-- 36 files changed, 578 insertions(+), 379 deletions(-) create mode 100644 back/src/users/__tests__/notifications.test.ts delete mode 100644 front/src/common/notifications.ts create mode 100644 libs/back/prisma/src/migrations/20241017145500_update_notifications_schema/migration.sql diff --git a/apps/cron/src/commands/__tests__/onboarding.helpers.integration.ts b/apps/cron/src/commands/__tests__/onboarding.helpers.integration.ts index 7fda0353f3..316ecf648a 100644 --- a/apps/cron/src/commands/__tests__/onboarding.helpers.integration.ts +++ b/apps/cron/src/commands/__tests__/onboarding.helpers.integration.ts @@ -2,7 +2,6 @@ import { BsdaRevisionRequest, BsdasriRevisionRequest, MembershipRequestStatus, - UserNotification, UserRole } from "@prisma/client"; import { prisma } from "@td/prisma"; @@ -293,7 +292,7 @@ describe("getPendingMembershipRequestsAndAssociatedMailSubscribers ", () => { "ADMIN", {}, {}, - { notifications: [UserNotification.MEMBERSHIP_REQUEST] } + { notificationIsActiveMembershipRequest: true } ); // crée un second admin abonné aux notifications de demandes de rattachement @@ -302,7 +301,7 @@ describe("getPendingMembershipRequestsAndAssociatedMailSubscribers ", () => { admin01.id, companyAndAdmin0.company.orgId, UserRole.ADMIN, - { notifications: [UserNotification.MEMBERSHIP_REQUEST] } + { notificationIsActiveMembershipRequest: true } ); // crée un troisième admin qui n'est pas abonné aux notifications de demandes de rattachement @@ -310,8 +309,7 @@ describe("getPendingMembershipRequestsAndAssociatedMailSubscribers ", () => { await associateUserToCompany( admin02.id, companyAndAdmin0.company.orgId, - UserRole.ADMIN, - { notifications: [] } + UserRole.ADMIN ); const companyAndAdmin1 = await userWithCompanyFactory("ADMIN"); @@ -454,7 +452,7 @@ describe("getPendingBSDARevisionRequestsWithSubscribers", () => { "ADMIN", {}, {}, - { notifications: [UserNotification.REVISION_REQUEST] } + { notificationIsActiveRevisionRequest: true } ); const { company: companyOfSomeoneElse } = await userWithCompanyFactory( "ADMIN" @@ -592,7 +590,7 @@ describe("getPendingBSDARevisionRequestsWithSubscribers", () => { "ADMIN", {}, {}, - { notifications: [UserNotification.REVISION_REQUEST] } + { notificationIsActiveRevisionRequest: true } ); const { company: companyOfSomeoneElse } = await userWithCompanyFactory( "ADMIN" @@ -620,7 +618,7 @@ describe("getPendingBSDARevisionRequestsWithSubscribers", () => { "ADMIN", {}, {}, - { notifications: [UserNotification.REVISION_REQUEST] } + { notificationIsActiveRevisionRequest: true } ); const { company: companyOfSomeoneElse2 } = await userWithCompanyFactory( "ADMIN" @@ -687,11 +685,11 @@ describe("getPendingBSDARevisionRequestsWithSubscribers", () => { "ADMIN", {}, {}, - { notifications: [UserNotification.REVISION_REQUEST] } + { notificationIsActiveRevisionRequest: true } ); const user2 = await userFactory(); await associateUserToCompany(user2.id, company.orgId, "ADMIN", { - notifications: [UserNotification.REVISION_REQUEST] + notificationIsActiveRevisionRequest: true }); const { company: companyOfSomeoneElse } = await userWithCompanyFactory( @@ -744,9 +742,7 @@ describe("getPendingBSDARevisionRequestsWithSubscribers", () => { // Given const { user, company } = await userWithCompanyFactory("ADMIN"); const user2 = await userFactory(); - await associateUserToCompany(user2.id, company.orgId, "ADMIN", { - notifications: [] - }); + await associateUserToCompany(user2.id, company.orgId, "ADMIN"); const { company: companyOfSomeoneElse } = await userWithCompanyFactory( "ADMIN" ); @@ -811,7 +807,7 @@ describe("getPendingBSDDRevisionRequestsWithSubscribers", () => { "ADMIN", {}, {}, - { notifications: [UserNotification.REVISION_REQUEST] } + { notificationIsActiveRevisionRequest: true } ); const { company: companyOfSomeoneElse } = await userWithCompanyFactory( "ADMIN" @@ -942,7 +938,7 @@ describe("getPendingBSDDRevisionRequestsWithSubscribers", () => { "ADMIN", {}, {}, - { notifications: [UserNotification.REVISION_REQUEST] } + { notificationIsActiveRevisionRequest: true } ); const { company: companyOfSomeoneElse } = await userWithCompanyFactory( "ADMIN" @@ -968,7 +964,7 @@ describe("getPendingBSDDRevisionRequestsWithSubscribers", () => { "ADMIN", {}, {}, - { notifications: [UserNotification.REVISION_REQUEST] } + { notificationIsActiveRevisionRequest: true } ); const { company: companyOfSomeoneElse2 } = await userWithCompanyFactory( "ADMIN" @@ -1035,11 +1031,11 @@ describe("getPendingBSDDRevisionRequestsWithSubscribers", () => { "ADMIN", {}, {}, - { notifications: [UserNotification.REVISION_REQUEST] } + { notificationIsActiveRevisionRequest: true } ); const user2 = await userFactory(); await associateUserToCompany(user2.id, company.orgId, "ADMIN", { - notifications: [UserNotification.REVISION_REQUEST] + notificationIsActiveRevisionRequest: true }); const { company: companyOfSomeoneElse } = await userWithCompanyFactory( "ADMIN" @@ -1090,9 +1086,7 @@ describe("getPendingBSDDRevisionRequestsWithSubscribers", () => { // Given const { user, company } = await userWithCompanyFactory("ADMIN"); const user2 = await userFactory(); - await associateUserToCompany(user2.id, company.orgId, "ADMIN", { - notifications: [] - }); + await associateUserToCompany(user2.id, company.orgId, "ADMIN"); const { company: companyOfSomeoneElse } = await userWithCompanyFactory( "ADMIN" ); @@ -1274,7 +1268,7 @@ describe("getPendingBSDARIRevisionRequestsWithSubscribers", () => { "ADMIN", {}, {}, - { notifications: [UserNotification.REVISION_REQUEST] } + { notificationIsActiveRevisionRequest: true } ); const { company: companyOfSomeoneElse } = await userWithCompanyFactory( "ADMIN" @@ -1302,7 +1296,7 @@ describe("getPendingBSDARIRevisionRequestsWithSubscribers", () => { "ADMIN", {}, {}, - { notifications: [UserNotification.REVISION_REQUEST] } + { notificationIsActiveRevisionRequest: true } ); const { company: companyOfSomeoneElse2 } = await userWithCompanyFactory( "ADMIN" @@ -1366,11 +1360,11 @@ describe("getPendingBSDARIRevisionRequestsWithSubscribers", () => { "ADMIN", {}, {}, - { notifications: [UserNotification.REVISION_REQUEST] } + { notificationIsActiveRevisionRequest: true } ); const user2 = await userFactory(); await associateUserToCompany(user2.id, company.orgId, "ADMIN", { - notifications: [UserNotification.REVISION_REQUEST] + notificationIsActiveRevisionRequest: true }); const { company: companyOfSomeoneElse } = await userWithCompanyFactory( "ADMIN" @@ -1418,9 +1412,7 @@ describe("getPendingBSDARIRevisionRequestsWithSubscribers", () => { it("should not return non-subscribers from pending companies", async () => { const { user, company } = await userWithCompanyFactory("ADMIN"); const user2 = await userFactory(); - await associateUserToCompany(user2.id, company.orgId, "ADMIN", { - notifications: [] - }); + await associateUserToCompany(user2.id, company.orgId, "ADMIN"); const { company: companyOfSomeoneElse } = await userWithCompanyFactory( "ADMIN" ); diff --git a/apps/cron/src/commands/__tests__/sendmails.integration.ts b/apps/cron/src/commands/__tests__/sendmails.integration.ts index 327c4d8a68..ac2e4965c3 100644 --- a/apps/cron/src/commands/__tests__/sendmails.integration.ts +++ b/apps/cron/src/commands/__tests__/sendmails.integration.ts @@ -1,10 +1,6 @@ import axios from "axios"; import { resetDatabase } from "libs/back/tests-integration"; -import { - CompanyType, - MembershipRequestStatus, - UserNotification -} from "@prisma/client"; +import { CompanyType, MembershipRequestStatus } from "@prisma/client"; import { prisma } from "@td/prisma"; import { companyFactory, @@ -335,7 +331,7 @@ describe("sendPendingMembershipRequestToAdminDetailsEmail", () => { "ADMIN", {}, {}, - { notifications: [UserNotification.MEMBERSHIP_REQUEST] } + { notificationIsActiveMembershipRequest: true } ); await createMembershipRequest(user, companyAndAdmin.company, { @@ -413,7 +409,7 @@ describe("sendPendingRevisionRequestToAdminDetailsEmail", () => { "ADMIN", {}, {}, - { notifications: [UserNotification.REVISION_REQUEST] } + { notificationIsActiveRevisionRequest: true } ); const { company: companyOfSomeoneElse } = await userWithCompanyFactory( "ADMIN" @@ -438,7 +434,7 @@ describe("sendPendingRevisionRequestToAdminDetailsEmail", () => { "ADMIN", {}, {}, - { notifications: [UserNotification.REVISION_REQUEST] } + { notificationIsActiveRevisionRequest: true } ); const { company: companyOfSomeoneElse2 } = await userWithCompanyFactory( "ADMIN" diff --git a/apps/cron/src/commands/onboarding.helpers.ts b/apps/cron/src/commands/onboarding.helpers.ts index 9da63feda9..40417a122c 100644 --- a/apps/cron/src/commands/onboarding.helpers.ts +++ b/apps/cron/src/commands/onboarding.helpers.ts @@ -1,7 +1,8 @@ import { getCompaniesAndSubscribersByCompanyOrgIds, formatDate, - sendMail + sendMail, + UserNotification } from "back"; import { prisma } from "@td/prisma"; import { @@ -16,8 +17,7 @@ import { Company, RevisionRequestApprovalStatus, RevisionRequestStatus, - User, - UserNotification + User } from "@prisma/client"; import * as COMPANY_CONSTANTS from "@td/constants"; import { @@ -293,9 +293,7 @@ export const getPendingMembershipRequestsAndAssociatedSubscribers = async ( include: { companyAssociations: { where: { - notifications: { - has: UserNotification.MEMBERSHIP_REQUEST - }, + notificationIsActiveMembershipRequest: true, user: { isActive: true } diff --git a/back/src/__tests__/factories.ts b/back/src/__tests__/factories.ts index 617f7e3591..e0978d9f40 100644 --- a/back/src/__tests__/factories.ts +++ b/back/src/__tests__/factories.ts @@ -11,17 +11,17 @@ import { User, Prisma, Company, - TransportMode, UserNotification, WasteProcessorType, CollectorType, - CompanyType + TransportMode } from "@prisma/client"; import { prisma } from "@td/prisma"; import { hashToken } from "../utils"; import { createUser, getUserCompanies } from "../users/database"; import { getFormSiretsByRole, SIRETS_BY_ROLE_INCLUDE } from "../forms/database"; import { CompanyRole } from "../common/validation/zod/schema"; +import { getDefaultNotifications } from "../users/notifications"; /** * Create a user with name and email @@ -141,24 +141,15 @@ export const userWithCompanyFactory = async ( ): Promise => { const company = await companyFactory(companyOpts); - const notifications = - role === "ADMIN" - ? [ - UserNotification.MEMBERSHIP_REQUEST, - UserNotification.REVISION_REQUEST, - UserNotification.BSD_REFUSAL, - UserNotification.SIGNATURE_CODE_RENEWAL, - UserNotification.BSDA_FINAL_DESTINATION_UPDATE - ] - : []; + const notifications = getDefaultNotifications(role); const user = await userFactory({ ...userOpts, companyAssociations: { create: { company: { connect: { id: company.id } }, - notifications, - role: role, + ...notifications, + role, ...companyAssociationOpts } } diff --git a/back/src/bsda/resolvers/mutations/sign.ts b/back/src/bsda/resolvers/mutations/sign.ts index df63b4c976..b933929010 100644 --- a/back/src/bsda/resolvers/mutations/sign.ts +++ b/back/src/bsda/resolvers/mutations/sign.ts @@ -3,15 +3,12 @@ import { BsdaStatus, BsdaType, Prisma, - UserNotification, WasteAcceptationStatus } from "@prisma/client"; - import { BsdTransporterReceiptPart, getTransporterReceipt } from "../../../companies/recipify"; - import { UserInputError } from "../../../common/errors"; import { checkIsAuthenticated } from "../../../common/permissions"; import { runInTransaction } from "../../../common/repository/helper"; @@ -42,7 +39,10 @@ import { parseBsdaAsync } from "../../validation"; import { prismaToZodBsda } from "../../validation/helpers"; import { AlreadySignedError } from "../../../bsvhu/errors"; import { operationHook } from "../../operationHook"; -import { getNotificationSubscribers } from "../../../users/notifications"; +import { + getNotificationSubscribers, + UserNotification +} from "../../../users/notifications"; const signBsda: MutationResolvers["signBsda"] = async ( _, diff --git a/back/src/companies/converters.ts b/back/src/companies/converters.ts index 881c7e18d1..0bb7fcda9b 100644 --- a/back/src/companies/converters.ts +++ b/back/src/companies/converters.ts @@ -13,6 +13,12 @@ export function toGqlCompanyPrivate(company: Company): CompanyPrivate { signatureAutomations: [], receivedSignatureAutomations: [], userPermissions: [], - userNotifications: [] + userNotifications: { + membershipRequest: false, + signatureCodeRenewal: false, + bsdRefusal: false, + bsdaFinalDestinationUpdate: false, + revisionRequest: false + } }; } diff --git a/back/src/companies/database.ts b/back/src/companies/database.ts index 7d12b93e46..f47f1f596d 100644 --- a/back/src/companies/database.ts +++ b/back/src/companies/database.ts @@ -8,9 +8,7 @@ import { Prisma, Company, CompanyAssociation, - UserAccountHash, - UserNotification, - UserRole + UserAccountHash } from "@prisma/client"; import { CompanyNotFound, @@ -33,7 +31,12 @@ import { searchVatFrOnlyOrNotFoundFailFast } from "./search"; import { SireneSearchResult } from "./sirene/types"; -import { ALL_NOTIFICATIONS } from "../users/notifications"; +import { + getDefaultNotifications, + notificationToPrismaField, + toGqlNotifications, + UserNotification +} from "../users/notifications"; /** * Retrieves a company by any unique identifier or throw a CompanyNotFound error @@ -204,7 +207,7 @@ export const userAssociationToCompanyMember = ( name: userNameDisplay(companyAssociation, requestingUserId, isTDAdmin), role: companyAssociation.role, isPendingInvitation: false, - notifications: companyAssociation.notifications + notifications: toGqlNotifications(companyAssociation) }; }; @@ -226,8 +229,9 @@ export const userAccountHashToCompanyMember = ( role: userAccountHash.role, isActive: false, isPendingInvitation: true, - notifications: - userAccountHash.role === UserRole.ADMIN ? ALL_NOTIFICATIONS : [] + notifications: toGqlNotifications( + getDefaultNotifications(userAccountHash.role) + ) }; }; @@ -329,7 +333,7 @@ export const getCompaniesAndSubscribersByCompanyOrgIds = async ( include: { companyAssociations: { where: { - notifications: { has: notification }, + [notificationToPrismaField[notification]]: true, user: { isActive: true } diff --git a/back/src/companies/resolvers/CompanyPrivate.ts b/back/src/companies/resolvers/CompanyPrivate.ts index 7afd378e21..d1dc716d94 100644 --- a/back/src/companies/resolvers/CompanyPrivate.ts +++ b/back/src/companies/resolvers/CompanyPrivate.ts @@ -2,6 +2,7 @@ import { prisma } from "@td/prisma"; import { CompanyPrivateResolvers } from "../../generated/graphql/types"; import { getCompanyUsers } from "../database"; import { getUserRole, grants, toGraphQLPermission } from "../../permissions"; +import { toGqlNotifications } from "../../users/notifications"; const companyPrivateResolvers: CompanyPrivateResolvers = { users: async (parent, _, context) => { @@ -28,18 +29,10 @@ const companyPrivateResolvers: CompanyPrivateResolvers = { return role ? grants[role].map(toGraphQLPermission) : []; }, userNotifications: async (parent, _, context) => { - if (!context.user) { - return []; - } - const companyAssociations = await prisma.company - .findUnique({ where: { id: parent.id } }) - .companyAssociations({ where: { userId: context.user.id } }); - - if (companyAssociations?.length) { - return companyAssociations[0].notifications; - } - - return []; + const companyAssociation = await prisma.companyAssociation.findFirstOrThrow( + { where: { companyId: parent.id, userId: context.user?.id } } + ); + return toGqlNotifications(companyAssociation); }, transporterReceipt: parent => { return prisma.company diff --git a/back/src/companies/resolvers/mutations/__tests__/createCompany.integration.ts b/back/src/companies/resolvers/mutations/__tests__/createCompany.integration.ts index dab07eeb33..c194f35fbc 100644 --- a/back/src/companies/resolvers/mutations/__tests__/createCompany.integration.ts +++ b/back/src/companies/resolvers/mutations/__tests__/createCompany.integration.ts @@ -15,6 +15,7 @@ import { CompanyType, CompanyVerificationMode, CompanyVerificationStatus, + UserRole, WasteProcessorType, WasteVehiclesType } from "@prisma/client"; @@ -31,7 +32,7 @@ import { import { searchCompany } from "../../../search"; import { sendVerificationCodeLetter } from "../../../../common/post"; import gql from "graphql-tag"; -import { ALL_NOTIFICATIONS } from "../../../../users/notifications"; +import { getDefaultNotifications } from "../../../../users/notifications"; // Mock external search services jest.mock("../../../search"); @@ -174,7 +175,11 @@ describe("Mutation.createCompany", () => { }); expect(newCompanyAssociation).not.toBeNull(); - expect(newCompanyAssociation?.notifications).toEqual(ALL_NOTIFICATIONS); + expect(newCompanyAssociation!.role).toEqual(UserRole.ADMIN); + // toutes les notifications doivent être actives + expect(newCompanyAssociation).toMatchObject( + getDefaultNotifications(newCompanyAssociation!.role) + ); const refreshedUser = await prisma.user.findUniqueOrThrow({ where: { id: user.id } diff --git a/back/src/companies/resolvers/mutations/createCompany.ts b/back/src/companies/resolvers/mutations/createCompany.ts index 50ee87840a..2b7ad5b0b3 100644 --- a/back/src/companies/resolvers/mutations/createCompany.ts +++ b/back/src/companies/resolvers/mutations/createCompany.ts @@ -4,6 +4,7 @@ import { CompanyVerificationMode, CompanyVerificationStatus, Prisma, + UserRole, WasteProcessorType, WasteVehiclesType } from "@prisma/client"; @@ -33,7 +34,7 @@ import { isGenericEmail } from "@td/constants"; import { parseCompanyAsync } from "../../validation/index"; import { companyInputToZodCompany } from "../../validation/helpers"; import { toGqlCompanyPrivate } from "../../converters"; -import { ALL_NOTIFICATIONS } from "../../../users/notifications"; +import { getDefaultNotifications } from "../../../users/notifications"; /** * Create a new company and associate it to a user * who becomes the first admin of the company @@ -179,14 +180,15 @@ const createCompanyResolver: MutationResolvers["createCompany"] = async ( companyCreateInput.verifiedAt = new Date(); } + const notifications = getDefaultNotifications(UserRole.ADMIN); const companyAssociation = await prisma.companyAssociation.create({ data: { user: { connect: { id: user.id } }, company: { create: companyCreateInput }, - role: "ADMIN", - notifications: ALL_NOTIFICATIONS + role: UserRole.ADMIN, + ...notifications }, include: { company: true } }); diff --git a/back/src/companies/resolvers/mutations/renewSecurityCodeService.ts b/back/src/companies/resolvers/mutations/renewSecurityCodeService.ts index d3bb3dbaf8..15df24586e 100644 --- a/back/src/companies/resolvers/mutations/renewSecurityCodeService.ts +++ b/back/src/companies/resolvers/mutations/renewSecurityCodeService.ts @@ -1,15 +1,14 @@ import { prisma } from "@td/prisma"; - import { sendMail } from "../../../mailer/mailing"; - import { CompanyPrivate } from "../../../generated/graphql/types"; - import { randomNumber } from "../../../utils"; import { renderMail, securityCodeRenewal } from "@td/mail"; import { isSiret, isVat } from "@td/constants"; import { UserInputError } from "../../../common/errors"; -import { getNotificationSubscribers } from "../../../users/notifications"; -import { UserNotification } from "@prisma/client"; +import { + getNotificationSubscribers, + UserNotification +} from "../../../users/notifications"; import { toGqlCompanyPrivate } from "../../converters"; /** diff --git a/back/src/companies/typeDefs/company.objects.graphql b/back/src/companies/typeDefs/company.objects.graphql index 86195b6846..a49d796b3f 100644 --- a/back/src/companies/typeDefs/company.objects.graphql +++ b/back/src/companies/typeDefs/company.objects.graphql @@ -46,7 +46,7 @@ type CompanyPrivate { userPermissions: [UserPermission!]! "Liste des notifications auquels l'utilisateur est abonné pour cet établissement" - userNotifications: [UserNotification!]! + userNotifications: UserNotifications! """ Nom d'usage de l'entreprise qui permet de différencier @@ -646,7 +646,7 @@ type CompanyMember { isMe: Boolean "Liste des notifications auxquelles l'utilisateur est abonné pour cet établissement" - notifications: [UserNotification!]! + notifications: UserNotifications! } """ diff --git a/back/src/forms/mail/renderFormRefusedEmail.ts b/back/src/forms/mail/renderFormRefusedEmail.ts index dec3af0f98..e09f77a6c2 100644 --- a/back/src/forms/mail/renderFormRefusedEmail.ts +++ b/back/src/forms/mail/renderFormRefusedEmail.ts @@ -1,4 +1,4 @@ -import { BsddTransporter, Form, UserNotification } from "@prisma/client"; +import { BsddTransporter, Form } from "@prisma/client"; import { prisma } from "@td/prisma"; import { generateBsddPdfToBase64 } from "../pdf"; import { @@ -10,7 +10,10 @@ import { import { getTransporterCompanyOrgId, Dreals } from "@td/constants"; import { getFirstTransporter } from "../database"; import { bsddWasteQuantities } from "../helpers/bsddWasteQuantities"; -import { getNotificationSubscribers } from "../../users/notifications"; +import { + getNotificationSubscribers, + UserNotification +} from "../../users/notifications"; const { NOTIFY_DREAL_WHEN_FORM_DECLINED } = process.env; diff --git a/back/src/forms/resolvers/mutations/__tests__/markAsAccepted.integration.ts b/back/src/forms/resolvers/mutations/__tests__/markAsAccepted.integration.ts index c9e9c49a19..9a017b5d15 100644 --- a/back/src/forms/resolvers/mutations/__tests__/markAsAccepted.integration.ts +++ b/back/src/forms/resolvers/mutations/__tests__/markAsAccepted.integration.ts @@ -5,7 +5,6 @@ import { EmptyReturnADR, Status, TransportMode, - UserNotification, UserRole, WasteAcceptationStatus } from "@prisma/client"; @@ -249,14 +248,12 @@ describe("Test Form reception", () => { // should received email const emitter2 = await userFactory(); await associateUserToCompany(emitter2.id, emitterCompany.orgId, "ADMIN", { - notifications: [UserNotification.BSD_REFUSAL] + notificationIsActiveBsdRefusal: true }); // should not receive email const emitter3 = await userFactory(); - await associateUserToCompany(emitter3.id, emitterCompany.orgId, "ADMIN", { - notifications: [] - }); + await associateUserToCompany(emitter3.id, emitterCompany.orgId, "ADMIN"); // should received email const recipient2 = await userFactory(); @@ -265,7 +262,7 @@ describe("Test Form reception", () => { recipientCompany.orgId, "ADMIN", { - notifications: [UserNotification.BSD_REFUSAL] + notificationIsActiveBsdRefusal: true } ); @@ -335,14 +332,12 @@ describe("Test Form reception", () => { // should received email const emitter2 = await userFactory(); await associateUserToCompany(emitter2.id, emitterCompany.orgId, "ADMIN", { - notifications: [UserNotification.BSD_REFUSAL] + notificationIsActiveBsdRefusal: true }); // should not receive email const emitter3 = await userFactory(); - await associateUserToCompany(emitter3.id, emitterCompany.orgId, "ADMIN", { - notifications: [] - }); + await associateUserToCompany(emitter3.id, emitterCompany.orgId, "ADMIN"); // should received email const recipient2 = await userFactory(); @@ -351,7 +346,7 @@ describe("Test Form reception", () => { recipientCompany.orgId, "ADMIN", { - notifications: [UserNotification.BSD_REFUSAL] + notificationIsActiveBsdRefusal: true } ); @@ -360,10 +355,7 @@ describe("Test Form reception", () => { await associateUserToCompany( recipient3.id, recipientCompany.orgId, - "ADMIN", - { - notifications: [] - } + "ADMIN" ); await prisma.form.update({ diff --git a/back/src/index.ts b/back/src/index.ts index 072a751f2f..2a36c2ad6f 100644 --- a/back/src/index.ts +++ b/back/src/index.ts @@ -85,3 +85,4 @@ export { getBsdasriFromActivityEvents } from "./activity-events/bsdasri"; export { getBsdaFromActivityEvents } from "./activity-events/bsda"; export { getBsddFromActivityEvents } from "./activity-events/bsdd"; export { cleanUpIsReturnForTab } from "./common/elasticHelpers"; +export { UserNotification } from "./users/notifications"; diff --git a/back/src/users/__tests__/notifications.test.ts b/back/src/users/__tests__/notifications.test.ts new file mode 100644 index 0000000000..ba67f496f4 --- /dev/null +++ b/back/src/users/__tests__/notifications.test.ts @@ -0,0 +1,28 @@ +import { UserRole } from "@prisma/client"; +import { getDefaultNotifications } from "../notifications"; + +describe("getDefaultNotifications", () => { + it.each([UserRole.ADMIN, UserRole.MEMBER, UserRole.DRIVER, UserRole.READER])( + "should return default notifications for role %p", + role => { + const notifications = getDefaultNotifications(role); + if (role === UserRole.ADMIN) { + expect(notifications).toEqual({ + notificationIsActiveMembershipRequest: true, + notificationIsActiveSignatureCodeRenewal: true, + notificationIsActiveBsdRefusal: true, + notificationIsActiveRevisionRequest: true, + notificationIsActiveBsdaFinalDestinationUpdate: true + }); + } else { + expect(notifications).toEqual({ + notificationIsActiveMembershipRequest: false, + notificationIsActiveSignatureCodeRenewal: false, + notificationIsActiveBsdRefusal: false, + notificationIsActiveRevisionRequest: false, + notificationIsActiveBsdaFinalDestinationUpdate: false + }); + } + } + ); +}); diff --git a/back/src/users/database.ts b/back/src/users/database.ts index 451e377b37..c0c36a7f39 100644 --- a/back/src/users/database.ts +++ b/back/src/users/database.ts @@ -17,7 +17,7 @@ import { deleteCachedUserRoles } from "../common/redis/users"; import { hashPassword, passwordVersion } from "./utils"; import { UserInputError } from "../common/errors"; import { PrismaTransaction } from "../common/repository/types"; -import { ALL_NOTIFICATIONS, getDefaultNotifications } from "./notifications"; +import { getDefaultNotifications } from "./notifications"; export async function getUserCompanies(userId: string): Promise { const companyAssociations = await prisma.companyAssociation.findMany({ @@ -118,7 +118,7 @@ export async function associateUserToCompany( user: { connect: { id: userId } }, role, company: { connect: { orgId } }, - notifications, + ...notifications, ...opt } }); @@ -202,17 +202,17 @@ export async function acceptNewUserCompanyInvitations(user: User) { } await Promise.all( - existingHashes.map(existingHash => - prisma.companyAssociation.create({ + existingHashes.map(existingHash => { + const notifications = getDefaultNotifications(existingHash.role); + return prisma.companyAssociation.create({ data: { company: { connect: { orgId: existingHash.companySiret } }, user: { connect: { id: user.id } }, role: existingHash.role, - notifications: - existingHash.role === UserRole.ADMIN ? ALL_NOTIFICATIONS : [] + ...notifications } - }) - ) + }); + }) ); if (!user.firstAssociationDate) { await prisma.user.update({ diff --git a/back/src/users/notifications.ts b/back/src/users/notifications.ts index f6a3e8574d..e314c4cff2 100644 --- a/back/src/users/notifications.ts +++ b/back/src/users/notifications.ts @@ -1,55 +1,120 @@ -import { UserNotification, UserRole } from "@prisma/client"; +import { CompanyAssociation, Prisma, UserRole } from "@prisma/client"; import { Recipient } from "@td/mail"; import { prisma } from "@td/prisma"; +import { + UserNotifications as GqlNotifications, + UserNotificationsInput +} from "@td/codegen-ui"; +import { safeInput } from "../common/converter"; -// Récupère la liste des des utilisateurs abonnés à un type -// de notification donnée au sein d'un ou plusieurs établissements -export async function getNotificationSubscribers( - notification: UserNotification, - orgIds: string[] -): Promise { - const companies = await prisma.company.findMany({ - where: { orgId: { in: orgIds } }, - include: { - companyAssociations: { - where: { - notifications: { has: notification }, - user: { - isActive: true - } - }, - include: { - user: { select: { name: true, email: true } } - } - } - } - }); - - return companies.flatMap(c => c.companyAssociations.map(a => a.user)); +// Notifications auxquelles un utilisateur peut s'abonner pour +// un établissement donné +export enum UserNotification { + // Notification de demande de rattachement + MEMBERSHIP_REQUEST, + // Notification de renouvellement du code signature + SIGNATURE_CODE_RENEWAL, + // Notifications en cas de refus total ou partiel d'un BSD + BSD_REFUSAL, + // Notification lors de la modification de la destination finale amiante + BSDA_FINAL_DESTINATION_UPDATE, + // Notification lors d'une demande de révision + REVISION_REQUEST } +// Liste les champs qui permettent de contrôler les abonnements +// aux notifications sur le modèle `CompanyAssociation` +type notificationFields = + | "notificationIsActiveMembershipRequest" + | "notificationIsActiveSignatureCodeRenewal" + | "notificationIsActiveBsdRefusal" + | "notificationIsActiveRevisionRequest" + | "notificationIsActiveBsdaFinalDestinationUpdate"; + +type PrismaNotifications = Pick; + +/** + * Construit un mapping entre les types de notifications et + * les champs booléans du modèle `CompanyAssociation` qui + * permettent d'activer ou de désactiver les notifications + */ +export const notificationToPrismaField: { + [key in UserNotification]: keyof PrismaNotifications; +} = { + [UserNotification.MEMBERSHIP_REQUEST]: + "notificationIsActiveMembershipRequest", + [UserNotification.SIGNATURE_CODE_RENEWAL]: + "notificationIsActiveSignatureCodeRenewal", + [UserNotification.BSD_REFUSAL]: "notificationIsActiveBsdRefusal", + [UserNotification.REVISION_REQUEST]: "notificationIsActiveRevisionRequest", + [UserNotification.BSDA_FINAL_DESTINATION_UPDATE]: + "notificationIsActiveBsdaFinalDestinationUpdate" +}; + /** * Renvoie les notififications auxquelles un utilisateur est abonné par * défaut lorsqu'il rejoint un établissement ou change de rôle */ -export function getDefaultNotifications(role: UserRole) { - return role === UserRole.ADMIN ? ALL_NOTIFICATIONS : []; +export function getDefaultNotifications(role: UserRole): PrismaNotifications { + const isActive = role === UserRole.ADMIN ? true : false; + return { + notificationIsActiveMembershipRequest: isActive, + notificationIsActiveSignatureCodeRenewal: isActive, + notificationIsActiveBsdRefusal: isActive, + notificationIsActiveRevisionRequest: isActive, + notificationIsActiveBsdaFinalDestinationUpdate: isActive + }; } -// if you modify this structure, please modify -// in front/src/common/notifications -export const ALL_NOTIFICATIONS: UserNotification[] = [ - UserNotification.MEMBERSHIP_REQUEST, - UserNotification.REVISION_REQUEST, - UserNotification.BSD_REFUSAL, - UserNotification.SIGNATURE_CODE_RENEWAL, - UserNotification.BSDA_FINAL_DESTINATION_UPDATE -]; +/** + * Convertit les champs booléans de notification du format Prisma + * vers le format GraphQL (revient à enlever `notificationIsActive` + * en début du nom des champs Prisma) + */ +export function toGqlNotifications( + notifications: PrismaNotifications +): GqlNotifications { + return { + membershipRequest: notifications.notificationIsActiveMembershipRequest, + revisionRequest: notifications.notificationIsActiveRevisionRequest, + signatureCodeRenewal: + notifications.notificationIsActiveSignatureCodeRenewal, + bsdRefusal: notifications.notificationIsActiveBsdRefusal, + bsdaFinalDestinationUpdate: + notifications.notificationIsActiveBsdaFinalDestinationUpdate + }; +} + +/** + * Convertit l'input GraphQL UserNotificationsInput + * en payload d'update Prisma + */ +export function toPrismaNotifications( + notifications: UserNotificationsInput +): Prisma.CompanyAssociationUpdateInput { + return safeInput({ + notificationIsActiveMembershipRequest: + notifications.membershipRequest ?? undefined, + notificationIsActiveRevisionRequest: + notifications.revisionRequest ?? undefined, + notificationIsActiveSignatureCodeRenewal: + notifications.signatureCodeRenewal ?? undefined, + notificationIsActiveBsdRefusal: notifications.bsdRefusal ?? undefined, + notificationIsActiveBsdaFinalDestinationUpdate: + notifications.bsdaFinalDestinationUpdate ?? undefined + }); +} // if you modify this structure, please modify // in front/src/common/notifications export const authorizedNotifications = { - [UserRole.ADMIN]: ALL_NOTIFICATIONS, + [UserRole.ADMIN]: [ + UserNotification.MEMBERSHIP_REQUEST, + UserNotification.REVISION_REQUEST, + UserNotification.BSD_REFUSAL, + UserNotification.SIGNATURE_CODE_RENEWAL, + UserNotification.BSDA_FINAL_DESTINATION_UPDATE + ], [UserRole.MEMBER]: [ UserNotification.REVISION_REQUEST, UserNotification.BSD_REFUSAL, @@ -68,3 +133,29 @@ export const authorizedNotifications = { UserNotification.BSDA_FINAL_DESTINATION_UPDATE ] }; + +// Récupère la liste des des utilisateurs abonnés à un type +// de notification donnée au sein d'un ou plusieurs établissements +export async function getNotificationSubscribers( + notification: UserNotification, + orgIds: string[] +): Promise { + const companies = await prisma.company.findMany({ + where: { orgId: { in: orgIds } }, + include: { + companyAssociations: { + where: { + [notificationToPrismaField[notification]]: true, + user: { + isActive: true + } + }, + include: { + user: { select: { name: true, email: true } } + } + } + } + }); + + return companies.flatMap(c => c.companyAssociations.map(a => a.user)); +} diff --git a/back/src/users/resolvers/mutations/__tests__/acceptMembershipRequest.integration.ts b/back/src/users/resolvers/mutations/__tests__/acceptMembershipRequest.integration.ts index 8a223e4b64..4d516a43bc 100644 --- a/back/src/users/resolvers/mutations/__tests__/acceptMembershipRequest.integration.ts +++ b/back/src/users/resolvers/mutations/__tests__/acceptMembershipRequest.integration.ts @@ -10,7 +10,7 @@ import makeClient from "../../../../__tests__/testClient"; import { renderMail, membershipRequestAccepted } from "@td/mail"; import { Mutation } from "../../../../generated/graphql/types"; import { UserRole } from "@prisma/client"; -import { ALL_NOTIFICATIONS } from "../../../notifications"; +import { getDefaultNotifications } from "../../../notifications"; // No mails jest.mock("../../../../mailer/mailing"); @@ -153,11 +153,9 @@ describe("mutation acceptMembershipRequest", () => { expect(companyAssociations).toHaveLength(1); expect(companyAssociations[0].role).toEqual(role); - const expectedNotifications = role === "ADMIN" ? ALL_NOTIFICATIONS : []; + const expectedNotifications = getDefaultNotifications(role); - expect(companyAssociations[0].notifications).toEqual( - expectedNotifications - ); + expect(companyAssociations[0]).toMatchObject(expectedNotifications); // when a new user is invited and accepts invitation, `automaticallyAccepted` is false expect(companyAssociations[0].automaticallyAccepted).toEqual(false); diff --git a/back/src/users/resolvers/mutations/__tests__/changeUserRole.integration.ts b/back/src/users/resolvers/mutations/__tests__/changeUserRole.integration.ts index 42254ca280..b77628a3b6 100644 --- a/back/src/users/resolvers/mutations/__tests__/changeUserRole.integration.ts +++ b/back/src/users/resolvers/mutations/__tests__/changeUserRole.integration.ts @@ -10,7 +10,7 @@ import { AuthType } from "../../../../auth"; import { Mutation } from "../../../../generated/graphql/types"; import { ErrorCode, NotCompanyAdminErrorMsg } from "../../../../common/errors"; import { UserRole } from "@prisma/client"; -import { ALL_NOTIFICATIONS } from "../../../notifications"; +import { getDefaultNotifications } from "../../../notifications"; const CHANGE_USER_ROLE = ` mutation ChangeUserRole($userId: ID!, $orgId: ID!, $role: UserRole!){ @@ -28,12 +28,13 @@ describe("mutation changeUserRole", () => { "admin can change a company user with role ADMIN to role %p", async role => { const { user: admin, company } = await userWithCompanyFactory("ADMIN"); + const notifications = getDefaultNotifications(UserRole.ADMIN); const userToModify = await userFactory({ companyAssociations: { create: { company: { connect: { id: company.id } }, role: UserRole.ADMIN, - notifications: ALL_NOTIFICATIONS + ...notifications } } }); @@ -56,7 +57,9 @@ describe("mutation changeUserRole", () => { .companyAssociations(); expect(companyAssociations).toHaveLength(1); expect(companyAssociations[0].role).toEqual(role); - expect(companyAssociations[0].notifications).toEqual([]); + expect(companyAssociations[0]).toMatchObject( + getDefaultNotifications(companyAssociations[0].role) + ); } ); @@ -69,7 +72,7 @@ describe("mutation changeUserRole", () => { create: { company: { connect: { id: company.id } }, role: UserRole.MEMBER, - notifications: [] + ...getDefaultNotifications(UserRole.MEMBER) } } }); @@ -92,8 +95,8 @@ describe("mutation changeUserRole", () => { .companyAssociations(); expect(companyAssociations).toHaveLength(1); expect(companyAssociations[0].role).toEqual(role); - expect(companyAssociations[0].notifications).toEqual( - role === UserRole.ADMIN ? ALL_NOTIFICATIONS : [] + expect(companyAssociations[0]).toMatchObject( + getDefaultNotifications(companyAssociations[0].role) ); } ); @@ -107,7 +110,7 @@ describe("mutation changeUserRole", () => { create: { company: { connect: { id: company.id } }, role: UserRole.READER, - notifications: [] + ...getDefaultNotifications(UserRole.READER) } } }); @@ -130,8 +133,8 @@ describe("mutation changeUserRole", () => { .companyAssociations(); expect(companyAssociations).toHaveLength(1); expect(companyAssociations[0].role).toEqual(role); - expect(companyAssociations[0].notifications).toEqual( - role === UserRole.ADMIN ? ALL_NOTIFICATIONS : [] + expect(companyAssociations[0]).toMatchObject( + getDefaultNotifications(companyAssociations[0].role) ); } ); @@ -145,7 +148,7 @@ describe("mutation changeUserRole", () => { create: { company: { connect: { id: company.id } }, role: UserRole.DRIVER, - notifications: [] + ...getDefaultNotifications(UserRole.DRIVER) } } }); @@ -168,9 +171,7 @@ describe("mutation changeUserRole", () => { .companyAssociations(); expect(companyAssociations).toHaveLength(1); expect(companyAssociations[0].role).toEqual(role); - expect(companyAssociations[0].notifications).toEqual( - role === UserRole.ADMIN ? ALL_NOTIFICATIONS : [] - ); + expect(companyAssociations[0]).toMatchObject(companyAssociations[0].role); } ); diff --git a/back/src/users/resolvers/mutations/__tests__/inviteUserToCompany.integration.ts b/back/src/users/resolvers/mutations/__tests__/inviteUserToCompany.integration.ts index 84415599c6..4a04d74a21 100644 --- a/back/src/users/resolvers/mutations/__tests__/inviteUserToCompany.integration.ts +++ b/back/src/users/resolvers/mutations/__tests__/inviteUserToCompany.integration.ts @@ -68,9 +68,7 @@ describe("mutation inviteUserToCompany", () => { const expectedEmailNotification = getDefaultNotifications(role); - expect(companyAssociations[0].notifications).toEqual( - expectedEmailNotification - ); + expect(companyAssociations[0]).toMatchObject(expectedEmailNotification); const userCompany = await prisma.companyAssociation .findUniqueOrThrow({ diff --git a/back/src/users/resolvers/mutations/__tests__/joinWithInvite.integration.ts b/back/src/users/resolvers/mutations/__tests__/joinWithInvite.integration.ts index 08bf645c8f..cfb59617a8 100644 --- a/back/src/users/resolvers/mutations/__tests__/joinWithInvite.integration.ts +++ b/back/src/users/resolvers/mutations/__tests__/joinWithInvite.integration.ts @@ -108,7 +108,7 @@ describe("joinWithInvite mutation", () => { const expectedNotifications = getDefaultNotifications(role); - expect(companyAssociation?.notifications).toEqual(expectedNotifications); + expect(companyAssociation).toMatchObject(expectedNotifications); const createdUser = await prisma.user.findUniqueOrThrow({ where: { email: invitee } diff --git a/back/src/users/resolvers/mutations/__tests__/sendMembershipRequest.integration.ts b/back/src/users/resolvers/mutations/__tests__/sendMembershipRequest.integration.ts index e565189731..129fde9a1d 100644 --- a/back/src/users/resolvers/mutations/__tests__/sendMembershipRequest.integration.ts +++ b/back/src/users/resolvers/mutations/__tests__/sendMembershipRequest.integration.ts @@ -16,7 +16,6 @@ import { } from "@td/mail"; import { Mutation } from "../../../../generated/graphql/types"; import { subMinutes } from "date-fns"; -import { UserNotification } from "@prisma/client"; // No mails jest.mock("../../../../mailer/mailing"); @@ -62,12 +61,10 @@ describe("mutation sendMembershipRequest", () => { const company = await companyFactory(); // this user should receive the notification await associateUserToCompany(admin.id, company.orgId, "ADMIN", { - notifications: [UserNotification.MEMBERSHIP_REQUEST] + notificationIsActiveMembershipRequest: true }); // this user should not receive the notification - await associateUserToCompany(admin2.id, company.orgId, "ADMIN", { - notifications: [] - }); + await associateUserToCompany(admin2.id, company.orgId, "ADMIN"); const { mutate } = makeClient(requester); const { data } = await mutate>( SEND_MEMBERSHIP_REQUEST, diff --git a/back/src/users/resolvers/mutations/__tests__/setCompanyNotifications.integration.ts b/back/src/users/resolvers/mutations/__tests__/setCompanyNotifications.integration.ts index 8f42836d64..8473dd3233 100644 --- a/back/src/users/resolvers/mutations/__tests__/setCompanyNotifications.integration.ts +++ b/back/src/users/resolvers/mutations/__tests__/setCompanyNotifications.integration.ts @@ -10,8 +10,8 @@ import { MutationSetCompanyNotificationsArgs } from "../../../../generated/graphql/types"; import { prisma } from "@td/prisma"; -import { UserNotification, UserRole } from "@prisma/client"; -import { ALL_NOTIFICATIONS } from "../../../notifications"; +import { UserRole } from "@prisma/client"; +import { toPrismaNotifications } from "../../../notifications"; export const SET_COMPANY_NOTIFICATIONS = gql` mutation SetCompanyNotifications($input: SetCompanyNotificationsInput!) { @@ -23,6 +23,14 @@ export const SET_COMPANY_NOTIFICATIONS = gql` } `; +const unactiveNotifications = { + notificationIsActiveBsdaFinalDestinationUpdate: false, + notificationIsActiveBsdRefusal: false, + notificationIsActiveMembershipRequest: false, + notificationIsActiveRevisionRequest: false, + notificationIsActiveSignatureCodeRenewal: false +}; + describe("Mutation { setCompanyNotifications }", () => { test("Users who don't belong to company cannot subscribe to notifications", async () => { const user = await userFactory(); @@ -30,8 +38,6 @@ describe("Mutation { setCompanyNotifications }", () => { const { mutate } = makeClient(user); - const newNotifications = [UserNotification.MEMBERSHIP_REQUEST]; - const { errors } = await mutate< Pick, MutationSetCompanyNotificationsArgs @@ -39,7 +45,7 @@ describe("Mutation { setCompanyNotifications }", () => { variables: { input: { companyOrgId: company.siret!, - notifications: newNotifications + notifications: { membershipRequest: true } } } }); @@ -51,17 +57,21 @@ describe("Mutation { setCompanyNotifications }", () => { ]); }); - test.each(ALL_NOTIFICATIONS)( + test.each([ + "membershipRequest", + "signatureCodeRenewal", + "bsdRefusal", + "bsdaFinalDestinationUpdate", + "revisionRequest" + ])( "User with role ADMIN can subscribe to notification %p", async notification => { - const { user, company } = await userWithCompanyFactory(UserRole.ADMIN); - - const companyAssociation = - await prisma.companyAssociation.findFirstOrThrow({ - where: { companyId: company.id, userId: user.id } - }); - - expect(companyAssociation.notifications).toEqual(ALL_NOTIFICATIONS); + const { user, company } = await userWithCompanyFactory( + UserRole.ADMIN, + {}, + {}, + unactiveNotifications + ); const { mutate } = makeClient(user); @@ -74,7 +84,7 @@ describe("Mutation { setCompanyNotifications }", () => { variables: { input: { companyOrgId: company.orgId, - notifications: newNotifications + notifications: { [notification]: true } } } }); @@ -90,26 +100,27 @@ describe("Mutation { setCompanyNotifications }", () => { where: { companyId: company.id, userId: user.id } }); - expect(updatedCompanyAssociation.notifications).toEqual(newNotifications); + expect(updatedCompanyAssociation).toMatchObject({ + ...unactiveNotifications, + ...toPrismaNotifications({ [notification]: true }) + }); } ); test.each([ - UserNotification.REVISION_REQUEST, - UserNotification.BSD_REFUSAL, - UserNotification.SIGNATURE_CODE_RENEWAL, - UserNotification.BSDA_FINAL_DESTINATION_UPDATE + "signatureCodeRenewal", + "bsdRefusal", + "bsdaFinalDestinationUpdate", + "revisionRequest" ])( "User with role MEMBER can subscribe to notification %p", async notification => { - const { user, company } = await userWithCompanyFactory(UserRole.MEMBER); - - const companyAssociation = - await prisma.companyAssociation.findFirstOrThrow({ - where: { companyId: company.id, userId: user.id } - }); - - expect(companyAssociation.notifications).toEqual([]); + const { user, company } = await userWithCompanyFactory( + UserRole.MEMBER, + {}, + {}, + unactiveNotifications + ); const { mutate } = makeClient(user); @@ -122,7 +133,7 @@ describe("Mutation { setCompanyNotifications }", () => { variables: { input: { companyOrgId: company.orgId, - notifications: newNotifications + notifications: { [notification]: true } } } }); @@ -137,26 +148,27 @@ describe("Mutation { setCompanyNotifications }", () => { where: { companyId: company.id, userId: user.id } }); - expect(updatedCompanyAssociation.notifications).toEqual(newNotifications); + expect(updatedCompanyAssociation).toMatchObject({ + ...unactiveNotifications, + ...toPrismaNotifications({ [notification]: true }) + }); } ); test.each([ - UserNotification.REVISION_REQUEST, - UserNotification.BSD_REFUSAL, - UserNotification.SIGNATURE_CODE_RENEWAL, - UserNotification.BSDA_FINAL_DESTINATION_UPDATE + "signatureCodeRenewal", + "bsdRefusal", + "bsdaFinalDestinationUpdate", + "revisionRequest" ])( "User with role READER can subscribe to notification %p", async notification => { - const { user, company } = await userWithCompanyFactory(UserRole.READER); - - const companyAssociation = - await prisma.companyAssociation.findFirstOrThrow({ - where: { companyId: company.id, userId: user.id } - }); - - expect(companyAssociation.notifications).toEqual([]); + const { user, company } = await userWithCompanyFactory( + UserRole.READER, + {}, + {}, + unactiveNotifications + ); const { mutate } = makeClient(user); @@ -169,7 +181,7 @@ describe("Mutation { setCompanyNotifications }", () => { variables: { input: { companyOrgId: company.orgId, - notifications: newNotifications + notifications: { [notification]: true } } } }); @@ -184,25 +196,26 @@ describe("Mutation { setCompanyNotifications }", () => { where: { companyId: company.id, userId: user.id } }); - expect(updatedCompanyAssociation.notifications).toEqual(newNotifications); + expect(updatedCompanyAssociation).toMatchObject({ + ...unactiveNotifications, + ...toPrismaNotifications({ [notification]: true }) + }); } ); test.each([ - UserNotification.BSD_REFUSAL, - UserNotification.SIGNATURE_CODE_RENEWAL, - UserNotification.BSDA_FINAL_DESTINATION_UPDATE + "signatureCodeRenewal", + "bsdRefusal", + "bsdaFinalDestinationUpdate" ])( "User with role DRIVER can subscribe to notification %p", async notification => { - const { user, company } = await userWithCompanyFactory(UserRole.DRIVER); - - const companyAssociation = - await prisma.companyAssociation.findFirstOrThrow({ - where: { companyId: company.id, userId: user.id } - }); - - expect(companyAssociation.notifications).toEqual([]); + const { user, company } = await userWithCompanyFactory( + UserRole.DRIVER, + {}, + {}, + unactiveNotifications + ); const { mutate } = makeClient(user); @@ -215,7 +228,7 @@ describe("Mutation { setCompanyNotifications }", () => { variables: { input: { companyOrgId: company.orgId, - notifications: newNotifications + notifications: { [notification]: true } } } }); @@ -230,26 +243,25 @@ describe("Mutation { setCompanyNotifications }", () => { where: { companyId: company.id, userId: user.id } }); - expect(updatedCompanyAssociation.notifications).toEqual(newNotifications); + expect(updatedCompanyAssociation).toMatchObject({ + ...unactiveNotifications, + ...toPrismaNotifications({ [notification]: true }) + }); } ); test.each([UserRole.MEMBER, UserRole.DRIVER, UserRole.READER])( "users with role %p should not be able to subscribe to MEMBERSHIP_REQUEST notifications", async role => { - const { user, company } = await userWithCompanyFactory(role); - - const companyAssociation = - await prisma.companyAssociation.findFirstOrThrow({ - where: { companyId: company.id, userId: user.id } - }); - - expect(companyAssociation.notifications).toEqual([]); + const { user, company } = await userWithCompanyFactory( + role, + {}, + {}, + unactiveNotifications + ); const { mutate } = makeClient(user); - const newNotifications = [UserNotification.MEMBERSHIP_REQUEST]; - const { errors } = await mutate< Pick, MutationSetCompanyNotificationsArgs @@ -257,7 +269,7 @@ describe("Mutation { setCompanyNotifications }", () => { variables: { input: { companyOrgId: company.orgId, - notifications: newNotifications + notifications: { membershipRequest: true } } } }); @@ -272,20 +284,15 @@ describe("Mutation { setCompanyNotifications }", () => { ); test("Users with role DRIVER should not be able to susbcribe to REVISION_REQUEST notifications", async () => { - const { user, company } = await userWithCompanyFactory(UserRole.DRIVER); - - const companyAssociation = await prisma.companyAssociation.findFirstOrThrow( - { - where: { companyId: company.id, userId: user.id } - } + const { user, company } = await userWithCompanyFactory( + UserRole.DRIVER, + {}, + {}, + unactiveNotifications ); - expect(companyAssociation.notifications).toEqual([]); - const { mutate } = makeClient(user); - const newNotifications = [UserNotification.REVISION_REQUEST]; - const { errors } = await mutate< Pick, MutationSetCompanyNotificationsArgs @@ -293,7 +300,7 @@ describe("Mutation { setCompanyNotifications }", () => { variables: { input: { companyOrgId: company.orgId, - notifications: newNotifications + notifications: { revisionRequest: true } } } }); diff --git a/back/src/users/resolvers/mutations/changeUserRole.ts b/back/src/users/resolvers/mutations/changeUserRole.ts index b63c8c6302..b184a8226b 100644 --- a/back/src/users/resolvers/mutations/changeUserRole.ts +++ b/back/src/users/resolvers/mutations/changeUserRole.ts @@ -25,7 +25,7 @@ import { updateCompanyAssociation, updateUserAccountHash } from "../../database"; -import { ALL_NOTIFICATIONS } from "../../notifications"; +import { getDefaultNotifications } from "../../notifications"; const changeUserRoleResolver: MutationResolvers["changeUserRole"] = async ( parent, @@ -61,7 +61,7 @@ const changeUserRoleResolver: MutationResolvers["changeUserRole"] = async ( associationId: association.id, data: { role: args.role, - notifications: args.role === "ADMIN" ? ALL_NOTIFICATIONS : [] + ...getDefaultNotifications(args.role) } }); diff --git a/back/src/users/resolvers/mutations/sendMembershipRequest.ts b/back/src/users/resolvers/mutations/sendMembershipRequest.ts index cc347b3f3b..6e99e103d9 100644 --- a/back/src/users/resolvers/mutations/sendMembershipRequest.ts +++ b/back/src/users/resolvers/mutations/sendMembershipRequest.ts @@ -14,8 +14,10 @@ import { } from "@td/mail"; import { getEmailDomain, canSeeEmail } from "../../utils"; import { UserInputError } from "../../../common/errors"; -import { getNotificationSubscribers } from "../../notifications"; -import { UserNotification } from "@prisma/client"; +import { + getNotificationSubscribers, + UserNotification +} from "../../notifications"; const sendMembershipRequestResolver: MutationResolvers["sendMembershipRequest"] = async (parent, { siret }, context) => { diff --git a/back/src/users/resolvers/mutations/setCompanyNotifications.ts b/back/src/users/resolvers/mutations/setCompanyNotifications.ts index f0ceeac1a1..76d5652ee4 100644 --- a/back/src/users/resolvers/mutations/setCompanyNotifications.ts +++ b/back/src/users/resolvers/mutations/setCompanyNotifications.ts @@ -7,7 +7,41 @@ import { getCompanyOrCompanyNotFound } from "../../../companies/database"; import { MutationResolvers } from "../../../generated/graphql/types"; import { prisma } from "@td/prisma"; import { toGqlCompanyPrivate } from "../../../companies/converters"; -import { authorizedNotifications } from "../../notifications"; +import { + authorizedNotifications, + toPrismaNotifications, + UserNotification +} from "../../notifications"; +import { UserNotificationsInput } from "@td/codegen-ui"; + +function activeNotifications( + notifications: UserNotificationsInput +): UserNotification[] { + return [ + { + name: UserNotification.MEMBERSHIP_REQUEST, + isActive: notifications.membershipRequest + }, + { + name: UserNotification.SIGNATURE_CODE_RENEWAL, + isActive: notifications.signatureCodeRenewal + }, + { + name: UserNotification.BSD_REFUSAL, + isActive: notifications.bsdRefusal + }, + { + name: UserNotification.BSDA_FINAL_DESTINATION_UPDATE, + isActive: notifications.bsdaFinalDestinationUpdate + }, + { + name: UserNotification.REVISION_REQUEST, + isActive: notifications.revisionRequest + } + ] + .filter(n => n.isActive) + .map(n => n.name); +} const setCompanyNotificationsResolver: MutationResolvers["setCompanyNotifications"] = async (parent, args, context: GraphQLContext) => { @@ -27,7 +61,9 @@ const setCompanyNotificationsResolver: MutationResolvers["setCompanyNotification throw new NotCompanyMember(company.orgId); } - const unauthorizedNotifications = notifications.filter( + const subscribeTo = activeNotifications(notifications); + + const unauthorizedNotifications = subscribeTo.filter( notification => !authorizedNotifications[companyAssociation.role].includes(notification) ); @@ -41,7 +77,7 @@ const setCompanyNotificationsResolver: MutationResolvers["setCompanyNotification const updatedCompanyAssociation = await prisma.companyAssociation.update({ where: { id: companyAssociation.id }, - data: { notifications }, + data: toPrismaNotifications(notifications), include: { company: true } }); diff --git a/back/src/users/typeDefs/private/user.inputs.graphql b/back/src/users/typeDefs/private/user.inputs.graphql index 6fb05a1a76..be1c12051c 100644 --- a/back/src/users/typeDefs/private/user.inputs.graphql +++ b/back/src/users/typeDefs/private/user.inputs.graphql @@ -35,6 +35,23 @@ input CreatePasswordResetRequestInput { captcha: CaptchaInput! } +""" +Abonnement d'un utilisateur aux notifications d'un ou +plusieurs établissements +""" +input UserNotificationsInput { + # Abonnement aux notification de demande de rattachement + membershipRequest: Boolean + # Abonnement aux notification de renouvellement du code signature + signatureCodeRenewal: Boolean + # Abonnement aux notifications de refus total ou partiel d'un BSD + bsdRefusal: Boolean + # Abonnement aux notification de modification de la destination finale amiante + bsdaFinalDestinationUpdate: Boolean + # Abonnement aux notification de demandes de révision + revisionRequest: Boolean +} + input SetCompanyNotificationsInput { "Identifiant de l'établissement" companyOrgId: String! @@ -42,5 +59,5 @@ input SetCompanyNotificationsInput { Notifications auxquelles l'utilisateur souhaite être abonné pour l'établisement identifié par le paramètre companyOrgId """ - notifications: [UserNotification!]! + notifications: UserNotificationsInput! } diff --git a/back/src/users/typeDefs/user.enums.graphql b/back/src/users/typeDefs/user.enums.graphql index 4cf89d35b3..a3a32cfa67 100644 --- a/back/src/users/typeDefs/user.enums.graphql +++ b/back/src/users/typeDefs/user.enums.graphql @@ -27,24 +27,6 @@ enum UserRole { ADMIN } -""" -Notifications auxquelles un utilisateur peut s'abonner pour un établissement donné. -Par défaut les utilisateurs avec le rôle ADMIN sont abonnés à toutes les notifications -tandis que les autres rôles ne sont abonnés à aucune notification. -""" -enum UserNotification { - # Notification de demande de rattachement - MEMBERSHIP_REQUEST - # Notification de renouvellement du code signature - SIGNATURE_CODE_RENEWAL - # Notifications en cas de refus total ou partiel d'un BSD - BSD_REFUSAL - # Notification lors de la modification de la destination finale amiante - BSDA_FINAL_DESTINATION_UPDATE - # Notification lors d'une demande de révision - REVISION_REQUEST -} - enum UserPermission { "Lire un BSD." BSD_CAN_READ diff --git a/back/src/users/typeDefs/user.objects.graphql b/back/src/users/typeDefs/user.objects.graphql index 544fe84463..7524e4be66 100644 --- a/back/src/users/typeDefs/user.objects.graphql +++ b/back/src/users/typeDefs/user.objects.graphql @@ -65,3 +65,21 @@ type MembershipRequest { """ sentTo: [String!]! } + +""" +Notifications auxquelles un utilisateur peut s'abonner pour un établissement donné. +Par défaut les utilisateurs avec le rôle ADMIN sont abonnés à toutes les notifications +tandis que les autres rôles ne sont abonnés à aucune notification. +""" +type UserNotifications { + # Abonnement aux notification de demande de rattachement + membershipRequest: Boolean! + # Abonnement aux notification de renouvellement du code signature + signatureCodeRenewal: Boolean! + # Abonnement aux notifications de refus total ou partiel d'un BSD + bsdRefusal: Boolean! + # Abonnement aux notification de modification de la destination finale amiante + bsdaFinalDestinationUpdate: Boolean! + # Abonnement aux notification de demandes de révision + revisionRequest: Boolean! +} diff --git a/front/src/Apps/Account/AccountNotifications/NotificationsDisplay.tsx b/front/src/Apps/Account/AccountNotifications/NotificationsDisplay.tsx index 2fbfdce5a0..e3ec094190 100644 --- a/front/src/Apps/Account/AccountNotifications/NotificationsDisplay.tsx +++ b/front/src/Apps/Account/AccountNotifications/NotificationsDisplay.tsx @@ -1,27 +1,39 @@ -import { CompanyPrivate, UserNotification } from "@td/codegen-ui"; +import { CompanyPrivate, UserNotifications } from "@td/codegen-ui"; import React from "react"; type AccountCompanyNotificationsProps = { company: CompanyPrivate; }; -const notificationLabels: { [key in UserNotification]: string } = { - [UserNotification.MembershipRequest]: "Rattachement", - [UserNotification.SignatureCodeRenewal]: "Code signature", - [UserNotification.BsdRefusal]: "Refus", - [UserNotification.BsdaFinalDestinationUpdate]: "Destination finale amiante", - [UserNotification.RevisionRequest]: "Révision" -}; +function getNotificationLabels(notifications: UserNotifications) { + const labels = [ + { + value: "Rattachement", + isActive: notifications.membershipRequest + }, + { value: "Code signature", isActive: notifications.signatureCodeRenewal }, + { label: "Refus", isActive: notifications.bsdRefusal }, + { + value: "Destination finale amiante", + isActive: notifications.bsdaFinalDestinationUpdate + }, + { value: "Revision", isActive: notifications.revisionRequest } + ]; + return labels + .filter(l => l.isActive) + .map(l => l.value) + .join(", "); +} export function NotificationsDisplay({ company }: AccountCompanyNotificationsProps) { - if (!company.userNotifications || company.userNotifications.length === 0) { + if ( + Object.keys(company.userNotifications).every( + notification => !company.userNotifications[notification] + ) + ) { return
    Désactivé
    ; } - return ( -
    - {company.userNotifications.map(n => notificationLabels[n]).join(", ")} -
    - ); + return
    {getNotificationLabels(company.userNotifications)}
    ; } diff --git a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateButton.tsx b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateButton.tsx index 8c87573d93..149f97d08c 100644 --- a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateButton.tsx +++ b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateButton.tsx @@ -11,11 +11,15 @@ type AccountCompanyNotificationsUpdateButtonProps = { export default function NotificationsUpdateButton({ company }: AccountCompanyNotificationsUpdateButtonProps) { - const btnLabel = `Gérer (${company.userNotifications.length})`; + const activeNotifications = Object.keys(company.userNotifications).filter( + notification => company.userNotifications[notification] === true + ); + + const btnLabel = `Gérer (${activeNotifications.length})`; const modalTitle = `Gérer les notifications`; - const iconId = company.userNotifications?.length + const iconId = activeNotifications.length ? "ri-notification-3-line" : "ri-notification-off-line"; diff --git a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateModal.tsx b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateModal.tsx index e4f854f6a4..96250053c4 100644 --- a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateModal.tsx +++ b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateModal.tsx @@ -3,7 +3,8 @@ import { CompanyPrivate, Mutation, MutationSetCompanyNotificationsArgs, - UserNotification + UserNotifications, + UserRole } from "@td/codegen-ui"; import { useForm } from "react-hook-form"; import Checkbox from "@codegouvfr/react-dsfr/Checkbox"; @@ -11,17 +12,42 @@ import Button from "@codegouvfr/react-dsfr/Button"; import { useMutation } from "@apollo/client"; import { SET_COMPANY_NOTIFICATIONS } from "./queries"; import styles from "./NotificationsUpdateModal.module.scss"; -import { - ALL_NOTIFICATIONS, - authorizedNotifications as authorizedNotificationsByUserRole -} from "../../../common/notifications"; type AccountCompanyNotificationsUpdateModalProps = { company: CompanyPrivate; close: () => void; }; -type FormValues = { [key in UserNotification]: boolean }; +type OptionLabel = { + hintText: string; + label: string; + notification: keyof UserNotifications; +}; + +// if you modify this structure, please modify +// in back/src/users/notifications +export const authorizedNotificationsByUserRole: { + [key in UserRole]: (keyof UserNotifications)[]; +} = { + [UserRole.Admin]: [], + [UserRole.Member]: [ + "revisionRequest", + "bsdRefusal", + "signatureCodeRenewal", + "bsdaFinalDestinationUpdate" + ], + [UserRole.Reader]: [ + "revisionRequest", + "bsdRefusal", + "signatureCodeRenewal", + "bsdaFinalDestinationUpdate" + ], + [UserRole.Driver]: [ + "bsdRefusal", + "signatureCodeRenewal", + "bsdaFinalDestinationUpdate" + ] +}; export default function NotificationsUpdateModal({ company, @@ -32,29 +58,20 @@ export default function NotificationsUpdateModal({ MutationSetCompanyNotificationsArgs >(SET_COMPANY_NOTIFICATIONS); - const defaultValues: FormValues = ALL_NOTIFICATIONS.reduce( - (values, notification) => ({ - ...values, - [notification]: company.userNotifications.includes(notification) - }), - {} as FormValues - ); - const authorizedNotifications = company.userRole ? authorizedNotificationsByUserRole[company.userRole] : []; - const { register, handleSubmit } = useForm({ - defaultValues + const { register, handleSubmit } = useForm({ + defaultValues: company.userNotifications }); - const onSubmit = async (data: FormValues) => { - const notifications = Object.keys(data).filter(k => data[k]); + const onSubmit = async (data: UserNotifications) => { const { errors } = await setCompanyNotifications({ variables: { input: { companyOrgId: company.orgId, - notifications: notifications as UserNotification[] + notifications: data } } }); @@ -71,7 +88,7 @@ export default function NotificationsUpdateModal({ checkboxState = "success"; } - const optionsLabels = [ + const optionsLabels: OptionLabel[] = [ { hintText: "Seuls les membres avec le rôle Administrateur sont en mesure de recevoir " + @@ -79,32 +96,32 @@ export default function NotificationsUpdateModal({ "Nous vous conseillons donc vivement, pour chaque établissement de conserver au moins un " + "administrateur abonné à ce type de notification.", label: "aux demandes de rattachement", - notification: UserNotification.MembershipRequest + notification: "membershipRequest" }, { hintText: "Un courriel sera envoyé à chaque renouvellement du code de signature", label: "au renouvellement du code de signature", - notification: UserNotification.SignatureCodeRenewal + notification: "signatureCodeRenewal" }, { hintText: "un courriel sera envoyé à chaque refus total ou partiel d'un bordereau", label: "au refus total et partiel des bordereaux", - notification: UserNotification.BsdRefusal + notification: "bsdRefusal" }, { hintText: "Un courriel sera envoyé lorsque le BSDA est envoyé à un exutoire" + " différent de celui prévu lors de la signature producteur", label: "à la modification de la destination finale amiante", - notification: UserNotification.BsdaFinalDestinationUpdate + notification: "bsdaFinalDestinationUpdate" }, { hintText: "Un courriel sera envoyé à chaque fois qu'une révision sera restée sans réponse 14 jours après sa demande", label: "aux demandes de révision", - notification: UserNotification.RevisionRequest + notification: "revisionRequest" } ]; diff --git a/front/src/common/notifications.ts b/front/src/common/notifications.ts deleted file mode 100644 index be672f5392..0000000000 --- a/front/src/common/notifications.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { UserNotification, UserRole } from "@td/codegen-ui"; - -// if you modify this structure, please modify -// in back/src/users/notifications -export const ALL_NOTIFICATIONS: UserNotification[] = [ - UserNotification.MembershipRequest, - UserNotification.RevisionRequest, - UserNotification.BsdRefusal, - UserNotification.SignatureCodeRenewal, - UserNotification.BsdaFinalDestinationUpdate -]; - -// if you modify this structure, please modify -// in back/src/users/notifications -export const authorizedNotifications = { - [UserRole.Admin]: ALL_NOTIFICATIONS, - [UserRole.Member]: [ - UserNotification.RevisionRequest, - UserNotification.BsdRefusal, - UserNotification.SignatureCodeRenewal, - UserNotification.BsdaFinalDestinationUpdate - ], - [UserRole.Reader]: [ - UserNotification.RevisionRequest, - UserNotification.BsdRefusal, - UserNotification.SignatureCodeRenewal, - UserNotification.BsdaFinalDestinationUpdate - ], - [UserRole.Driver]: [ - UserNotification.BsdRefusal, - UserNotification.SignatureCodeRenewal, - UserNotification.BsdaFinalDestinationUpdate - ] -}; diff --git a/libs/back/prisma/src/migrations/20241017145500_update_notifications_schema/migration.sql b/libs/back/prisma/src/migrations/20241017145500_update_notifications_schema/migration.sql new file mode 100644 index 0000000000..fd6d919592 --- /dev/null +++ b/libs/back/prisma/src/migrations/20241017145500_update_notifications_schema/migration.sql @@ -0,0 +1,54 @@ +-- AlterTable +ALTER TABLE + "CompanyAssociation" +ADD + COLUMN "notificationIsActiveBsdRefusal" BOOLEAN NOT NULL DEFAULT false, +ADD + COLUMN "notificationIsActiveBsdaFinalDestinationUpdate" BOOLEAN NOT NULL DEFAULT false, +ADD + COLUMN "notificationIsActiveMembershipRequest" BOOLEAN NOT NULL DEFAULT false, +ADD + COLUMN "notificationIsActiveRevisionRequest" BOOLEAN NOT NULL DEFAULT false, +ADD + COLUMN "notificationIsActiveSignatureCodeRenewal" BOOLEAN NOT NULL DEFAULT false; + +UPDATE + "CompanyAssociation" +SET + "notificationIsActiveBsdRefusal" = true +WHERE + 'BSD_REFUSAL' :: "UserNotification" = ANY(notifications); + +UPDATE + "CompanyAssociation" +SET + "notificationIsActiveBsdaFinalDestinationUpdate" = true +WHERE + 'BSDA_FINAL_DESTINATION_UPDATE' :: "UserNotification" = ANY(notifications); + +UPDATE + "CompanyAssociation" +SET + "notificationIsActiveMembershipRequest" = true +WHERE + 'MEMBERSHIP_REQUEST' :: "UserNotification" = ANY(notifications); + +UPDATE + "CompanyAssociation" +SET + "notificationIsActiveRevisionRequest" = true +WHERE + 'REVISION_REQUEST' :: "UserNotification" = ANY(notifications); + +UPDATE + "CompanyAssociation" +SET + "notificationIsActiveSignatureCodeRenewal" = true +WHERE + 'SIGNATURE_CODE_RENEWAL' :: "UserNotification" = ANY(notifications); + +ALTER TABLE + "CompanyAssociation" DROP COLUMN "notifications"; + +-- DropEnum +DROP TYPE "UserNotification"; \ No newline at end of file diff --git a/libs/back/prisma/src/schema.prisma b/libs/back/prisma/src/schema.prisma index 3360ccb515..6f461f0c7d 100644 --- a/libs/back/prisma/src/schema.prisma +++ b/libs/back/prisma/src/schema.prisma @@ -348,21 +348,6 @@ model AnonymousCompany { @@index([vatNumber], map: "_AnonymousCompanyVatNumberIdx") } -// Notifications auxquelles un utilisateur peut s'abonner pour -// un établissement donné -enum UserNotification { - // Notification de demande de rattachement - MEMBERSHIP_REQUEST - // Notification de renouvellement du code signature - SIGNATURE_CODE_RENEWAL - // Notifications en cas de refus total ou partiel d'un BSD - BSD_REFUSAL - // Notification lors de la modification de la destination finale amiante - BSDA_FINAL_DESTINATION_UPDATE - // Notification lors d'une demande de révision - REVISION_REQUEST -} - model CompanyAssociation { id String @id @default(cuid()) @db.VarChar(30) role UserRole @@ -374,8 +359,12 @@ model CompanyAssociation { // Tell apart automatically accepted invitations from others automaticallyAccepted Boolean @default(false) - // Abonnements aux notifications - notifications UserNotification[] + // Abonnements de l'utilisateur aux notifications pour cet établissement + notificationIsActiveMembershipRequest Boolean @default(false) + notificationIsActiveSignatureCodeRenewal Boolean @default(false) + notificationIsActiveBsdaFinalDestinationUpdate Boolean @default(false) + notificationIsActiveBsdRefusal Boolean @default(false) + notificationIsActiveRevisionRequest Boolean @default(false) @@index([userId], map: "_CompanyAssociationUserIdIdx") @@index([companyId], map: "_CompanyAssociationCompanyIdIdx") From 392da7f9cde8051c1d8aceb52be1f5361fce8afc Mon Sep 17 00:00:00 2001 From: Benoit Guigal Date: Fri, 18 Oct 2024 11:56:04 +0200 Subject: [PATCH 30/74] fix : integration tests --- .../onboarding.helpers.integration.ts | 65 +++++++++++++------ back/src/companies/__tests__/database.test.ts | 43 ------------ .../__tests__/renewSecurityCode.test.ts | 15 +++-- .../__tests__/markAsAccepted.integration.ts | 13 +++- .../users/__tests__/database.integration.ts | 2 +- back/src/users/notifications.ts | 10 +-- .../__tests__/changeUserRole.integration.ts | 4 +- .../sendMembershipRequest.integration.ts | 12 ++-- .../setCompanyNotifications.integration.ts | 32 +++++---- .../__tests__/myCompanies.integration.ts | 51 ++++++++++----- 10 files changed, 137 insertions(+), 110 deletions(-) delete mode 100644 back/src/companies/__tests__/database.test.ts diff --git a/apps/cron/src/commands/__tests__/onboarding.helpers.integration.ts b/apps/cron/src/commands/__tests__/onboarding.helpers.integration.ts index 316ecf648a..4aadd43ab1 100644 --- a/apps/cron/src/commands/__tests__/onboarding.helpers.integration.ts +++ b/apps/cron/src/commands/__tests__/onboarding.helpers.integration.ts @@ -309,7 +309,8 @@ describe("getPendingMembershipRequestsAndAssociatedMailSubscribers ", () => { await associateUserToCompany( admin02.id, companyAndAdmin0.company.orgId, - UserRole.ADMIN + UserRole.ADMIN, + { notificationIsActiveMembershipRequest: false } ); const companyAndAdmin1 = await userWithCompanyFactory("ADMIN"); @@ -411,24 +412,40 @@ describe("getPendingMembershipRequestsAndAssociatedMailSubscribers ", () => { expect(requests.length).toEqual(2); - expect( - requests.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime()) - ).toEqual([ - expect.objectContaining({ - id: request0.id, - company: expect.objectContaining({ - orgId: companyAndAdmin0.company.orgId - }), - user: expect.objectContaining({ email: user0.email }) + expect(requests.find(r => r.id === request0.id)).toMatchObject({ + id: request0.id, + company: expect.objectContaining({ + orgId: companyAndAdmin0.company.orgId }), - expect.objectContaining({ - id: request1.id, - company: expect.objectContaining({ - orgId: companyAndAdmin1.company.orgId - }), - user: expect.objectContaining({ email: user0.email }) - }) - ]); + user: expect.objectContaining({ email: user0.email }) + }); + + expect(requests.find(r => r.id == request1.id)).toMatchObject({ + id: request1.id, + company: expect.objectContaining({ + orgId: companyAndAdmin1.company.orgId + }), + user: expect.objectContaining({ email: user0.email }) + }); + + // expect( + // requests.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime()) + // ).toEqual([ + // expect.objectContaining({ + // id: request1.id, + // company: expect.objectContaining({ + // orgId: companyAndAdmin1.company.orgId + // }), + // user: expect.objectContaining({ email: user0.email }) + // }), + // expect.objectContaining({ + // id: request0.id, + // company: expect.objectContaining({ + // orgId: companyAndAdmin0.company.orgId + // }), + // user: expect.objectContaining({ email: user0.email }) + // }) + // ]); }); }); @@ -742,7 +759,9 @@ describe("getPendingBSDARevisionRequestsWithSubscribers", () => { // Given const { user, company } = await userWithCompanyFactory("ADMIN"); const user2 = await userFactory(); - await associateUserToCompany(user2.id, company.orgId, "ADMIN"); + await associateUserToCompany(user2.id, company.orgId, "ADMIN", { + notificationIsActiveRevisionRequest: false + }); const { company: companyOfSomeoneElse } = await userWithCompanyFactory( "ADMIN" ); @@ -1086,7 +1105,9 @@ describe("getPendingBSDDRevisionRequestsWithSubscribers", () => { // Given const { user, company } = await userWithCompanyFactory("ADMIN"); const user2 = await userFactory(); - await associateUserToCompany(user2.id, company.orgId, "ADMIN"); + await associateUserToCompany(user2.id, company.orgId, "ADMIN", { + notificationIsActiveRevisionRequest: false + }); const { company: companyOfSomeoneElse } = await userWithCompanyFactory( "ADMIN" ); @@ -1412,7 +1433,9 @@ describe("getPendingBSDARIRevisionRequestsWithSubscribers", () => { it("should not return non-subscribers from pending companies", async () => { const { user, company } = await userWithCompanyFactory("ADMIN"); const user2 = await userFactory(); - await associateUserToCompany(user2.id, company.orgId, "ADMIN"); + await associateUserToCompany(user2.id, company.orgId, "ADMIN", { + notificationIsActiveRevisionRequest: false + }); const { company: companyOfSomeoneElse } = await userWithCompanyFactory( "ADMIN" ); diff --git a/back/src/companies/__tests__/database.test.ts b/back/src/companies/__tests__/database.test.ts deleted file mode 100644 index 82ea50aa23..0000000000 --- a/back/src/companies/__tests__/database.test.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { getCompanyActiveUsers } from "../database"; - -const ASSOCIATIONS = [ - { - user: { - id: "1", - name: "Jane" - }, - role: "ADMIN" - }, - { - user: { - id: "2", - name: "John" - }, - role: "MEMBER" - } -]; - -jest.mock("@td/prisma", () => ({ - prisma: { - company: { - findUniqueOrThrow: jest.fn(() => ({ - companyAssociations: () => Promise.resolve(ASSOCIATIONS) - })) - } - } -})); - -describe("getCompanyActiveUsers", () => { - it("should return the company's active users with their role", async () => { - const users = await getCompanyActiveUsers("123"); - - expect(users).toEqual( - ASSOCIATIONS.map(association => ({ - ...association.user, - orgId: "123", - role: association.role, - isPendingInvitation: false - })) - ); - }); -}); diff --git a/back/src/companies/resolvers/mutations/__tests__/renewSecurityCode.test.ts b/back/src/companies/resolvers/mutations/__tests__/renewSecurityCode.test.ts index b3be2a952d..ed7816cbfb 100644 --- a/back/src/companies/resolvers/mutations/__tests__/renewSecurityCode.test.ts +++ b/back/src/companies/resolvers/mutations/__tests__/renewSecurityCode.test.ts @@ -2,6 +2,7 @@ import { renewSecurityCodeFn as renewSecurityCode } from "../renewSecurityCodeSe import { ErrorCode } from "../../../../common/errors"; import { renderMail, securityCodeRenewal } from "@td/mail"; import * as utils from "../../../../utils"; +import * as notifications from "../../../../users/notifications"; import { siretify } from "../../../../__tests__/factories"; const companyMock = jest.fn(); @@ -23,11 +24,17 @@ jest.mock("../../../../mailer/mailing", () => ({ sendMail: jest.fn((...args) => sendMailMock(...args)) })); -const getNotificationSubscribersMock = jest.fn(); +jest.mock("../../../../users/notifications", () => { + return { + __esModule: true, + ...jest.requireActual("../../../../users/notifications") + }; +}); -jest.mock("../../../../users/notifications", () => ({ - getNotificationSubscribers: jest.fn(() => getNotificationSubscribersMock()) -})); +const getNotificationSubscribersMock = jest.spyOn( + notifications, + "getNotificationSubscribers" +); describe("renewSecurityCode", () => { beforeEach(() => { diff --git a/back/src/forms/resolvers/mutations/__tests__/markAsAccepted.integration.ts b/back/src/forms/resolvers/mutations/__tests__/markAsAccepted.integration.ts index 9a017b5d15..362b872362 100644 --- a/back/src/forms/resolvers/mutations/__tests__/markAsAccepted.integration.ts +++ b/back/src/forms/resolvers/mutations/__tests__/markAsAccepted.integration.ts @@ -253,7 +253,9 @@ describe("Test Form reception", () => { // should not receive email const emitter3 = await userFactory(); - await associateUserToCompany(emitter3.id, emitterCompany.orgId, "ADMIN"); + await associateUserToCompany(emitter3.id, emitterCompany.orgId, "ADMIN", { + notificationIsActiveBsdRefusal: false + }); // should received email const recipient2 = await userFactory(); @@ -337,7 +339,9 @@ describe("Test Form reception", () => { // should not receive email const emitter3 = await userFactory(); - await associateUserToCompany(emitter3.id, emitterCompany.orgId, "ADMIN"); + await associateUserToCompany(emitter3.id, emitterCompany.orgId, "ADMIN", { + notificationIsActiveBsdRefusal: false + }); // should received email const recipient2 = await userFactory(); @@ -355,7 +359,10 @@ describe("Test Form reception", () => { await associateUserToCompany( recipient3.id, recipientCompany.orgId, - "ADMIN" + "ADMIN", + { + notificationIsActiveBsdRefusal: false + } ); await prisma.form.update({ diff --git a/back/src/users/__tests__/database.integration.ts b/back/src/users/__tests__/database.integration.ts index c19bbc8be7..be7d18db93 100644 --- a/back/src/users/__tests__/database.integration.ts +++ b/back/src/users/__tests__/database.integration.ts @@ -79,7 +79,7 @@ describe("associateUserToCompany", () => { const expectedNotifications = getDefaultNotifications(role); - expect(companyAssociation.notifications).toEqual(expectedNotifications); + expect(companyAssociation).toMatchObject(expectedNotifications); const userRoles = await getUserRoles(user.id); expect(userRoles).toEqual({ [company.orgId]: role }); diff --git a/back/src/users/notifications.ts b/back/src/users/notifications.ts index e314c4cff2..cbeb7a1168 100644 --- a/back/src/users/notifications.ts +++ b/back/src/users/notifications.ts @@ -11,15 +11,15 @@ import { safeInput } from "../common/converter"; // un établissement donné export enum UserNotification { // Notification de demande de rattachement - MEMBERSHIP_REQUEST, + MEMBERSHIP_REQUEST = "MEMBERSHIP_REQUEST", // Notification de renouvellement du code signature - SIGNATURE_CODE_RENEWAL, + SIGNATURE_CODE_RENEWAL = "SIGNATURE_CODE_RENEWAL", // Notifications en cas de refus total ou partiel d'un BSD - BSD_REFUSAL, + BSD_REFUSAL = "BSD_REFUSAL", // Notification lors de la modification de la destination finale amiante - BSDA_FINAL_DESTINATION_UPDATE, + BSDA_FINAL_DESTINATION_UPDATE = "BSDA_FINAL_DESTINATION_UPDATE", // Notification lors d'une demande de révision - REVISION_REQUEST + REVISION_REQUEST = "REVISION_REQUEST" } // Liste les champs qui permettent de contrôler les abonnements diff --git a/back/src/users/resolvers/mutations/__tests__/changeUserRole.integration.ts b/back/src/users/resolvers/mutations/__tests__/changeUserRole.integration.ts index b77628a3b6..eb0152fc7f 100644 --- a/back/src/users/resolvers/mutations/__tests__/changeUserRole.integration.ts +++ b/back/src/users/resolvers/mutations/__tests__/changeUserRole.integration.ts @@ -171,7 +171,9 @@ describe("mutation changeUserRole", () => { .companyAssociations(); expect(companyAssociations).toHaveLength(1); expect(companyAssociations[0].role).toEqual(role); - expect(companyAssociations[0]).toMatchObject(companyAssociations[0].role); + expect(companyAssociations[0]).toMatchObject( + getDefaultNotifications(companyAssociations[0].role) + ); } ); diff --git a/back/src/users/resolvers/mutations/__tests__/sendMembershipRequest.integration.ts b/back/src/users/resolvers/mutations/__tests__/sendMembershipRequest.integration.ts index 129fde9a1d..e7d08cf0f9 100644 --- a/back/src/users/resolvers/mutations/__tests__/sendMembershipRequest.integration.ts +++ b/back/src/users/resolvers/mutations/__tests__/sendMembershipRequest.integration.ts @@ -48,7 +48,7 @@ describe("mutation sendMembershipRequest", () => { expect(errors[0].message).toEqual("Vous n'êtes pas connecté."); }); - it("should send a request to all admins of the company and create a MembershipRequest record. Admins emails partially hidden.", async () => { + it("should send a request to all subscribers of the company and create a MembershipRequest record. Admins emails partially hidden.", async () => { const requester = await userFactory(); const admin = await userFactory({ email: "john.snow@trackdechets.fr", @@ -64,7 +64,9 @@ describe("mutation sendMembershipRequest", () => { notificationIsActiveMembershipRequest: true }); // this user should not receive the notification - await associateUserToCompany(admin2.id, company.orgId, "ADMIN"); + await associateUserToCompany(admin2.id, company.orgId, "ADMIN", { + notificationIsActiveMembershipRequest: false + }); const { mutate } = makeClient(requester); const { data } = await mutate>( SEND_MEMBERSHIP_REQUEST, @@ -125,7 +127,7 @@ describe("mutation sendMembershipRequest", () => { ); }); - it("should send a request to all admins of the company and create a MembershipRequest record. Admins emails shown.", async () => { + it("should send a request to all subscribers of the company and create a MembershipRequest record. Admins emails shown.", async () => { const userIndex = (await prisma.user.count()) + 1; const requester = await userFactory({ @@ -136,7 +138,9 @@ describe("mutation sendMembershipRequest", () => { createdAt: subMinutes(new Date(), 5) }); const company = await companyFactory(); - await associateUserToCompany(admin.id, company.orgId, "ADMIN"); + await associateUserToCompany(admin.id, company.orgId, "ADMIN", { + notificationIsActiveMembershipRequest: true + }); const { mutate } = makeClient(requester); const { data } = await mutate>( SEND_MEMBERSHIP_REQUEST, diff --git a/back/src/users/resolvers/mutations/__tests__/setCompanyNotifications.integration.ts b/back/src/users/resolvers/mutations/__tests__/setCompanyNotifications.integration.ts index 8473dd3233..e968ec9734 100644 --- a/back/src/users/resolvers/mutations/__tests__/setCompanyNotifications.integration.ts +++ b/back/src/users/resolvers/mutations/__tests__/setCompanyNotifications.integration.ts @@ -18,7 +18,13 @@ export const SET_COMPANY_NOTIFICATIONS = gql` setCompanyNotifications(input: $input) { id orgId - userNotifications + userNotifications { + membershipRequest + signatureCodeRenewal + bsdRefusal + bsdaFinalDestinationUpdate + revisionRequest + } } } `; @@ -75,7 +81,7 @@ describe("Mutation { setCompanyNotifications }", () => { const { mutate } = makeClient(user); - const newNotifications = [notification]; + const newNotifications = { [notification]: true }; const { data, errors } = await mutate< Pick, @@ -84,14 +90,14 @@ describe("Mutation { setCompanyNotifications }", () => { variables: { input: { companyOrgId: company.orgId, - notifications: { [notification]: true } + notifications: newNotifications } } }); expect(errors).toBeUndefined(); - expect(data.setCompanyNotifications.userNotifications).toEqual( + expect(data.setCompanyNotifications.userNotifications).toMatchObject( newNotifications ); @@ -124,7 +130,7 @@ describe("Mutation { setCompanyNotifications }", () => { const { mutate } = makeClient(user); - const newNotifications = [notification]; + const newNotifications = { [notification]: true }; const { data, errors } = await mutate< Pick, @@ -133,13 +139,13 @@ describe("Mutation { setCompanyNotifications }", () => { variables: { input: { companyOrgId: company.orgId, - notifications: { [notification]: true } + notifications: newNotifications } } }); expect(errors).toBeUndefined(); - expect(data.setCompanyNotifications.userNotifications).toEqual( + expect(data.setCompanyNotifications.userNotifications).toMatchObject( newNotifications ); @@ -172,7 +178,7 @@ describe("Mutation { setCompanyNotifications }", () => { const { mutate } = makeClient(user); - const newNotifications = [notification]; + const newNotifications = { [notification]: true }; const { data, errors } = await mutate< Pick, @@ -181,13 +187,13 @@ describe("Mutation { setCompanyNotifications }", () => { variables: { input: { companyOrgId: company.orgId, - notifications: { [notification]: true } + notifications: newNotifications } } }); expect(errors).toBeUndefined(); - expect(data.setCompanyNotifications.userNotifications).toEqual( + expect(data.setCompanyNotifications.userNotifications).toMatchObject( newNotifications ); @@ -219,7 +225,7 @@ describe("Mutation { setCompanyNotifications }", () => { const { mutate } = makeClient(user); - const newNotifications = [notification]; + const newNotifications = { [notification]: true }; const { data, errors } = await mutate< Pick, @@ -228,13 +234,13 @@ describe("Mutation { setCompanyNotifications }", () => { variables: { input: { companyOrgId: company.orgId, - notifications: { [notification]: true } + notifications: newNotifications } } }); expect(errors).toBeUndefined(); - expect(data.setCompanyNotifications.userNotifications).toEqual( + expect(data.setCompanyNotifications.userNotifications).toMatchObject( newNotifications ); diff --git a/back/src/users/resolvers/queries/__tests__/myCompanies.integration.ts b/back/src/users/resolvers/queries/__tests__/myCompanies.integration.ts index b886a8a4ea..f00ce23d8e 100644 --- a/back/src/users/resolvers/queries/__tests__/myCompanies.integration.ts +++ b/back/src/users/resolvers/queries/__tests__/myCompanies.integration.ts @@ -11,6 +11,7 @@ import { resetDatabase } from "../../../../../integration-tests/helper"; import { ErrorCode } from "../../../../common/errors"; import { AuthType } from "../../../../auth"; import { subDays } from "date-fns"; +import { membershipRequest } from "@td/mail"; const MY_COMPANIES = gql` query MyCompanies( @@ -48,7 +49,13 @@ const MY_COMPANIES = gql` } userRole userPermissions - userNotifications + userNotifications { + membershipRequest + signatureCodeRenewal + bsdRefusal + bsdaFinalDestinationUpdate + revisionRequest + } } } } @@ -472,14 +479,15 @@ describe("query { myCompanies }", () => { const company2 = await companyFactory(); const company3 = await companyFactory(); - await associateUserToCompany(user.id, company1.orgId, "ADMIN", { - notifications: ["MEMBERSHIP_REQUEST"] + await associateUserToCompany(user.id, company1.orgId, "MEMBER", { + notificationIsActiveMembershipRequest: true }); - await associateUserToCompany(user.id, company2.orgId, "ADMIN", { - notifications: ["BSD_REFUSAL"] + await associateUserToCompany(user.id, company2.orgId, "MEMBER", { + notificationIsActiveBsdRefusal: true }); - await associateUserToCompany(user.id, company3.orgId, "ADMIN", { - notifications: ["SIGNATURE_CODE_RENEWAL", "REVISION_REQUEST"] + await associateUserToCompany(user.id, company3.orgId, "MEMBER", { + notificationIsActiveSignatureCodeRenewal: true, + notificationIsActiveRevisionRequest: true }); const { query } = makeClient(user); const { data } = await query>(MY_COMPANIES); @@ -495,13 +503,26 @@ describe("query { myCompanies }", () => { {} ); - expect(userNotificationsByOrgId[company1.orgId]).toEqual([ - "MEMBERSHIP_REQUEST" - ]); - expect(userNotificationsByOrgId[company2.orgId]).toEqual(["BSD_REFUSAL"]); - expect(userNotificationsByOrgId[company3.orgId]).toEqual([ - "SIGNATURE_CODE_RENEWAL", - "REVISION_REQUEST" - ]); + expect(userNotificationsByOrgId[company1.orgId]).toMatchObject({ + membershipRequest: true, + bsdaFinalDestinationUpdate: false, + bsdRefusal: false, + revisionRequest: false, + signatureCodeRenewal: false + }); + expect(userNotificationsByOrgId[company2.orgId]).toEqual({ + membershipRequest: false, + bsdaFinalDestinationUpdate: false, + bsdRefusal: true, + revisionRequest: false, + signatureCodeRenewal: false + }); + expect(userNotificationsByOrgId[company3.orgId]).toEqual({ + membershipRequest: false, + bsdaFinalDestinationUpdate: false, + bsdRefusal: false, + revisionRequest: true, + signatureCodeRenewal: true + }); }); }); From ad9cb90c430f12f85b1226ca999cfd537fab4fa2 Mon Sep 17 00:00:00 2001 From: Benoit Guigal Date: Fri, 18 Oct 2024 14:08:31 +0200 Subject: [PATCH 31/74] fix(notifications) : fix front after refacto --- .../queries/__tests__/myCompanies.integration.ts | 1 - .../AccountNotifications/NotificationsDisplay.tsx | 11 ++++++----- .../AccountNotifications/NotificationsUpdateModal.tsx | 8 +++++++- .../src/Apps/Account/AccountNotifications/queries.ts | 8 +++++++- front/src/Apps/Companies/common/fragments.ts | 8 +++++++- 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/back/src/users/resolvers/queries/__tests__/myCompanies.integration.ts b/back/src/users/resolvers/queries/__tests__/myCompanies.integration.ts index f00ce23d8e..d724c6c408 100644 --- a/back/src/users/resolvers/queries/__tests__/myCompanies.integration.ts +++ b/back/src/users/resolvers/queries/__tests__/myCompanies.integration.ts @@ -11,7 +11,6 @@ import { resetDatabase } from "../../../../../integration-tests/helper"; import { ErrorCode } from "../../../../common/errors"; import { AuthType } from "../../../../auth"; import { subDays } from "date-fns"; -import { membershipRequest } from "@td/mail"; const MY_COMPANIES = gql` query MyCompanies( diff --git a/front/src/Apps/Account/AccountNotifications/NotificationsDisplay.tsx b/front/src/Apps/Account/AccountNotifications/NotificationsDisplay.tsx index e3ec094190..efe2988846 100644 --- a/front/src/Apps/Account/AccountNotifications/NotificationsDisplay.tsx +++ b/front/src/Apps/Account/AccountNotifications/NotificationsDisplay.tsx @@ -12,7 +12,7 @@ function getNotificationLabels(notifications: UserNotifications) { isActive: notifications.membershipRequest }, { value: "Code signature", isActive: notifications.signatureCodeRenewal }, - { label: "Refus", isActive: notifications.bsdRefusal }, + { value: "Refus", isActive: notifications.bsdRefusal }, { value: "Destination finale amiante", isActive: notifications.bsdaFinalDestinationUpdate @@ -29,11 +29,12 @@ export function NotificationsDisplay({ company }: AccountCompanyNotificationsProps) { if ( - Object.keys(company.userNotifications).every( - notification => !company.userNotifications[notification] + Object.keys(company.userNotifications).some( + notification => company.userNotifications[notification] === true ) ) { - return
    Désactivé
    ; + return
    {getNotificationLabels(company.userNotifications)}
    ; } - return
    {getNotificationLabels(company.userNotifications)}
    ; + + return
    Désactivé
    ; } diff --git a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateModal.tsx b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateModal.tsx index 96250053c4..b6b30102ec 100644 --- a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateModal.tsx +++ b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateModal.tsx @@ -29,7 +29,13 @@ type OptionLabel = { export const authorizedNotificationsByUserRole: { [key in UserRole]: (keyof UserNotifications)[]; } = { - [UserRole.Admin]: [], + [UserRole.Admin]: [ + "membershipRequest", + "revisionRequest", + "bsdRefusal", + "signatureCodeRenewal", + "bsdaFinalDestinationUpdate" + ], [UserRole.Member]: [ "revisionRequest", "bsdRefusal", diff --git a/front/src/Apps/Account/AccountNotifications/queries.ts b/front/src/Apps/Account/AccountNotifications/queries.ts index a8aa8bec31..aea8a2b345 100644 --- a/front/src/Apps/Account/AccountNotifications/queries.ts +++ b/front/src/Apps/Account/AccountNotifications/queries.ts @@ -5,7 +5,13 @@ export const SET_COMPANY_NOTIFICATIONS = gql` setCompanyNotifications(input: $input) { id orgId - userNotifications + userNotifications { + membershipRequest + signatureCodeRenewal + bsdRefusal + bsdaFinalDestinationUpdate + revisionRequest + } } } `; diff --git a/front/src/Apps/Companies/common/fragments.ts b/front/src/Apps/Companies/common/fragments.ts index 1f5621d81b..aae008f2b0 100644 --- a/front/src/Apps/Companies/common/fragments.ts +++ b/front/src/Apps/Companies/common/fragments.ts @@ -160,7 +160,13 @@ export const AccountCompanyInfoFragment = { naf libelleNaf userRole - userNotifications + userNotifications { + membershipRequest + signatureCodeRenewal + bsdRefusal + bsdaFinalDestinationUpdate + revisionRequest + } givenName ...AccountFieldCompanyTypesFragment ...AccountFieldCompanyGerepIdFragment From b8b6d8ec0eb02b2fee39e67bcb742de3e4183c6d Mon Sep 17 00:00:00 2001 From: Benoit Guigal Date: Fri, 18 Oct 2024 14:29:49 +0200 Subject: [PATCH 32/74] refacto(notifications) : setCompanyNotifications => subscribeToCompanyNotifications --- back/src/users/resolvers/Mutation.ts | 4 +- ...ribeToCompanyNotifications.integration.ts} | 78 ++++++++++--------- ....ts => subscribeToCompanyNotifications.ts} | 4 +- .../typeDefs/private/user.inputs.graphql | 14 +++- .../typeDefs/private/user.mutations.graphql | 13 +++- .../NotificationsUpdateModal.tsx | 15 ++-- .../Account/AccountNotifications/queries.ts | 8 +- 7 files changed, 80 insertions(+), 56 deletions(-) rename back/src/users/resolvers/mutations/__tests__/{setCompanyNotifications.integration.ts => subscribeToCompanyNotifications.integration.ts} (79%) rename back/src/users/resolvers/mutations/{setCompanyNotifications.ts => subscribeToCompanyNotifications.ts} (94%) diff --git a/back/src/users/resolvers/Mutation.ts b/back/src/users/resolvers/Mutation.ts index f86ecec4ef..25bf7d4716 100644 --- a/back/src/users/resolvers/Mutation.ts +++ b/back/src/users/resolvers/Mutation.ts @@ -19,7 +19,7 @@ import revokeAllAccessTokens from "./mutations/revokeAllAccessTokens"; import resetPassword from "./mutations/resetPassword"; import anonymizeUser from "./mutations/anonymizeUser"; import changeUserRole from "./mutations/changeUserRole"; -import setCompanyNotifications from "./mutations/setCompanyNotifications"; +import subscribeToCompanyNotifications from "./mutations/subscribeToCompanyNotifications"; const Mutation: MutationResolvers = { signup, @@ -42,7 +42,7 @@ const Mutation: MutationResolvers = { createAccessToken, revokeAllAccessTokens, changeUserRole, - setCompanyNotifications + subscribeToCompanyNotifications }; export default Mutation; diff --git a/back/src/users/resolvers/mutations/__tests__/setCompanyNotifications.integration.ts b/back/src/users/resolvers/mutations/__tests__/subscribeToCompanyNotifications.integration.ts similarity index 79% rename from back/src/users/resolvers/mutations/__tests__/setCompanyNotifications.integration.ts rename to back/src/users/resolvers/mutations/__tests__/subscribeToCompanyNotifications.integration.ts index e968ec9734..4cd9c901b0 100644 --- a/back/src/users/resolvers/mutations/__tests__/setCompanyNotifications.integration.ts +++ b/back/src/users/resolvers/mutations/__tests__/subscribeToCompanyNotifications.integration.ts @@ -7,15 +7,17 @@ import { import makeClient from "../../../../__tests__/testClient"; import { Mutation, - MutationSetCompanyNotificationsArgs + MutationSubscribeToCompanyNotificationsArgs } from "../../../../generated/graphql/types"; import { prisma } from "@td/prisma"; import { UserRole } from "@prisma/client"; import { toPrismaNotifications } from "../../../notifications"; -export const SET_COMPANY_NOTIFICATIONS = gql` - mutation SetCompanyNotifications($input: SetCompanyNotificationsInput!) { - setCompanyNotifications(input: $input) { +export const SUBSCRIBE_TO_COMPANY_NOTIFICATIONS = gql` + mutation SubscribeToCompanyNotifications( + $input: SubscribeToCompanyNotificationsInput! + ) { + subscribeToCompanyNotifications(input: $input) { id orgId userNotifications { @@ -37,7 +39,7 @@ const unactiveNotifications = { notificationIsActiveSignatureCodeRenewal: false }; -describe("Mutation { setCompanyNotifications }", () => { +describe("Mutation { subscribeToCompanyNotifications }", () => { test("Users who don't belong to company cannot subscribe to notifications", async () => { const user = await userFactory(); const company = await companyFactory(); @@ -45,9 +47,9 @@ describe("Mutation { setCompanyNotifications }", () => { const { mutate } = makeClient(user); const { errors } = await mutate< - Pick, - MutationSetCompanyNotificationsArgs - >(SET_COMPANY_NOTIFICATIONS, { + Pick, + MutationSubscribeToCompanyNotificationsArgs + >(SUBSCRIBE_TO_COMPANY_NOTIFICATIONS, { variables: { input: { companyOrgId: company.siret!, @@ -84,9 +86,9 @@ describe("Mutation { setCompanyNotifications }", () => { const newNotifications = { [notification]: true }; const { data, errors } = await mutate< - Pick, - MutationSetCompanyNotificationsArgs - >(SET_COMPANY_NOTIFICATIONS, { + Pick, + MutationSubscribeToCompanyNotificationsArgs + >(SUBSCRIBE_TO_COMPANY_NOTIFICATIONS, { variables: { input: { companyOrgId: company.orgId, @@ -97,9 +99,9 @@ describe("Mutation { setCompanyNotifications }", () => { expect(errors).toBeUndefined(); - expect(data.setCompanyNotifications.userNotifications).toMatchObject( - newNotifications - ); + expect( + data.subscribeToCompanyNotifications.userNotifications + ).toMatchObject(newNotifications); const updatedCompanyAssociation = await prisma.companyAssociation.findFirstOrThrow({ @@ -133,9 +135,9 @@ describe("Mutation { setCompanyNotifications }", () => { const newNotifications = { [notification]: true }; const { data, errors } = await mutate< - Pick, - MutationSetCompanyNotificationsArgs - >(SET_COMPANY_NOTIFICATIONS, { + Pick, + MutationSubscribeToCompanyNotificationsArgs + >(SUBSCRIBE_TO_COMPANY_NOTIFICATIONS, { variables: { input: { companyOrgId: company.orgId, @@ -145,9 +147,9 @@ describe("Mutation { setCompanyNotifications }", () => { }); expect(errors).toBeUndefined(); - expect(data.setCompanyNotifications.userNotifications).toMatchObject( - newNotifications - ); + expect( + data.subscribeToCompanyNotifications.userNotifications + ).toMatchObject(newNotifications); const updatedCompanyAssociation = await prisma.companyAssociation.findFirstOrThrow({ @@ -181,9 +183,9 @@ describe("Mutation { setCompanyNotifications }", () => { const newNotifications = { [notification]: true }; const { data, errors } = await mutate< - Pick, - MutationSetCompanyNotificationsArgs - >(SET_COMPANY_NOTIFICATIONS, { + Pick, + MutationSubscribeToCompanyNotificationsArgs + >(SUBSCRIBE_TO_COMPANY_NOTIFICATIONS, { variables: { input: { companyOrgId: company.orgId, @@ -193,9 +195,9 @@ describe("Mutation { setCompanyNotifications }", () => { }); expect(errors).toBeUndefined(); - expect(data.setCompanyNotifications.userNotifications).toMatchObject( - newNotifications - ); + expect( + data.subscribeToCompanyNotifications.userNotifications + ).toMatchObject(newNotifications); const updatedCompanyAssociation = await prisma.companyAssociation.findFirstOrThrow({ @@ -228,9 +230,9 @@ describe("Mutation { setCompanyNotifications }", () => { const newNotifications = { [notification]: true }; const { data, errors } = await mutate< - Pick, - MutationSetCompanyNotificationsArgs - >(SET_COMPANY_NOTIFICATIONS, { + Pick, + MutationSubscribeToCompanyNotificationsArgs + >(SUBSCRIBE_TO_COMPANY_NOTIFICATIONS, { variables: { input: { companyOrgId: company.orgId, @@ -240,9 +242,9 @@ describe("Mutation { setCompanyNotifications }", () => { }); expect(errors).toBeUndefined(); - expect(data.setCompanyNotifications.userNotifications).toMatchObject( - newNotifications - ); + expect( + data.subscribeToCompanyNotifications.userNotifications + ).toMatchObject(newNotifications); const updatedCompanyAssociation = await prisma.companyAssociation.findFirstOrThrow({ @@ -269,9 +271,9 @@ describe("Mutation { setCompanyNotifications }", () => { const { mutate } = makeClient(user); const { errors } = await mutate< - Pick, - MutationSetCompanyNotificationsArgs - >(SET_COMPANY_NOTIFICATIONS, { + Pick, + MutationSubscribeToCompanyNotificationsArgs + >(SUBSCRIBE_TO_COMPANY_NOTIFICATIONS, { variables: { input: { companyOrgId: company.orgId, @@ -300,9 +302,9 @@ describe("Mutation { setCompanyNotifications }", () => { const { mutate } = makeClient(user); const { errors } = await mutate< - Pick, - MutationSetCompanyNotificationsArgs - >(SET_COMPANY_NOTIFICATIONS, { + Pick, + MutationSubscribeToCompanyNotificationsArgs + >(SUBSCRIBE_TO_COMPANY_NOTIFICATIONS, { variables: { input: { companyOrgId: company.orgId, diff --git a/back/src/users/resolvers/mutations/setCompanyNotifications.ts b/back/src/users/resolvers/mutations/subscribeToCompanyNotifications.ts similarity index 94% rename from back/src/users/resolvers/mutations/setCompanyNotifications.ts rename to back/src/users/resolvers/mutations/subscribeToCompanyNotifications.ts index 76d5652ee4..9f4429aad5 100644 --- a/back/src/users/resolvers/mutations/setCompanyNotifications.ts +++ b/back/src/users/resolvers/mutations/subscribeToCompanyNotifications.ts @@ -43,7 +43,7 @@ function activeNotifications( .map(n => n.name); } -const setCompanyNotificationsResolver: MutationResolvers["setCompanyNotifications"] = +const subscribeToCompanyNotificationsResolver: MutationResolvers["subscribeToCompanyNotifications"] = async (parent, args, context: GraphQLContext) => { applyAuthStrategies(context, [AuthType.Session]); @@ -83,4 +83,4 @@ const setCompanyNotificationsResolver: MutationResolvers["setCompanyNotification return toGqlCompanyPrivate(updatedCompanyAssociation.company); }; -export default setCompanyNotificationsResolver; +export default subscribeToCompanyNotificationsResolver; diff --git a/back/src/users/typeDefs/private/user.inputs.graphql b/back/src/users/typeDefs/private/user.inputs.graphql index be1c12051c..7b98d3302f 100644 --- a/back/src/users/typeDefs/private/user.inputs.graphql +++ b/back/src/users/typeDefs/private/user.inputs.graphql @@ -52,12 +52,20 @@ input UserNotificationsInput { revisionRequest: Boolean } -input SetCompanyNotificationsInput { +input SubscribeToCompanyNotificationsInput { "Identifiant de l'établissement" companyOrgId: String! """ - Notifications auxquelles l'utilisateur souhaite être abonné pour l'établisement - identifié par le paramètre companyOrgId + Notifications auxquelles l'utilisateur souhaite s'abonner / se désabonner + pour l'établissement identifié par le paramètre companyOrgId + """ + notifications: UserNotificationsInput! +} + +input SubscribeToNotificationsInput { + """ + Notifications auxquelles l'utilisateur souhaite s'abonner / se désabonner + sur l'ensemble de ses établissement """ notifications: UserNotificationsInput! } diff --git a/back/src/users/typeDefs/private/user.mutations.graphql b/back/src/users/typeDefs/private/user.mutations.graphql index 8df876d8f7..bdd91f4676 100644 --- a/back/src/users/typeDefs/private/user.mutations.graphql +++ b/back/src/users/typeDefs/private/user.mutations.graphql @@ -123,5 +123,16 @@ type Mutation { Modifie les préfèrences d'abonnement de l'utilisateur connecté aux notifications d'un établissement donné """ - setCompanyNotifications(input: SetCompanyNotificationsInput!): CompanyPrivate! + subscribeToCompanyNotifications( + input: SubscribeToCompanyNotificationsInput! + ): CompanyPrivate! + + """ + USAGE INTERNE + Modifie les préfèrences d'abonnement de l'utilisateur connecté aux notifications + de tous ses établissements + """ + subscribeToNotifications( + input: SubscribeToNotificationsInput! + ): [CompanyPrivate!]! } diff --git a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateModal.tsx b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateModal.tsx index b6b30102ec..8da3b302fd 100644 --- a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateModal.tsx +++ b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateModal.tsx @@ -2,7 +2,7 @@ import React from "react"; import { CompanyPrivate, Mutation, - MutationSetCompanyNotificationsArgs, + MutationSubscribeToCompanyNotificationsArgs, UserNotifications, UserRole } from "@td/codegen-ui"; @@ -10,7 +10,7 @@ import { useForm } from "react-hook-form"; import Checkbox from "@codegouvfr/react-dsfr/Checkbox"; import Button from "@codegouvfr/react-dsfr/Button"; import { useMutation } from "@apollo/client"; -import { SET_COMPANY_NOTIFICATIONS } from "./queries"; +import { SUBSCRIBE_TO_COMPANY_NOTIFICATIONS } from "./queries"; import styles from "./NotificationsUpdateModal.module.scss"; type AccountCompanyNotificationsUpdateModalProps = { @@ -59,10 +59,11 @@ export default function NotificationsUpdateModal({ company, close }: AccountCompanyNotificationsUpdateModalProps) { - const [setCompanyNotifications, { loading, data, error }] = useMutation< - Pick, - MutationSetCompanyNotificationsArgs - >(SET_COMPANY_NOTIFICATIONS); + const [subscribeToCompanyNotifications, { loading, data, error }] = + useMutation< + Pick, + MutationSubscribeToCompanyNotificationsArgs + >(SUBSCRIBE_TO_COMPANY_NOTIFICATIONS); const authorizedNotifications = company.userRole ? authorizedNotificationsByUserRole[company.userRole] @@ -73,7 +74,7 @@ export default function NotificationsUpdateModal({ }); const onSubmit = async (data: UserNotifications) => { - const { errors } = await setCompanyNotifications({ + const { errors } = await subscribeToCompanyNotifications({ variables: { input: { companyOrgId: company.orgId, diff --git a/front/src/Apps/Account/AccountNotifications/queries.ts b/front/src/Apps/Account/AccountNotifications/queries.ts index aea8a2b345..234e778ab9 100644 --- a/front/src/Apps/Account/AccountNotifications/queries.ts +++ b/front/src/Apps/Account/AccountNotifications/queries.ts @@ -1,8 +1,10 @@ import gql from "graphql-tag"; -export const SET_COMPANY_NOTIFICATIONS = gql` - mutation SetCompanyNotifications($input: SetCompanyNotificationsInput!) { - setCompanyNotifications(input: $input) { +export const SUBSCRIBE_TO_COMPANY_NOTIFICATIONS = gql` + mutation SubscribeToCompanyNotifications( + $input: SubscribeToCompanyNotificationsInput! + ) { + subscribeToCompanyNotifications(input: $input) { id orgId userNotifications { From 8e7b17a7cfacfb333af387149a11c72b5fc8f089 Mon Sep 17 00:00:00 2001 From: Benoit Guigal Date: Fri, 18 Oct 2024 16:25:59 +0200 Subject: [PATCH 33/74] =?UTF-8?q?feat(subscribeToNotifications)=20:=20ajou?= =?UTF-8?q?t=20d'une=20mutation=20permettant=20de=20s'abonner=20/=20se=20d?= =?UTF-8?q?=C3=A9sabonner=20=C3=A0=20un=20ou=20plusieurs=20types=20de=20no?= =?UTF-8?q?tifications=20pour=20l'ensemble=20de=20ses=20=C3=A9tablissement?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- back/src/users/notifications.ts | 40 ++++++- back/src/users/resolvers/Mutation.ts | 4 +- .../subscribeToNotifications.integration.ts | 111 ++++++++++++++++++ .../subscribeToCompanyNotifications.ts | 7 +- .../mutations/subscribeToNotifications.ts | 60 ++++++++++ .../AccountNotifications.tsx | 11 +- .../NotificationsUpdateAllButton.tsx | 16 ++- .../NotificationsUpdateAllModal.module.scss | 10 ++ .../NotificationsUpdateAllModal.tsx | 95 ++++++++++++++- .../Account/AccountNotifications/queries.ts | 16 +++ 10 files changed, 354 insertions(+), 16 deletions(-) create mode 100644 back/src/users/resolvers/mutations/__tests__/subscribeToNotifications.integration.ts create mode 100644 back/src/users/resolvers/mutations/subscribeToNotifications.ts create mode 100644 front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.module.scss diff --git a/back/src/users/notifications.ts b/back/src/users/notifications.ts index cbeb7a1168..7fc01d905a 100644 --- a/back/src/users/notifications.ts +++ b/back/src/users/notifications.ts @@ -51,6 +51,21 @@ export const notificationToPrismaField: { "notificationIsActiveBsdaFinalDestinationUpdate" }; +/** + * Construit un mapping entre les champs booléans du type + * GraphQL `UserNotifications` et les types de notifications + * définies en tant qu'enum dans le code + */ +export const gqlFieldToNotification: { + [key in keyof GqlNotifications]: UserNotification; +} = { + membershipRequest: UserNotification.MEMBERSHIP_REQUEST, + signatureCodeRenewal: UserNotification.SIGNATURE_CODE_RENEWAL, + bsdRefusal: UserNotification.BSD_REFUSAL, + revisionRequest: UserNotification.REVISION_REQUEST, + bsdaFinalDestinationUpdate: UserNotification.BSDA_FINAL_DESTINATION_UPDATE +}; + /** * Renvoie les notififications auxquelles un utilisateur est abonné par * défaut lorsqu'il rejoint un établissement ou change de rôle @@ -107,7 +122,7 @@ export function toPrismaNotifications( // if you modify this structure, please modify // in front/src/common/notifications -export const authorizedNotifications = { +export const authorizedNotificationsByRole = { [UserRole.ADMIN]: [ UserNotification.MEMBERSHIP_REQUEST, UserNotification.REVISION_REQUEST, @@ -127,13 +142,34 @@ export const authorizedNotifications = { UserNotification.SIGNATURE_CODE_RENEWAL, UserNotification.BSDA_FINAL_DESTINATION_UPDATE ], - DRIVER: [ + [UserRole.DRIVER]: [ UserNotification.BSD_REFUSAL, UserNotification.SIGNATURE_CODE_RENEWAL, UserNotification.BSDA_FINAL_DESTINATION_UPDATE ] }; +// Inverse la structure précédente afin de renvoyer +// pour chaque notification les rôles autorisés +export const authorizedRolesByNotification: { + [key in UserNotification]: UserRole[]; +} = Object.entries(authorizedNotificationsByRole).reduce( + (inverted, [role, notifications]) => { + notifications.forEach(notification => { + // Si la notification n'existe pas encore dans le mapping inversé, l'initialiser + if (!inverted[notification]) { + inverted[notification] = []; + } + // Ajouter le rôle à la liste des rôles autorisés pour cette notification + inverted[notification].push(role as UserRole); + }); + return inverted; + }, + {} as { + [key in UserNotification]: UserRole[]; + } +); + // Récupère la liste des des utilisateurs abonnés à un type // de notification donnée au sein d'un ou plusieurs établissements export async function getNotificationSubscribers( diff --git a/back/src/users/resolvers/Mutation.ts b/back/src/users/resolvers/Mutation.ts index 25bf7d4716..828841d245 100644 --- a/back/src/users/resolvers/Mutation.ts +++ b/back/src/users/resolvers/Mutation.ts @@ -20,6 +20,7 @@ import resetPassword from "./mutations/resetPassword"; import anonymizeUser from "./mutations/anonymizeUser"; import changeUserRole from "./mutations/changeUserRole"; import subscribeToCompanyNotifications from "./mutations/subscribeToCompanyNotifications"; +import subscribeToNotifications from "./mutations/subscribeToNotifications"; const Mutation: MutationResolvers = { signup, @@ -42,7 +43,8 @@ const Mutation: MutationResolvers = { createAccessToken, revokeAllAccessTokens, changeUserRole, - subscribeToCompanyNotifications + subscribeToCompanyNotifications, + subscribeToNotifications }; export default Mutation; diff --git a/back/src/users/resolvers/mutations/__tests__/subscribeToNotifications.integration.ts b/back/src/users/resolvers/mutations/__tests__/subscribeToNotifications.integration.ts new file mode 100644 index 0000000000..c136d9eaf2 --- /dev/null +++ b/back/src/users/resolvers/mutations/__tests__/subscribeToNotifications.integration.ts @@ -0,0 +1,111 @@ +import { + Mutation, + MutationSubscribeToNotificationsArgs, + UserNotifications +} from "@td/codegen-ui"; +import { companyFactory, userFactory } from "../../../../__tests__/factories"; +import { associateUserToCompany } from "../../../database"; +import { Prisma } from "@prisma/client"; +import gql from "graphql-tag"; +import makeClient from "../../../../__tests__/testClient"; +import { prisma } from "@td/prisma"; +import { toPrismaNotifications } from "../../../notifications"; + +export const SUBSCRIBE_TO_NOTIFICATIONS = gql` + mutation SubscribeToNotifications($input: SubscribeToNotificationsInput!) { + subscribeToNotifications(input: $input) { + id + orgId + userNotifications { + membershipRequest + signatureCodeRenewal + bsdRefusal + bsdaFinalDestinationUpdate + revisionRequest + } + } + } +`; + +const allUnsubscribedPrisma: Partial = { + notificationIsActiveBsdaFinalDestinationUpdate: false, + notificationIsActiveBsdRefusal: false, + notificationIsActiveMembershipRequest: false, + notificationIsActiveRevisionRequest: false, + notificationIsActiveSignatureCodeRenewal: false +}; + +const allUnsubscribedGql: UserNotifications = { + membershipRequest: false, + signatureCodeRenewal: false, + bsdRefusal: false, + bsdaFinalDestinationUpdate: false, + revisionRequest: false +}; + +const allNotifications = Object.keys(allUnsubscribedGql); + +describe("mutation { subscribeToNotifications }", () => { + it.each(allNotifications)( + "should activate notification %p for all user companies", + async notification => { + const user = await userFactory(); + const company1 = await companyFactory(); + const company2 = await companyFactory(); + + const companyAssociation1 = await associateUserToCompany( + user.id, + company1.orgId, + "ADMIN", + allUnsubscribedPrisma + ); + + const companyAssociation2 = await associateUserToCompany( + user.id, + company2.orgId, + "ADMIN", + allUnsubscribedPrisma + ); + + const { mutate } = makeClient(user); + + const update = { [notification]: true }; + + const { errors, data } = await mutate< + Pick, + MutationSubscribeToNotificationsArgs + >(SUBSCRIBE_TO_NOTIFICATIONS, { + variables: { input: { notifications: update } } + }); + + expect(errors).toBeUndefined(); + + for (const company of data.subscribeToNotifications) { + expect(company.userNotifications).toEqual({ + ...allUnsubscribedGql, + [notification]: true + }); + } + + const updatedCompanyAssociation1 = + await prisma.companyAssociation.findUniqueOrThrow({ + where: { id: companyAssociation1.id } + }); + + const updatedCompanyAssociation2 = + await prisma.companyAssociation.findUniqueOrThrow({ + where: { id: companyAssociation2.id } + }); + + expect(updatedCompanyAssociation1).toMatchObject({ + ...allUnsubscribedPrisma, + ...toPrismaNotifications(update) + }); + + expect(updatedCompanyAssociation2).toMatchObject({ + ...allUnsubscribedPrisma, + ...toPrismaNotifications(update) + }); + } + ); +}); diff --git a/back/src/users/resolvers/mutations/subscribeToCompanyNotifications.ts b/back/src/users/resolvers/mutations/subscribeToCompanyNotifications.ts index 9f4429aad5..3eafa07dc2 100644 --- a/back/src/users/resolvers/mutations/subscribeToCompanyNotifications.ts +++ b/back/src/users/resolvers/mutations/subscribeToCompanyNotifications.ts @@ -8,7 +8,7 @@ import { MutationResolvers } from "../../../generated/graphql/types"; import { prisma } from "@td/prisma"; import { toGqlCompanyPrivate } from "../../../companies/converters"; import { - authorizedNotifications, + authorizedNotificationsByRole, toPrismaNotifications, UserNotification } from "../../notifications"; @@ -65,7 +65,9 @@ const subscribeToCompanyNotificationsResolver: MutationResolvers["subscribeToCom const unauthorizedNotifications = subscribeTo.filter( notification => - !authorizedNotifications[companyAssociation.role].includes(notification) + !authorizedNotificationsByRole[companyAssociation.role].includes( + notification + ) ); if (unauthorizedNotifications.length) { @@ -83,4 +85,5 @@ const subscribeToCompanyNotificationsResolver: MutationResolvers["subscribeToCom return toGqlCompanyPrivate(updatedCompanyAssociation.company); }; + export default subscribeToCompanyNotificationsResolver; diff --git a/back/src/users/resolvers/mutations/subscribeToNotifications.ts b/back/src/users/resolvers/mutations/subscribeToNotifications.ts new file mode 100644 index 0000000000..3de587a626 --- /dev/null +++ b/back/src/users/resolvers/mutations/subscribeToNotifications.ts @@ -0,0 +1,60 @@ +import { GraphQLContext } from "../../../types"; +import { applyAuthStrategies, AuthType } from "../../../auth"; +import { checkIsAuthenticated } from "../../../common/permissions"; +import { MutationResolvers } from "../../../generated/graphql/types"; +import { prisma } from "@td/prisma"; +import { + authorizedRolesByNotification, + gqlFieldToNotification, + toPrismaNotifications +} from "../../notifications"; +import { toGqlCompanyPrivate } from "../../../companies/converters"; + +const subscribeToNotificationsResolver: MutationResolvers["subscribeToNotifications"] = + async (parent, args, context: GraphQLContext) => { + applyAuthStrategies(context, [AuthType.Session]); + + const user = checkIsAuthenticated(context); + + const { notifications } = args.input; + + for (const [notification, isActive] of Object.entries(notifications)) { + if (isActive === null || isActive === undefined) { + // ne fait rien si isActive est `null` ou `undefined + return; + } + + const data = toPrismaNotifications({ [notification]: isActive }); + + if (isActive === true) { + await prisma.companyAssociation.updateMany({ + where: { + userId: user.id, + role: { + // on active la notification uniquement sur les + // établissements sur lesquelles l'utilisateur à un + // rôle qui le lui permet + in: authorizedRolesByNotification[ + gqlFieldToNotification[notification] + ] + } + }, + data + }); + } else if (isActive === false) { + await prisma.companyAssociation.updateMany({ + where: { userId: user.id }, + data + }); + } + } + + const companyAssociations = await prisma.companyAssociation.findMany({ + where: { userId: user.id }, + include: { company: true } + }); + + return companyAssociations.map(a => toGqlCompanyPrivate(a.company)); + }; + +export default subscribeToNotificationsResolver; diff --git a/front/src/Apps/Account/AccountNotifications/AccountNotifications.tsx b/front/src/Apps/Account/AccountNotifications/AccountNotifications.tsx index 2d71d8a8d7..688655700f 100644 --- a/front/src/Apps/Account/AccountNotifications/AccountNotifications.tsx +++ b/front/src/Apps/Account/AccountNotifications/AccountNotifications.tsx @@ -6,6 +6,7 @@ import NotificationsUpdateButton from "./NotificationsUpdateButton"; import SearchableCompaniesList from "../../Companies/CompaniesList/SearchableCompaniesList"; import Alert from "@codegouvfr/react-dsfr/Alert"; import styles from "./AccountNotifications.module.scss"; +import NotificationsUpdateAllButton from "./NotificationsUpdateAllButton"; const alertDescription = "Il est impératif de veiller à ce qu'au moins un membre de vos établissements" + @@ -32,7 +33,7 @@ export default function AccountNotifications() { {/* Liste paginée des établissements avec un bouton "Charger plus" et une barre de recherche */} ( + renderCompanies={(companies, totalCount) => (
    [ @@ -42,7 +43,13 @@ export default function AccountNotifications() { ])} - headers={["Établissements", "Notifications", ""]} + headers={[ + "Établissements", + "Notifications", +
    + +
    + ]} /> )} /> diff --git a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllButton.tsx b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllButton.tsx index 71c7a9aab5..736d9c1a26 100644 --- a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllButton.tsx +++ b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllButton.tsx @@ -18,11 +18,19 @@ export default function NotificationsUpdateAllButton({ return ( <> - - + + - ); diff --git a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.module.scss b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.module.scss new file mode 100644 index 0000000000..af6633adfc --- /dev/null +++ b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.module.scss @@ -0,0 +1,10 @@ +.buttons { + display: flex; + justify-content: right; + gap: 15px; +} + + +legend { + margin-bottom: 0.5em; +} \ No newline at end of file diff --git a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.tsx b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.tsx index b6b650418a..bb32e71860 100644 --- a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.tsx +++ b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.tsx @@ -1,17 +1,102 @@ +import { useMutation } from "@apollo/client"; +import { Mutation, MutationSubscribeToNotificationsArgs } from "@td/codegen-ui"; import React from "react"; +import { SUBSCRIBE_TO_NOTIFICATIONS } from "./queries"; +import { useForm } from "react-hook-form"; +import Button from "@codegouvfr/react-dsfr/Button"; +import RadioButtons from "@codegouvfr/react-dsfr/RadioButtons"; +import styles from "./NotificationsUpdateAllModal.module.scss"; type AccountNotificationsUpdateAllModalProps = { // nombre total d'établissements totalCount: number; + close: () => void; +}; + +enum SubscribeAction { + DoNothing = "DoNothing", + Subscribe = "Subscribe", + Unsuscribe = "Unsubscribe" +} + +type FormValues = { + membershipRequest: SubscribeAction; }; export default function AccountNotificationsUpdateAllModal({ - totalCount + totalCount, + close }: AccountNotificationsUpdateAllModalProps) { + const [subscribeToNotifications, { loading, data, error }] = useMutation< + Pick, + MutationSubscribeToNotificationsArgs + >(SUBSCRIBE_TO_NOTIFICATIONS); + + const { register, handleSubmit, reset } = useForm({ + defaultValues: { membershipRequest: SubscribeAction.DoNothing } + }); + + const onSubmit = async (data: FormValues) => { + console.log(data); + }; + return ( -
    - {/* TODO implémenter les actions en masse dans cette modale */} - Mise à jour en masse de {totalCount} établissements -
    + <> +
    + Le formulaire suivant permet de s'abonner ou se désabonner aux + notifications de différents types pour l'ensemble de vos {totalCount}{" "} + établissements, à l'exception de ceux pour lesquelles votre rôle ne le + permet pas +
    +
    +
    + +
    +
    + + +
    + + ); } diff --git a/front/src/Apps/Account/AccountNotifications/queries.ts b/front/src/Apps/Account/AccountNotifications/queries.ts index 234e778ab9..becd94e4ee 100644 --- a/front/src/Apps/Account/AccountNotifications/queries.ts +++ b/front/src/Apps/Account/AccountNotifications/queries.ts @@ -17,3 +17,19 @@ export const SUBSCRIBE_TO_COMPANY_NOTIFICATIONS = gql` } } `; + +export const SUBSCRIBE_TO_NOTIFICATIONS = gql` + mutation SubscribeToNotifications($input: SubscribeToNotificationsInput!) { + subscribeToNotifications(input: $input) { + id + orgId + userNotifications { + membershipRequest + signatureCodeRenewal + bsdRefusal + bsdaFinalDestinationUpdate + revisionRequest + } + } + } +`; From 52b31563bd48e22e068b948827497edc4a49bc2d Mon Sep 17 00:00:00 2001 From: Benoit Guigal Date: Tue, 22 Oct 2024 10:53:27 +0200 Subject: [PATCH 34/74] feat(notifications) : call mutation from the front. Add integrations tests --- .../subscribeToNotifications.integration.ts | 384 +++++++++++++++--- .../mutations/subscribeToNotifications.ts | 5 - .../NotificationsUpdateAllModal.module.scss | 3 +- .../NotificationsUpdateAllModal.tsx | 158 +++++-- .../NotificationsUpdateModal.tsx | 20 +- .../Account/AccountNotifications/utils.ts | 18 + 6 files changed, 475 insertions(+), 113 deletions(-) create mode 100644 front/src/Apps/Account/AccountNotifications/utils.ts diff --git a/back/src/users/resolvers/mutations/__tests__/subscribeToNotifications.integration.ts b/back/src/users/resolvers/mutations/__tests__/subscribeToNotifications.integration.ts index c136d9eaf2..8a882fa59a 100644 --- a/back/src/users/resolvers/mutations/__tests__/subscribeToNotifications.integration.ts +++ b/back/src/users/resolvers/mutations/__tests__/subscribeToNotifications.integration.ts @@ -9,7 +9,6 @@ import { Prisma } from "@prisma/client"; import gql from "graphql-tag"; import makeClient from "../../../../__tests__/testClient"; import { prisma } from "@td/prisma"; -import { toPrismaNotifications } from "../../../notifications"; export const SUBSCRIBE_TO_NOTIFICATIONS = gql` mutation SubscribeToNotifications($input: SubscribeToNotificationsInput!) { @@ -27,6 +26,22 @@ export const SUBSCRIBE_TO_NOTIFICATIONS = gql` } `; +const allSubscribedPrisma: Partial = { + notificationIsActiveBsdaFinalDestinationUpdate: true, + notificationIsActiveBsdRefusal: true, + notificationIsActiveMembershipRequest: true, + notificationIsActiveRevisionRequest: true, + notificationIsActiveSignatureCodeRenewal: true +}; + +const allSubscribedGql: UserNotifications = { + membershipRequest: true, + signatureCodeRenewal: true, + bsdRefusal: true, + bsdaFinalDestinationUpdate: true, + revisionRequest: true +}; + const allUnsubscribedPrisma: Partial = { notificationIsActiveBsdaFinalDestinationUpdate: false, notificationIsActiveBsdRefusal: false, @@ -43,69 +58,328 @@ const allUnsubscribedGql: UserNotifications = { revisionRequest: false }; -const allNotifications = Object.keys(allUnsubscribedGql); - describe("mutation { subscribeToNotifications }", () => { - it.each(allNotifications)( - "should activate notification %p for all user companies", - async notification => { - const user = await userFactory(); - const company1 = await companyFactory(); - const company2 = await companyFactory(); - - const companyAssociation1 = await associateUserToCompany( - user.id, - company1.orgId, - "ADMIN", - allUnsubscribedPrisma - ); - - const companyAssociation2 = await associateUserToCompany( - user.id, - company2.orgId, - "ADMIN", - allUnsubscribedPrisma - ); - - const { mutate } = makeClient(user); - - const update = { [notification]: true }; - - const { errors, data } = await mutate< - Pick, - MutationSubscribeToNotificationsArgs - >(SUBSCRIBE_TO_NOTIFICATIONS, { - variables: { input: { notifications: update } } + it("should activate notification for all user companies if user role authorize it", async () => { + const user = await userFactory(); + const company1 = await companyFactory(); + const company2 = await companyFactory(); + + const companyAssociation1 = await associateUserToCompany( + user.id, + company1.orgId, + "ADMIN", + allUnsubscribedPrisma + ); + + const companyAssociation2 = await associateUserToCompany( + user.id, + company2.orgId, + "ADMIN", + allUnsubscribedPrisma + ); + + expect(companyAssociation1).toMatchObject(allUnsubscribedPrisma); + expect(companyAssociation2).toMatchObject(allUnsubscribedPrisma); + + const { mutate } = makeClient(user); + + const { errors, data } = await mutate< + Pick, + MutationSubscribeToNotificationsArgs + >(SUBSCRIBE_TO_NOTIFICATIONS, { + variables: { input: { notifications: allSubscribedGql } } + }); + + expect(errors).toBeUndefined(); + + for (const company of data.subscribeToNotifications) { + expect(company.userNotifications).toEqual(allSubscribedGql); + } + + const updatedCompanyAssociation1 = + await prisma.companyAssociation.findUniqueOrThrow({ + where: { id: companyAssociation1.id } }); - expect(errors).toBeUndefined(); + const updatedCompanyAssociation2 = + await prisma.companyAssociation.findUniqueOrThrow({ + where: { id: companyAssociation2.id } + }); - for (const company of data.subscribeToNotifications) { - expect(company.userNotifications).toEqual({ - ...allUnsubscribedGql, - [notification]: true - }); - } + expect(updatedCompanyAssociation1).toMatchObject(allSubscribedPrisma); + + expect(updatedCompanyAssociation2).toMatchObject(allSubscribedPrisma); + }); + + it("should deactivate notifications for all user companies", async () => { + const user = await userFactory(); + const company1 = await companyFactory(); + const company2 = await companyFactory(); + + const companyAssociation1 = await associateUserToCompany( + user.id, + company1.orgId, + "ADMIN", + allSubscribedPrisma + ); + + const companyAssociation2 = await associateUserToCompany( + user.id, + company2.orgId, + "ADMIN", + allSubscribedPrisma + ); + + expect(companyAssociation1).toMatchObject(allSubscribedPrisma); + expect(companyAssociation2).toMatchObject(allSubscribedPrisma); + + const { mutate } = makeClient(user); - const updatedCompanyAssociation1 = - await prisma.companyAssociation.findUniqueOrThrow({ - where: { id: companyAssociation1.id } - }); + const { errors, data } = await mutate< + Pick, + MutationSubscribeToNotificationsArgs + >(SUBSCRIBE_TO_NOTIFICATIONS, { + variables: { input: { notifications: allUnsubscribedGql } } + }); - const updatedCompanyAssociation2 = - await prisma.companyAssociation.findUniqueOrThrow({ - where: { id: companyAssociation2.id } - }); + expect(errors).toBeUndefined(); - expect(updatedCompanyAssociation1).toMatchObject({ - ...allUnsubscribedPrisma, - ...toPrismaNotifications(update) + for (const company of data.subscribeToNotifications) { + expect(company.userNotifications).toEqual(allUnsubscribedGql); + } + + const updatedCompanyAssociation1 = + await prisma.companyAssociation.findUniqueOrThrow({ + where: { id: companyAssociation1.id } }); - expect(updatedCompanyAssociation2).toMatchObject({ - ...allUnsubscribedPrisma, - ...toPrismaNotifications(update) + const updatedCompanyAssociation2 = + await prisma.companyAssociation.findUniqueOrThrow({ + where: { id: companyAssociation2.id } }); + + expect(updatedCompanyAssociation1).toMatchObject(allUnsubscribedPrisma); + + expect(updatedCompanyAssociation2).toMatchObject(allUnsubscribedPrisma); + }); + + it("should not update notifications if input is empty", async () => { + const user = await userFactory(); + const company1 = await companyFactory(); + const company2 = await companyFactory(); + + const companyAssociation1 = await associateUserToCompany( + user.id, + company1.orgId, + "ADMIN", + allUnsubscribedPrisma + ); + + const companyAssociation2 = await associateUserToCompany( + user.id, + company2.orgId, + "ADMIN", + allUnsubscribedPrisma + ); + + expect(companyAssociation1).toMatchObject(allUnsubscribedPrisma); + expect(companyAssociation2).toMatchObject(allUnsubscribedPrisma); + + const { mutate } = makeClient(user); + + const { errors, data } = await mutate< + Pick, + MutationSubscribeToNotificationsArgs + >(SUBSCRIBE_TO_NOTIFICATIONS, { + variables: { input: { notifications: {} } } + }); + + expect(errors).toBeUndefined(); + + for (const company of data.subscribeToNotifications) { + expect(company.userNotifications).toEqual(allUnsubscribedGql); } - ); + + const updatedCompanyAssociation1 = + await prisma.companyAssociation.findUniqueOrThrow({ + where: { id: companyAssociation1.id } + }); + + const updatedCompanyAssociation2 = + await prisma.companyAssociation.findUniqueOrThrow({ + where: { id: companyAssociation2.id } + }); + + expect(updatedCompanyAssociation1).toMatchObject(allUnsubscribedPrisma); + + expect(updatedCompanyAssociation2).toMatchObject(allUnsubscribedPrisma); + }); + + it("should not subscribe to notifications for companies where role does not allow it", async () => { + const user = await userFactory(); + const company1 = await companyFactory(); + const company2 = await companyFactory(); + + const companyAssociation1 = await associateUserToCompany( + user.id, + company1.orgId, + "DRIVER", + allUnsubscribedPrisma + ); + + const companyAssociation2 = await associateUserToCompany( + user.id, + company2.orgId, + "DRIVER", + allUnsubscribedPrisma + ); + + expect(companyAssociation1).toMatchObject(allUnsubscribedPrisma); + expect(companyAssociation2).toMatchObject(allUnsubscribedPrisma); + + const { mutate } = makeClient(user); + + const { errors, data } = await mutate< + Pick, + MutationSubscribeToNotificationsArgs + >(SUBSCRIBE_TO_NOTIFICATIONS, { + variables: { input: { notifications: allSubscribedGql } } + }); + + expect(errors).toBeUndefined(); + + for (const company of data.subscribeToNotifications) { + expect(company.userNotifications).toEqual({ + ...allSubscribedGql, + // Les notifications suivantes ne sont pas autorisées pour un rôle Chauffeur + // Leurs valeurs est donc inchangées + membershipRequest: false, + revisionRequest: false + }); + } + + const updatedCompanyAssociation1 = + await prisma.companyAssociation.findUniqueOrThrow({ + where: { id: companyAssociation1.id } + }); + + const updatedCompanyAssociation2 = + await prisma.companyAssociation.findUniqueOrThrow({ + where: { id: companyAssociation2.id } + }); + + const expected = { + ...allSubscribedPrisma, + // Les notifications suivantes ne sont pas autorisées pour un rôle Chauffeur + // Leurs valeurs est donc inchangées + notificationIsActiveMembershipRequest: false, + notificationIsActiveRevisionRequest: false + }; + + expect(updatedCompanyAssociation1).toMatchObject(expected); + + expect(updatedCompanyAssociation2).toMatchObject(expected); + }); + + it("should not subscribe other users", async () => { + const user1 = await userFactory(); + const user2 = await userFactory(); + + const company1 = await companyFactory(); + const company2 = await companyFactory(); + + const companyAssociation1 = await associateUserToCompany( + user1.id, + company1.orgId, + "ADMIN", + allUnsubscribedPrisma + ); + + const companyAssociation2 = await associateUserToCompany( + user2.id, + company2.orgId, + "ADMIN", + allUnsubscribedPrisma + ); + + expect(companyAssociation1).toMatchObject(allUnsubscribedPrisma); + expect(companyAssociation2).toMatchObject(allUnsubscribedPrisma); + + const { mutate } = makeClient(user1); + + const { errors } = await mutate< + Pick, + MutationSubscribeToNotificationsArgs + >(SUBSCRIBE_TO_NOTIFICATIONS, { + variables: { input: { notifications: allSubscribedGql } } + }); + + expect(errors).toBeUndefined(); + + const updatedCompanyAssociation1 = + await prisma.companyAssociation.findUniqueOrThrow({ + where: { id: companyAssociation1.id } + }); + + const updatedCompanyAssociation2 = + await prisma.companyAssociation.findUniqueOrThrow({ + where: { id: companyAssociation2.id } + }); + + expect(updatedCompanyAssociation1).toMatchObject(allSubscribedPrisma); + + // Les notifications de l'utilisateur 2 ne sont pas impactées + expect(updatedCompanyAssociation2).toMatchObject(allUnsubscribedPrisma); + }); + + it("should not unsubscribe other users", async () => { + const user1 = await userFactory(); + const user2 = await userFactory(); + + const company1 = await companyFactory(); + const company2 = await companyFactory(); + + const companyAssociation1 = await associateUserToCompany( + user1.id, + company1.orgId, + "ADMIN", + allSubscribedPrisma + ); + + const companyAssociation2 = await associateUserToCompany( + user2.id, + company2.orgId, + "ADMIN", + allSubscribedPrisma + ); + + expect(companyAssociation1).toMatchObject(allSubscribedPrisma); + expect(companyAssociation2).toMatchObject(allSubscribedPrisma); + + const { mutate } = makeClient(user1); + + const { errors } = await mutate< + Pick, + MutationSubscribeToNotificationsArgs + >(SUBSCRIBE_TO_NOTIFICATIONS, { + variables: { input: { notifications: allUnsubscribedGql } } + }); + + expect(errors).toBeUndefined(); + + const updatedCompanyAssociation1 = + await prisma.companyAssociation.findUniqueOrThrow({ + where: { id: companyAssociation1.id } + }); + + const updatedCompanyAssociation2 = + await prisma.companyAssociation.findUniqueOrThrow({ + where: { id: companyAssociation2.id } + }); + + expect(updatedCompanyAssociation1).toMatchObject(allUnsubscribedPrisma); + + // Les notifications de l'utilisateur 2 ne sont pas impactées + expect(updatedCompanyAssociation2).toMatchObject(allSubscribedPrisma); + }); }); diff --git a/back/src/users/resolvers/mutations/subscribeToNotifications.ts b/back/src/users/resolvers/mutations/subscribeToNotifications.ts index 3de587a626..6728252695 100644 --- a/back/src/users/resolvers/mutations/subscribeToNotifications.ts +++ b/back/src/users/resolvers/mutations/subscribeToNotifications.ts @@ -19,11 +19,6 @@ const subscribeToNotificationsResolver: MutationResolvers["subscribeToNotificati const { notifications } = args.input; for (const [notification, isActive] of Object.entries(notifications)) { - if (isActive === null || isActive === undefined) { - // ne fait rien si isActive est `null` ou `undefined - return; - } - const data = toPrismaNotifications({ [notification]: isActive }); if (isActive === true) { diff --git a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.module.scss b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.module.scss index af6633adfc..fe8a679d00 100644 --- a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.module.scss +++ b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.module.scss @@ -4,7 +4,6 @@ gap: 15px; } - legend { margin-bottom: 0.5em; -} \ No newline at end of file +} diff --git a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.tsx b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.tsx index bb32e71860..73eff93aab 100644 --- a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.tsx +++ b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.tsx @@ -1,11 +1,17 @@ import { useMutation } from "@apollo/client"; -import { Mutation, MutationSubscribeToNotificationsArgs } from "@td/codegen-ui"; +import { + Mutation, + MutationSubscribeToNotificationsArgs, + UserNotifications, + UserNotificationsInput +} from "@td/codegen-ui"; import React from "react"; import { SUBSCRIBE_TO_NOTIFICATIONS } from "./queries"; import { useForm } from "react-hook-form"; import Button from "@codegouvfr/react-dsfr/Button"; import RadioButtons from "@codegouvfr/react-dsfr/RadioButtons"; import styles from "./NotificationsUpdateAllModal.module.scss"; +import { hintTexts } from "./utils"; type AccountNotificationsUpdateAllModalProps = { // nombre total d'établissements @@ -13,33 +19,113 @@ type AccountNotificationsUpdateAllModalProps = { close: () => void; }; -enum SubscribeAction { +enum SubscribeActions { DoNothing = "DoNothing", Subscribe = "Subscribe", Unsuscribe = "Unsubscribe" } type FormValues = { - membershipRequest: SubscribeAction; + membershipRequest: SubscribeActions; + signatureCodeRenewal: SubscribeActions; + bsdRefusal: SubscribeActions; + bsdaFinalDestinationUpdate: SubscribeActions; + revisionRequest: SubscribeActions; +}; + +type RadioInput = { + legend: string; + notification: keyof Omit; }; export default function AccountNotificationsUpdateAllModal({ totalCount, close }: AccountNotificationsUpdateAllModalProps) { - const [subscribeToNotifications, { loading, data, error }] = useMutation< + const [ + subscribeToNotifications, + { loading, data, error, reset: resetMutation } + ] = useMutation< Pick, MutationSubscribeToNotificationsArgs >(SUBSCRIBE_TO_NOTIFICATIONS); const { register, handleSubmit, reset } = useForm({ - defaultValues: { membershipRequest: SubscribeAction.DoNothing } + defaultValues: { + membershipRequest: SubscribeActions.DoNothing, + signatureCodeRenewal: SubscribeActions.DoNothing, + bsdRefusal: SubscribeActions.DoNothing, + bsdaFinalDestinationUpdate: SubscribeActions.DoNothing, + revisionRequest: SubscribeActions.DoNothing + } }); + function resetAndClose() { + reset(); + resetMutation(); + close(); + } + const onSubmit = async (data: FormValues) => { - console.log(data); + const notifications: UserNotificationsInput = Object.entries(data).reduce( + (acc, [notification, action]) => { + if (action === SubscribeActions.Subscribe) { + return { ...acc, [notification]: true }; + } else if (action === SubscribeActions.Unsuscribe) { + return { ...acc, [notification]: false }; + } + return acc; + }, + {} + ); + if (Object.keys(notifications).length === 0) { + resetAndClose(); + return; + } + + const { errors } = await subscribeToNotifications({ + variables: { + input: { + notifications + } + } + }); + if (!errors) { + resetAndClose(); + } }; + const radioInputs: RadioInput[] = [ + { + legend: "Demandes de rattachement", + notification: "membershipRequest" + }, + { + legend: "Renouvellement du code signature", + notification: "signatureCodeRenewal" + }, + { + legend: "Refus total et partiel des bordereaux", + notification: "bsdRefusal" + }, + { + legend: "Modification de la destination finale amiante", + notification: "bsdaFinalDestinationUpdate" + }, + { + legend: "Demandes de révision", + notification: "revisionRequest" + } + ]; + + let radioButtonState: "default" | "error" | "success" = "default"; + + if (error) { + radioButtonState = "error"; + } else if (data) { + radioButtonState = "success"; + } + return ( <>
    @@ -50,35 +136,39 @@ export default function AccountNotificationsUpdateAllModal({
    - ( + + ]} + orientation="horizontal" + /> + ))}
    diff --git a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.module.scss b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.module.scss index fe8a679d00..6599310a11 100644 --- a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.module.scss +++ b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.module.scss @@ -4,6 +4,28 @@ gap: 15px; } -legend { - margin-bottom: 0.5em; +.radioButtons { + legend { + font-weight: bold !important; + } + + :global(.fr-fieldset__content) { + flex-wrap: nowrap; + justify-content: space-between; + + :global(fr-radio-group){ + margin-right: 0; + } + + label { + min-width: 12em; + max-width: 15em; + } + } + } + + + + + diff --git a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.tsx b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.tsx index 73eff93aab..d31f01fb42 100644 --- a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.tsx +++ b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.tsx @@ -11,11 +11,16 @@ import { useForm } from "react-hook-form"; import Button from "@codegouvfr/react-dsfr/Button"; import RadioButtons from "@codegouvfr/react-dsfr/RadioButtons"; import styles from "./NotificationsUpdateAllModal.module.scss"; -import { hintTexts } from "./utils"; +import { Modal } from "../../../common/components"; +import TdTooltip from "../../../common/components/Tooltip"; +import Alert from "@codegouvfr/react-dsfr/Alert"; type AccountNotificationsUpdateAllModalProps = { // nombre total d'établissements totalCount: number; + // état de la modale + open: boolean; + // action permettant de fermer la modale close: () => void; }; @@ -36,10 +41,13 @@ type FormValues = { type RadioInput = { legend: string; notification: keyof Omit; + // message à afficher sous le label "Activer pour tous vo établissements" + activateHint?: string; }; export default function AccountNotificationsUpdateAllModal({ totalCount, + open, close }: AccountNotificationsUpdateAllModalProps) { const [ @@ -50,7 +58,7 @@ export default function AccountNotificationsUpdateAllModal({ MutationSubscribeToNotificationsArgs >(SUBSCRIBE_TO_NOTIFICATIONS); - const { register, handleSubmit, reset } = useForm({ + const { register, handleSubmit, reset, watch } = useForm({ defaultValues: { membershipRequest: SubscribeActions.DoNothing, signatureCodeRenewal: SubscribeActions.DoNothing, @@ -98,7 +106,9 @@ export default function AccountNotificationsUpdateAllModal({ const radioInputs: RadioInput[] = [ { legend: "Demandes de rattachement", - notification: "membershipRequest" + notification: "membershipRequest", + activateHint: + "S'applique uniquement aux établissements sur lesquelles vous avez le rôle administrateur" }, { legend: "Renouvellement du code signature", @@ -114,7 +124,9 @@ export default function AccountNotificationsUpdateAllModal({ }, { legend: "Demandes de révision", - notification: "revisionRequest" + notification: "revisionRequest", + activateHint: + "Ne s'applique pas aux établissements sur lesquelles vous avez le rôle chauffeur" } ]; @@ -126,23 +138,37 @@ export default function AccountNotificationsUpdateAllModal({ radioButtonState = "success"; } + const modaleTitle = "Gérer les notifications"; + + const values = watch([ + "membershipRequest", + "signatureCodeRenewal", + "bsdRefusal", + "bsdaFinalDestinationUpdate", + "revisionRequest" + ]); + + const saveButtonIsDisabled = values.every( + v => v === SubscribeActions.DoNothing + ); + return ( - <> -
    - Le formulaire suivant permet de s'abonner ou se désabonner aux - notifications de différents types pour l'ensemble de vos {totalCount}{" "} - établissements, à l'exception de ceux pour lesquelles votre rôle ne le - permet pas -
    +
    - {radioInputs.map(({ notification, legend }) => ( + {radioInputs.map(({ notification, legend, activateHint }) => ( ))}
    + {!saveButtonIsDisabled && ( + + )}
    -
    - +
    ); } diff --git a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateButton.tsx b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateButton.tsx index 149f97d08c..a891239b20 100644 --- a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateButton.tsx +++ b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateButton.tsx @@ -1,6 +1,5 @@ -import React from "react"; +import React, { useState } from "react"; import Button from "@codegouvfr/react-dsfr/Button"; -import { createModal } from "@codegouvfr/react-dsfr/Modal"; import { CompanyPrivate } from "@td/codegen-ui"; import NotificationsUpdateModal from "./NotificationsUpdateModal"; @@ -15,25 +14,22 @@ export default function NotificationsUpdateButton({ notification => company.userNotifications[notification] === true ); - const btnLabel = `Gérer (${activeNotifications.length})`; + const [open, setIsOpen] = useState(false); - const modalTitle = `Gérer les notifications`; + const btnLabel = `Gérer (${activeNotifications.length})`; const iconId = activeNotifications.length ? "ri-notification-3-line" : "ri-notification-off-line"; - const modal = createModal({ - id: `${company.orgId}-notifications-update`, - isOpenedByDefault: false - }); - return ( <> - - - - diff --git a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateModal.tsx b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateModal.tsx index 4990521fef..00b579866a 100644 --- a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateModal.tsx +++ b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateModal.tsx @@ -13,9 +13,13 @@ import { useMutation } from "@apollo/client"; import { SUBSCRIBE_TO_COMPANY_NOTIFICATIONS } from "./queries"; import styles from "./NotificationsUpdateModal.module.scss"; import { hintTexts } from "./utils"; +import { Modal } from "../../../common/components"; type AccountCompanyNotificationsUpdateModalProps = { company: CompanyPrivate; + // état de la modale + open: boolean; + // action permettant de fermer la modale close: () => void; }; @@ -57,6 +61,7 @@ export const authorizedNotificationsByUserRole: { export default function NotificationsUpdateModal({ company, + open, close }: AccountCompanyNotificationsUpdateModalProps) { const [subscribeToCompanyNotifications, { loading, data, error }] = @@ -130,8 +135,16 @@ export default function NotificationsUpdateModal({ } })); + const modalTitle = "Gérer les notifications"; + return ( - <> +
    Je souhaite recevoir par courriel les notifications de l'établissement{" "} {company.name} ({company.siret}) relatives : @@ -158,6 +171,6 @@ export default function NotificationsUpdateModal({
    - +
    ); } From fcbe58b55892129d83cf44497edbb85c6a9911c9 Mon Sep 17 00:00:00 2001 From: Benoit Guigal Date: Wed, 23 Oct 2024 12:14:36 +0200 Subject: [PATCH 36/74] =?UTF-8?q?feat(AccountNotifications.tsx)=20:=20show?= =?UTF-8?q?=20button=20'G=C3=A9rer=20tout'=20when=20user=20has=20more=20th?= =?UTF-8?q?an=205=20companies?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AccountNotifications/AccountNotifications.tsx | 9 ++++++--- .../AccountNotifications/NotificationsUpdateAllModal.tsx | 3 +-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/front/src/Apps/Account/AccountNotifications/AccountNotifications.tsx b/front/src/Apps/Account/AccountNotifications/AccountNotifications.tsx index 4066828bd2..46d431e7cf 100644 --- a/front/src/Apps/Account/AccountNotifications/AccountNotifications.tsx +++ b/front/src/Apps/Account/AccountNotifications/AccountNotifications.tsx @@ -46,9 +46,12 @@ export default function AccountNotifications() { headers={[ "Établissements", "Notifications actives", -
    - -
    + // affiche le bouton de gestion en masse à partir de 5 établissement + totalCount >= 5 && ( +
    + +
    + ) ]} /> )} diff --git a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.tsx b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.tsx index d31f01fb42..69c9b05adb 100644 --- a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.tsx +++ b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.tsx @@ -12,7 +12,6 @@ import Button from "@codegouvfr/react-dsfr/Button"; import RadioButtons from "@codegouvfr/react-dsfr/RadioButtons"; import styles from "./NotificationsUpdateAllModal.module.scss"; import { Modal } from "../../../common/components"; -import TdTooltip from "../../../common/components/Tooltip"; import Alert from "@codegouvfr/react-dsfr/Alert"; type AccountNotificationsUpdateAllModalProps = { @@ -157,7 +156,7 @@ export default function AccountNotificationsUpdateAllModal({ isOpen={open} title={modaleTitle} ariaLabel={modaleTitle} - onClose={close} + onClose={resetAndClose} size="L" >
    From 679c66986526725d6fced9ce2501b6d8640dae1d Mon Sep 17 00:00:00 2001 From: Benoit Guigal Date: Wed, 23 Oct 2024 20:17:25 +0200 Subject: [PATCH 37/74] optim(MY_COMPANIES) : specify fragment to fetch in SearchableCompaniesList to prevent over fetch --- .../AccountNotifications.tsx | 17 +++++++++++++++ .../Companies/CompaniesList/CompaniesList.tsx | 12 +++++++++++ .../CompaniesList/SearchableCompaniesList.tsx | 14 +++++++------ .../Apps/Companies/CompaniesList/queries.ts | 21 +++++++++++++++++++ front/src/Apps/Companies/common/fragments.ts | 7 ------- front/src/Apps/Companies/common/queries.ts | 1 + 6 files changed, 59 insertions(+), 13 deletions(-) create mode 100644 front/src/Apps/Companies/CompaniesList/queries.ts diff --git a/front/src/Apps/Account/AccountNotifications/AccountNotifications.tsx b/front/src/Apps/Account/AccountNotifications/AccountNotifications.tsx index 46d431e7cf..66a4b7065c 100644 --- a/front/src/Apps/Account/AccountNotifications/AccountNotifications.tsx +++ b/front/src/Apps/Account/AccountNotifications/AccountNotifications.tsx @@ -7,6 +7,7 @@ import SearchableCompaniesList from "../../Companies/CompaniesList/SearchableCom import Alert from "@codegouvfr/react-dsfr/Alert"; import styles from "./AccountNotifications.module.scss"; import NotificationsUpdateAllButton from "./NotificationsUpdateAllButton"; +import gql from "graphql-tag"; const alertDescription = "Il est impératif de veiller à ce qu'au moins un membre de vos établissements" + @@ -15,6 +16,21 @@ const alertDescription = " Il est donc de votre responsabilité de vous assurer que les notifications sont" + " bien configurées et suivies."; +const fragment = gql` + fragment CompanyPrivateFragment on CompanyPrivate { + name + orgId + userRole + userNotifications { + membershipRequest + signatureCodeRenewal + bsdRefusal + bsdaFinalDestinationUpdate + revisionRequest + } + } +`; + /** * Ce composant permet l'affichage de la liste des établissements * de l'utilisateur et des notifications actives sur chaque établissement. @@ -33,6 +49,7 @@ export default function AccountNotifications() { {/* Liste paginée des établissements avec un bouton "Charger plus" et une barre de recherche */} (
    { let icon = "fr-icon-user-line"; @@ -43,6 +44,16 @@ export const userRole = (role: UserRole) => { ); }; +const fragment = gql` + fragment CompanyPrivateFragment on CompanyPrivate { + name + givenName + address + orgId + userRole + } +`; + export default function CompaniesList() { const navigate = useNavigate(); const [downloadMyCompaniesCsv] = useDownloadMyCompaniesCsv(); @@ -137,6 +148,7 @@ export default function CompaniesList() { } > diff --git a/front/src/Apps/Companies/CompaniesList/SearchableCompaniesList.tsx b/front/src/Apps/Companies/CompaniesList/SearchableCompaniesList.tsx index d4d5e81941..460c17a26f 100644 --- a/front/src/Apps/Companies/CompaniesList/SearchableCompaniesList.tsx +++ b/front/src/Apps/Companies/CompaniesList/SearchableCompaniesList.tsx @@ -1,5 +1,5 @@ import React, { useState, useMemo } from "react"; -import { useQuery } from "@apollo/client"; +import { DocumentNode, useQuery } from "@apollo/client"; import { Query, CompanyPrivate, @@ -8,17 +8,18 @@ import { } from "@td/codegen-ui"; import { Loader } from "../../common/Components"; import { NotificationError } from "../../common/Components/Error/Error"; - import { debounce } from "../../../common/helper"; import { MIN_MY_COMPANIES_SEARCH, MAX_MY_COMPANIES_SEARCH } from "@td/constants"; import styles from "./CompaniesList.module.scss"; - -import { MY_COMPANIES } from "../common/queries"; +import { MY_COMPANIES } from "./queries"; type SearchableCompaniesListProps = { + // fragment sur CompanyPrivate permettant de spécifier les champs requis + // à fetch pour l'affichage des établissements dans la liste + fragment: DocumentNode; renderCompanies: ( companies: CompanyPrivate[], totalCount: number @@ -39,7 +40,8 @@ const isSearchClueValid = clue => */ export default function SearchableCompaniesList({ renderCompanies, - onCompleted + onCompleted, + fragment }: SearchableCompaniesListProps) { const [isFiltered, setIsFiltered] = useState(false); const [inputValue, setInputValue] = useState(""); @@ -49,7 +51,7 @@ export default function SearchableCompaniesList({ const { data, loading, error, refetch, fetchMore } = useQuery< Pick, QueryMyCompaniesArgs - >(MY_COMPANIES, { + >(MY_COMPANIES(fragment), { fetchPolicy: "network-only", variables: { first: 10 }, onCompleted: data => diff --git a/front/src/Apps/Companies/CompaniesList/queries.ts b/front/src/Apps/Companies/CompaniesList/queries.ts new file mode 100644 index 0000000000..75c44c5cfe --- /dev/null +++ b/front/src/Apps/Companies/CompaniesList/queries.ts @@ -0,0 +1,21 @@ +import { DocumentNode } from "@apollo/client"; +import gql from "graphql-tag"; + +export const MY_COMPANIES = (fragment: DocumentNode) => gql` + query MyCompanies($first: Int, $after: ID, $search: String) { + myCompanies(first: $first, after: $after, search: $search) { + totalCount + pageInfo { + hasNextPage + endCursor + } + edges { + cursor + node { + ...CompanyPrivateFragment + } + } + } + } + ${fragment} +`; diff --git a/front/src/Apps/Companies/common/fragments.ts b/front/src/Apps/Companies/common/fragments.ts index aae008f2b0..cf022a2cfc 100644 --- a/front/src/Apps/Companies/common/fragments.ts +++ b/front/src/Apps/Companies/common/fragments.ts @@ -160,13 +160,6 @@ export const AccountCompanyInfoFragment = { naf libelleNaf userRole - userNotifications { - membershipRequest - signatureCodeRenewal - bsdRefusal - bsdaFinalDestinationUpdate - revisionRequest - } givenName ...AccountFieldCompanyTypesFragment ...AccountFieldCompanyGerepIdFragment diff --git a/front/src/Apps/Companies/common/queries.ts b/front/src/Apps/Companies/common/queries.ts index e51e54c900..d63e55bf15 100644 --- a/front/src/Apps/Companies/common/queries.ts +++ b/front/src/Apps/Companies/common/queries.ts @@ -98,6 +98,7 @@ export const SUBMIT_ADMINISTRATIVE_TRANSFER_APPROVAL = gql` } `; +// Requête utilisée pour afficher le détail d'un de mes établissements export const MY_COMPANIES = gql` query MyCompanies($first: Int, $after: ID, $search: String) { myCompanies(first: $first, after: $after, search: $search) { From 07982fbe8aea192f32313ecb908091c330bef5ee Mon Sep 17 00:00:00 2001 From: Benoit Guigal Date: Wed, 6 Nov 2024 13:46:01 +0100 Subject: [PATCH 38/74] feat(NotificationsUpdateAllModal) : add description text --- back/src/companies/typeDefs/company.objects.graphql | 2 +- .../AccountNotifications/NotificationsUpdateAllModal.tsx | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/back/src/companies/typeDefs/company.objects.graphql b/back/src/companies/typeDefs/company.objects.graphql index a49d796b3f..fef7b479d6 100644 --- a/back/src/companies/typeDefs/company.objects.graphql +++ b/back/src/companies/typeDefs/company.objects.graphql @@ -45,7 +45,7 @@ type CompanyPrivate { "Liste des permissions de l'utilisateur authentifié au sein de cet établissement" userPermissions: [UserPermission!]! - "Liste des notifications auquels l'utilisateur est abonné pour cet établissement" + "Liste des notifications auquels l'utilisateur authentifié est abonné pour cet établissement" userNotifications: UserNotifications! """ diff --git a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.tsx b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.tsx index 69c9b05adb..048e76d1dc 100644 --- a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.tsx +++ b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllModal.tsx @@ -159,6 +159,11 @@ export default function AccountNotificationsUpdateAllModal({ onClose={resetAndClose} size="L" > +
    + Le formulaire suivant permet de s'abonner ou se désabonner aux + notifications de différents types pour l'ensemble de vos {totalCount}{" "} + établissements. +
    {radioInputs.map(({ notification, legend, activateHint }) => ( From 269204ab4a8836fba512fa5013609bfba936f349 Mon Sep 17 00:00:00 2001 From: Benoit Guigal Date: Wed, 6 Nov 2024 16:31:00 +0100 Subject: [PATCH 39/74] feat(notifications) : show subscribers count for each notifications --- front/src/Apps/Account/Account.tsx | 2 +- .../AccountNotifications.tsx | 86 +++++------ .../NotificationsDisplay.tsx | 81 ++++++++-- .../NotificationsUpdateAllButton.tsx | 13 +- .../NotificationsUpdateAllModal.module.scss | 10 +- .../NotificationsUpdateAllModal.tsx | 5 +- .../NotificationsUpdateButton.tsx | 19 ++- .../NotificationsUpdateModal.tsx | 138 +++++++++++++++--- .../SubscribersCountBadge.tsx | 19 +++ .../Account/AccountNotifications/queries.ts | 24 +++ 10 files changed, 304 insertions(+), 93 deletions(-) create mode 100644 front/src/Apps/Account/AccountNotifications/SubscribersCountBadge.tsx diff --git a/front/src/Apps/Account/Account.tsx b/front/src/Apps/Account/Account.tsx index 570b8887d0..acc509fb7f 100644 --- a/front/src/Apps/Account/Account.tsx +++ b/front/src/Apps/Account/Account.tsx @@ -59,7 +59,7 @@ export default function Account() { path={toRelative(routes.account.notifications)} element={ - + } /> diff --git a/front/src/Apps/Account/AccountNotifications/AccountNotifications.tsx b/front/src/Apps/Account/AccountNotifications/AccountNotifications.tsx index 66a4b7065c..d2e98d8cca 100644 --- a/front/src/Apps/Account/AccountNotifications/AccountNotifications.tsx +++ b/front/src/Apps/Account/AccountNotifications/AccountNotifications.tsx @@ -4,20 +4,18 @@ import CompanyDisplay from "./CompanyDisplay"; import { NotificationsDisplay } from "./NotificationsDisplay"; import NotificationsUpdateButton from "./NotificationsUpdateButton"; import SearchableCompaniesList from "../../Companies/CompaniesList/SearchableCompaniesList"; -import Alert from "@codegouvfr/react-dsfr/Alert"; import styles from "./AccountNotifications.module.scss"; import NotificationsUpdateAllButton from "./NotificationsUpdateAllButton"; import gql from "graphql-tag"; +import { User } from "@td/codegen-ui"; -const alertDescription = - "Il est impératif de veiller à ce qu'au moins un membre de vos établissements" + - " soit inscrit à chacune des notifications. Trackdéchets n'a pas la possibilité" + - " de désigner automatiquement un responsable ni de gérer ces inscriptions." + - " Il est donc de votre responsabilité de vous assurer que les notifications sont" + - " bien configurées et suivies."; +type AccountNotificationsProps = { + me: Pick; +}; const fragment = gql` fragment CompanyPrivateFragment on CompanyPrivate { + id name orgId userRole @@ -28,6 +26,18 @@ const fragment = gql` bsdaFinalDestinationUpdate revisionRequest } + users { + id + orgId + email + notifications { + membershipRequest + signatureCodeRenewal + bsdRefusal + bsdaFinalDestinationUpdate + revisionRequest + } + } } `; @@ -37,42 +47,36 @@ const fragment = gql` * Pour chaque établissement un bouton permet d'ouvrir une modale afin de modifier * les préfèrences de notifications de l'utilisateur au sein de cet établissement. */ -export default function AccountNotifications() { +export default function AccountNotifications({ + me +}: AccountNotificationsProps) { return ( -
    - - {/* Liste paginée des établissements avec un bouton "Charger plus" - et une barre de recherche */} - ( -
    [ - , - , + // Liste paginée des établissements avec un bouton "Charger plus" + // et une barre de recherche + ( +
    [ + , + , +
    + +
    + ])} + headers={[ + "Établissements", + "Notifications actives", + // affiche le bouton de gestion en masse à partir de 5 établissement + totalCount >= 5 && (
    - +
    - ])} - headers={[ - "Établissements", - "Notifications actives", - // affiche le bouton de gestion en masse à partir de 5 établissement - totalCount >= 5 && ( -
    - -
    - ) - ]} - /> - )} - /> - + ) + ]} + /> + )} + /> ); } diff --git a/front/src/Apps/Account/AccountNotifications/NotificationsDisplay.tsx b/front/src/Apps/Account/AccountNotifications/NotificationsDisplay.tsx index efe2988846..534832ec53 100644 --- a/front/src/Apps/Account/AccountNotifications/NotificationsDisplay.tsx +++ b/front/src/Apps/Account/AccountNotifications/NotificationsDisplay.tsx @@ -1,4 +1,9 @@ -import { CompanyPrivate, UserNotifications } from "@td/codegen-ui"; +import Badge from "@codegouvfr/react-dsfr/Badge"; +import { + CompanyMember, + CompanyPrivate, + UserNotifications +} from "@td/codegen-ui"; import React from "react"; type AccountCompanyNotificationsProps = { @@ -25,16 +30,74 @@ function getNotificationLabels(notifications: UserNotifications) { .join(", "); } +/** + * Renvoie le nombre de notifications sans aucun abonné + */ +function withoutSubscribersCount(users: CompanyMember[]) { + const subscribersCount = { + membershipRequest: 0, + signatureCodeRenewal: 0, + bsdRefusal: 0, + bsdaFinalDestinationUpdate: 0, + revisionRequest: 0 + }; + for (const user of users) { + if (user.notifications.membershipRequest) { + subscribersCount.membershipRequest = + subscribersCount.membershipRequest + 1; + } + if (user.notifications.signatureCodeRenewal) { + subscribersCount.signatureCodeRenewal = + subscribersCount.signatureCodeRenewal + 1; + } + if (user.notifications.bsdRefusal) { + subscribersCount.bsdRefusal = subscribersCount.bsdRefusal + 1; + } + if (user.notifications.bsdaFinalDestinationUpdate) { + subscribersCount.bsdaFinalDestinationUpdate = + subscribersCount.bsdaFinalDestinationUpdate + 1; + } + if (user.notifications.revisionRequest) { + subscribersCount.revisionRequest = subscribersCount.revisionRequest + 1; + } + } + + const withoutSubscribers = Object.values(subscribersCount).reduce( + (acc, count) => { + if (count < 1) { + return acc + 1; + } + return acc; + }, + 0 + ); + + return withoutSubscribers; +} + export function NotificationsDisplay({ company }: AccountCompanyNotificationsProps) { - if ( - Object.keys(company.userNotifications).some( - notification => company.userNotifications[notification] === true - ) - ) { - return
    {getNotificationLabels(company.userNotifications)}
    ; - } + const hasSome = Object.keys(company.userNotifications).some( + notification => company.userNotifications[notification] === true + ); + + const labels = hasSome + ? getNotificationLabels(company.userNotifications) + : "Désactivé"; - return
    Désactivé
    ; + const withoutSubscribers = withoutSubscribersCount(company.users ?? []); + const badgeLabel = `${withoutSubscribers} ${ + withoutSubscribers > 1 ? "notifications" : "notification" + } sans abonné`; + return ( + <> +
    {labels}
    + {withoutSubscribers > 0 && ( + + {badgeLabel} + + )} + + ); } diff --git a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllButton.tsx b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllButton.tsx index 33242b8f10..72f7fd76d3 100644 --- a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllButton.tsx +++ b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateAllButton.tsx @@ -14,12 +14,13 @@ export default function NotificationsUpdateAllButton({ return ( <> - setIsOpen(false)} - /> - + {open && ( + setIsOpen(false)} + /> + )} diff --git a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateModal.tsx b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateModal.tsx index 00b579866a..190f53b417 100644 --- a/front/src/Apps/Account/AccountNotifications/NotificationsUpdateModal.tsx +++ b/front/src/Apps/Account/AccountNotifications/NotificationsUpdateModal.tsx @@ -1,8 +1,10 @@ -import React from "react"; +import React, { ReactNode, useMemo } from "react"; import { + CompanyMember, CompanyPrivate, Mutation, MutationSubscribeToCompanyNotificationsArgs, + User, UserNotifications, UserRole } from "@td/codegen-ui"; @@ -14,9 +16,11 @@ import { SUBSCRIBE_TO_COMPANY_NOTIFICATIONS } from "./queries"; import styles from "./NotificationsUpdateModal.module.scss"; import { hintTexts } from "./utils"; import { Modal } from "../../../common/components"; +import SubscribersCountBadge from "./SubscribersCountBadge"; type AccountCompanyNotificationsUpdateModalProps = { company: CompanyPrivate; + me: Pick; // état de la modale open: boolean; // action permettant de fermer la modale @@ -24,7 +28,7 @@ type AccountCompanyNotificationsUpdateModalProps = { }; type OptionLabel = { - label: string; + label: ReactNode; notification: keyof UserNotifications; }; @@ -59,25 +63,80 @@ export const authorizedNotificationsByUserRole: { ] }; +type GetSubscribersOpts = { + // Liste des membres de l'établissements différent de l'utilisateur connecté + users: CompanyMember[]; + // Abonnement de l'utilisateur connecté + notifications: UserNotifications; +}; + +function getSubscribersCount({ users, notifications }: GetSubscribersOpts) { + // Initialise le comptage des abonnés à partir des notifications de l'utilisateur connexté + const subscribersCount = { + membershipRequest: notifications.membershipRequest ? 1 : 0, + signatureCodeRenewal: notifications.signatureCodeRenewal ? 1 : 0, + bsdRefusal: notifications.bsdRefusal ? 1 : 0, + bsdaFinalDestinationUpdate: notifications.bsdaFinalDestinationUpdate + ? 1 + : 0, + revisionRequest: notifications.revisionRequest ? 1 : 0 + }; + + // Incrémente le comptage à partir des abonnements des autres utilisateurs + for (const user of users) { + if (user.notifications.membershipRequest) { + subscribersCount.membershipRequest = + subscribersCount.membershipRequest + 1; + } + if (user.notifications.signatureCodeRenewal) { + subscribersCount.signatureCodeRenewal = + subscribersCount.signatureCodeRenewal + 1; + } + if (user.notifications.bsdRefusal) { + subscribersCount.bsdRefusal = subscribersCount.bsdRefusal + 1; + } + if (user.notifications.bsdaFinalDestinationUpdate) { + subscribersCount.bsdaFinalDestinationUpdate = + subscribersCount.bsdaFinalDestinationUpdate + 1; + } + if (user.notifications.revisionRequest) { + subscribersCount.revisionRequest = subscribersCount.revisionRequest + 1; + } + } + + return subscribersCount; +} + export default function NotificationsUpdateModal({ company, + me, open, close }: AccountCompanyNotificationsUpdateModalProps) { - const [subscribeToCompanyNotifications, { loading, data, error }] = - useMutation< - Pick, - MutationSubscribeToCompanyNotificationsArgs - >(SUBSCRIBE_TO_COMPANY_NOTIFICATIONS); + const [ + subscribeToCompanyNotifications, + { loading, data, error, reset: resetMutation } + ] = useMutation< + Pick, + MutationSubscribeToCompanyNotificationsArgs + >(SUBSCRIBE_TO_COMPANY_NOTIFICATIONS); const authorizedNotifications = company.userRole ? authorizedNotificationsByUserRole[company.userRole] : []; - const { register, handleSubmit } = useForm({ + const { register, handleSubmit, watch, reset } = useForm({ defaultValues: company.userNotifications }); + function resetAndClose() { + resetMutation(); + reset(); + close(); + } + + const notifications = watch(); + const onSubmit = async (data: UserNotifications) => { const { errors } = await subscribeToCompanyNotifications({ variables: { @@ -88,7 +147,7 @@ export default function NotificationsUpdateModal({ } }); if (!errors) { - close(); + resetAndClose(); } }; @@ -100,25 +159,70 @@ export default function NotificationsUpdateModal({ checkboxState = "success"; } + // liste des utilisateurs autres que l'utilisateur connecté + const allMembersButMe = (company.users ?? []).filter( + u => u.email !== me.email + ); + + const subscribersCount = useMemo( + () => getSubscribersCount({ users: allMembersButMe, notifications }), + [allMembersButMe, notifications] + ); + const optionsLabels: OptionLabel[] = [ { - label: "aux demandes de rattachement", + label: ( +
    + aux demandes de rattachement + +
    + ), notification: "membershipRequest" }, { - label: "au renouvellement du code de signature", + label: ( +
    + + au renouvellement du code de signature + + +
    + ), notification: "signatureCodeRenewal" }, { - label: "au refus total et partiel des bordereaux", + label: ( +
    + + au refus total et partiel des bordereaux + + +
    + ), notification: "bsdRefusal" }, { - label: "à la modification de la destination finale amiante", + label: ( +
    + + à la modification de la destination finale amiante + + +
    + ), notification: "bsdaFinalDestinationUpdate" }, { - label: "aux demandes de révision", + label: ( +
    + aux demandes de révision + +
    + ), notification: "revisionRequest" } ]; @@ -142,12 +246,12 @@ export default function NotificationsUpdateModal({ isOpen={open} title={modalTitle} ariaLabel={modalTitle} - onClose={close} + onClose={resetAndClose} size="L" >
    Je souhaite recevoir par courriel les notifications de l'établissement{" "} - {company.name} ({company.siret}) relatives : + {company.name} ({company.orgId}) relatives :
    Annuler diff --git a/front/src/Apps/Account/AccountNotifications/SubscribersCountBadge.tsx b/front/src/Apps/Account/AccountNotifications/SubscribersCountBadge.tsx new file mode 100644 index 0000000000..5b9d9df429 --- /dev/null +++ b/front/src/Apps/Account/AccountNotifications/SubscribersCountBadge.tsx @@ -0,0 +1,19 @@ +import React from "react"; +import Badge from "@codegouvfr/react-dsfr/Badge"; + +type SubscribersCountTagProps = { + count: number; +}; + +export default function SubscribersCountBadge({ + count +}: SubscribersCountTagProps) { + const title = count <= 1 ? `${count} abonné` : `${count} abonnés`; + const severity = count < 1 ? "error" : "success"; + + return ( + + {title.toUpperCase()} + + ); +} diff --git a/front/src/Apps/Account/AccountNotifications/queries.ts b/front/src/Apps/Account/AccountNotifications/queries.ts index becd94e4ee..b85f7b5f5d 100644 --- a/front/src/Apps/Account/AccountNotifications/queries.ts +++ b/front/src/Apps/Account/AccountNotifications/queries.ts @@ -14,6 +14,18 @@ export const SUBSCRIBE_TO_COMPANY_NOTIFICATIONS = gql` bsdaFinalDestinationUpdate revisionRequest } + users { + id + orgId + email + notifications { + membershipRequest + signatureCodeRenewal + bsdRefusal + bsdaFinalDestinationUpdate + revisionRequest + } + } } } `; @@ -30,6 +42,18 @@ export const SUBSCRIBE_TO_NOTIFICATIONS = gql` bsdaFinalDestinationUpdate revisionRequest } + users { + id + orgId + email + notifications { + membershipRequest + signatureCodeRenewal + bsdRefusal + bsdaFinalDestinationUpdate + revisionRequest + } + } } } `; From 7b35d7192a7cbd98062be2e84fcae7c57c9d1107 Mon Sep 17 00:00:00 2001 From: Benoit Guigal Date: Wed, 6 Nov 2024 16:59:16 +0100 Subject: [PATCH 40/74] chore(changelog) : update --- Changelog.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Changelog.md b/Changelog.md index ec3f38bc13..9fdb8a5456 100644 --- a/Changelog.md +++ b/Changelog.md @@ -26,6 +26,13 @@ et le projet suit un schéma de versionning inspiré de [Calendar Versioning](ht - Amélioration de l'interface d'admin [PR 3735](https://github.com/MTES-MCT/trackdechets/pull/3735) - Modification de la query controlBsds et fermeture de la query bsds aux comptes gouvernementaux [PR 3270](https://github.com/MTES-MCT/trackdechets/pull/3270) +# [2024.11.1] 19/11/2024 + +#### :rocket: Nouvelles fonctionnalités + +- Permettre à l'utilisateur de gérer les alertes de tous ses établissements [PR 3688](https://github.com/MTES-MCT/trackdechets/pull/3688) +- Afficher le nombre d'inscrits par type d'alertes au sein d'un établissemen [PR 3688](https://github.com/MTES-MCT/trackdechets/pull/3688) + # [2024.10.1] 22/10/2024 #### :rocket: Nouvelles fonctionnalités From db3364bfa8c6ad2667379e5aab361fac367b2270 Mon Sep 17 00:00:00 2001 From: Benoit Guigal Date: Thu, 7 Nov 2024 09:28:41 +0100 Subject: [PATCH 41/74] chore : remove commented code --- .../onboarding.helpers.integration.ts | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/apps/cron/src/commands/__tests__/onboarding.helpers.integration.ts b/apps/cron/src/commands/__tests__/onboarding.helpers.integration.ts index 4aadd43ab1..c84f4d4f62 100644 --- a/apps/cron/src/commands/__tests__/onboarding.helpers.integration.ts +++ b/apps/cron/src/commands/__tests__/onboarding.helpers.integration.ts @@ -427,25 +427,6 @@ describe("getPendingMembershipRequestsAndAssociatedMailSubscribers ", () => { }), user: expect.objectContaining({ email: user0.email }) }); - - // expect( - // requests.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime()) - // ).toEqual([ - // expect.objectContaining({ - // id: request1.id, - // company: expect.objectContaining({ - // orgId: companyAndAdmin1.company.orgId - // }), - // user: expect.objectContaining({ email: user0.email }) - // }), - // expect.objectContaining({ - // id: request0.id, - // company: expect.objectContaining({ - // orgId: companyAndAdmin0.company.orgId - // }), - // user: expect.objectContaining({ email: user0.email }) - // }) - // ]); }); }); From dda0d18fea98763ed83cc76f110438cfd19fc683 Mon Sep 17 00:00:00 2001 From: Benoit Guigal Date: Tue, 12 Nov 2024 09:02:31 +0100 Subject: [PATCH 42/74] refactor(AccountNotifications) : use fragment in query and mutation --- back/src/__tests__/factories.ts | 1 - .../Account/AccountNotifications/queries.ts | 66 ++++++++----------- .../Account/AccountNotifications/utils.ts | 2 +- 3 files changed, 28 insertions(+), 41 deletions(-) diff --git a/back/src/__tests__/factories.ts b/back/src/__tests__/factories.ts index e0978d9f40..8cf7a00bba 100644 --- a/back/src/__tests__/factories.ts +++ b/back/src/__tests__/factories.ts @@ -11,7 +11,6 @@ import { User, Prisma, Company, - UserNotification, WasteProcessorType, CollectorType, TransportMode diff --git a/front/src/Apps/Account/AccountNotifications/queries.ts b/front/src/Apps/Account/AccountNotifications/queries.ts index b85f7b5f5d..ad2e6cd251 100644 --- a/front/src/Apps/Account/AccountNotifications/queries.ts +++ b/front/src/Apps/Account/AccountNotifications/queries.ts @@ -1,59 +1,47 @@ import gql from "graphql-tag"; -export const SUBSCRIBE_TO_COMPANY_NOTIFICATIONS = gql` - mutation SubscribeToCompanyNotifications( - $input: SubscribeToCompanyNotificationsInput! - ) { - subscribeToCompanyNotifications(input: $input) { +const CompanyFragment = gql` + fragment CompanyFragment on CompanyPrivate { + id + orgId + userNotifications { + membershipRequest + signatureCodeRenewal + bsdRefusal + bsdaFinalDestinationUpdate + revisionRequest + } + users { id orgId - userNotifications { + email + notifications { membershipRequest signatureCodeRenewal bsdRefusal bsdaFinalDestinationUpdate revisionRequest } - users { - id - orgId - email - notifications { - membershipRequest - signatureCodeRenewal - bsdRefusal - bsdaFinalDestinationUpdate - revisionRequest - } - } } } `; +export const SUBSCRIBE_TO_COMPANY_NOTIFICATIONS = gql` + mutation SubscribeToCompanyNotifications( + $input: SubscribeToCompanyNotificationsInput! + ) { + subscribeToCompanyNotifications(input: $input) { + ...CompanyFragment + } + } + ${CompanyFragment} +`; + export const SUBSCRIBE_TO_NOTIFICATIONS = gql` mutation SubscribeToNotifications($input: SubscribeToNotificationsInput!) { subscribeToNotifications(input: $input) { - id - orgId - userNotifications { - membershipRequest - signatureCodeRenewal - bsdRefusal - bsdaFinalDestinationUpdate - revisionRequest - } - users { - id - orgId - email - notifications { - membershipRequest - signatureCodeRenewal - bsdRefusal - bsdaFinalDestinationUpdate - revisionRequest - } - } + ...CompanyFragment } } + ${CompanyFragment} `; diff --git a/front/src/Apps/Account/AccountNotifications/utils.ts b/front/src/Apps/Account/AccountNotifications/utils.ts index 707c7a8163..252355c0f6 100644 --- a/front/src/Apps/Account/AccountNotifications/utils.ts +++ b/front/src/Apps/Account/AccountNotifications/utils.ts @@ -9,7 +9,7 @@ export const hintTexts: { [key in keyof UserNotifications]: string } = { signatureCodeRenewal: "Un courriel sera envoyé à chaque renouvellement du code de signature", bsdRefusal: - "un courriel sera envoyé à chaque refus total ou partiel d'un bordereau", + "Un courriel sera envoyé à chaque refus total ou partiel d'un bordereau", bsdaFinalDestinationUpdate: "Un courriel sera envoyé lorsque le BSDA est envoyé à un exutoire" + " différent de celui prévu lors de la signature producteur", From d118c47a01b56729e02e762f86eb8e3c60956397 Mon Sep 17 00:00:00 2001 From: Benoit Guigal Date: Tue, 12 Nov 2024 15:14:52 +0100 Subject: [PATCH 43/74] chore : update changelog --- Changelog.md | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/Changelog.md b/Changelog.md index 9fdb8a5456..a29cf09865 100644 --- a/Changelog.md +++ b/Changelog.md @@ -5,11 +5,13 @@ Les changements importants de Trackdéchets sont documentés dans ce fichier. Le format est basé sur [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), et le projet suit un schéma de versionning inspiré de [Calendar Versioning](https://calver.org/). -[2024.11.1] 19/11/2024 +# [2024.11.1] 19/11/2024 #### :rocket: Nouvelles fonctionnalités - Permettre l'ajout d'un numéro libre sur le Bsvhu [PR 3718](https://github.com/MTES-MCT/trackdechets/pull/3718) +- Permettre à l'utilisateur de gérer les alertes de tous ses établissements [PR 3688](https://github.com/MTES-MCT/trackdechets/pull/3688) +- Afficher le nombre d'inscrits par type d'alertes au sein d'un établissement [PR 3688](https://github.com/MTES-MCT/trackdechets/pull/3688) #### :boom: Breaking changes @@ -26,13 +28,6 @@ et le projet suit un schéma de versionning inspiré de [Calendar Versioning](ht - Amélioration de l'interface d'admin [PR 3735](https://github.com/MTES-MCT/trackdechets/pull/3735) - Modification de la query controlBsds et fermeture de la query bsds aux comptes gouvernementaux [PR 3270](https://github.com/MTES-MCT/trackdechets/pull/3270) -# [2024.11.1] 19/11/2024 - -#### :rocket: Nouvelles fonctionnalités - -- Permettre à l'utilisateur de gérer les alertes de tous ses établissements [PR 3688](https://github.com/MTES-MCT/trackdechets/pull/3688) -- Afficher le nombre d'inscrits par type d'alertes au sein d'un établissemen [PR 3688](https://github.com/MTES-MCT/trackdechets/pull/3688) - # [2024.10.1] 22/10/2024 #### :rocket: Nouvelles fonctionnalités From 6f932185e0befd8c5e119bd46770b47f0dc94e7a Mon Sep 17 00:00:00 2001 From: Benoit Guigal Date: Tue, 12 Nov 2024 16:25:19 +0100 Subject: [PATCH 44/74] fix(build) : fix wrong import --- .../mutations/__tests__/updateBsff.integration.ts | 5 +++-- back/src/users/notifications.ts | 4 ++-- .../__tests__/subscribeToNotifications.integration.ts | 2 +- .../resolvers/mutations/subscribeToCompanyNotifications.ts | 7 ++++--- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/back/src/bsffs/resolvers/mutations/__tests__/updateBsff.integration.ts b/back/src/bsffs/resolvers/mutations/__tests__/updateBsff.integration.ts index 3d5b616f3a..d5be904e90 100644 --- a/back/src/bsffs/resolvers/mutations/__tests__/updateBsff.integration.ts +++ b/back/src/bsffs/resolvers/mutations/__tests__/updateBsff.integration.ts @@ -12,7 +12,9 @@ import { BsffInput, BsffOperationCode, Mutation, - MutationUpdateBsffArgs + MutationUpdateBsffArgs, + QueryBsffArgs, + Query } from "../../../../generated/graphql/types"; import { prisma } from "@td/prisma"; import { @@ -41,7 +43,6 @@ import { getFirstTransporterSync, getTransportersSync } from "../../../database"; -import { Query, QueryBsffArgs } from "@td/codegen-ui"; export const UPDATE_BSFF = gql` mutation UpdateBsff($id: ID!, $input: BsffInput!) { diff --git a/back/src/users/notifications.ts b/back/src/users/notifications.ts index 7fc01d905a..1f413e0baf 100644 --- a/back/src/users/notifications.ts +++ b/back/src/users/notifications.ts @@ -1,11 +1,11 @@ import { CompanyAssociation, Prisma, UserRole } from "@prisma/client"; import { Recipient } from "@td/mail"; import { prisma } from "@td/prisma"; +import { safeInput } from "../common/converter"; import { UserNotifications as GqlNotifications, UserNotificationsInput -} from "@td/codegen-ui"; -import { safeInput } from "../common/converter"; +} from "../generated/graphql/types"; // Notifications auxquelles un utilisateur peut s'abonner pour // un établissement donné diff --git a/back/src/users/resolvers/mutations/__tests__/subscribeToNotifications.integration.ts b/back/src/users/resolvers/mutations/__tests__/subscribeToNotifications.integration.ts index 8a882fa59a..1a2c1d8d81 100644 --- a/back/src/users/resolvers/mutations/__tests__/subscribeToNotifications.integration.ts +++ b/back/src/users/resolvers/mutations/__tests__/subscribeToNotifications.integration.ts @@ -2,7 +2,7 @@ import { Mutation, MutationSubscribeToNotificationsArgs, UserNotifications -} from "@td/codegen-ui"; +} from "../../../../generated/graphql/types"; import { companyFactory, userFactory } from "../../../../__tests__/factories"; import { associateUserToCompany } from "../../../database"; import { Prisma } from "@prisma/client"; diff --git a/back/src/users/resolvers/mutations/subscribeToCompanyNotifications.ts b/back/src/users/resolvers/mutations/subscribeToCompanyNotifications.ts index 3eafa07dc2..37612356a2 100644 --- a/back/src/users/resolvers/mutations/subscribeToCompanyNotifications.ts +++ b/back/src/users/resolvers/mutations/subscribeToCompanyNotifications.ts @@ -1,10 +1,12 @@ import { GraphQLContext } from "../../../types"; import { applyAuthStrategies, AuthType } from "../../../auth"; import { NotCompanyMember, UserInputError } from "../../../common/errors"; - import { checkIsAuthenticated } from "../../../common/permissions"; import { getCompanyOrCompanyNotFound } from "../../../companies/database"; -import { MutationResolvers } from "../../../generated/graphql/types"; +import { + MutationResolvers, + UserNotificationsInput +} from "../../../generated/graphql/types"; import { prisma } from "@td/prisma"; import { toGqlCompanyPrivate } from "../../../companies/converters"; import { @@ -12,7 +14,6 @@ import { toPrismaNotifications, UserNotification } from "../../notifications"; -import { UserNotificationsInput } from "@td/codegen-ui"; function activeNotifications( notifications: UserNotificationsInput From 5a1839590103828ad3480a1b28ce83689a087092 Mon Sep 17 00:00:00 2001 From: Benoit Guigal Date: Tue, 12 Nov 2024 14:18:03 +0100 Subject: [PATCH 45/74] =?UTF-8?q?feat(mailing)=20:=20show=20G=C3=A9rer=20m?= =?UTF-8?q?es=20pr=C3=A9ferences=20e-mails=20in=20Brevo=20template=20by=20?= =?UTF-8?q?passing=20a=20transactional=20params?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../forms/resolvers/mutations/markAsSealed.ts | 7 +-- libs/back/mail/src/templates/index.ts | 48 ++++++++++++++++--- libs/back/mail/src/templates/renderers.ts | 1 + libs/back/mail/src/types.ts | 2 + 4 files changed, 46 insertions(+), 12 deletions(-) diff --git a/back/src/forms/resolvers/mutations/markAsSealed.ts b/back/src/forms/resolvers/mutations/markAsSealed.ts index 39fe452681..5ea9d8bbb4 100644 --- a/back/src/forms/resolvers/mutations/markAsSealed.ts +++ b/back/src/forms/resolvers/mutations/markAsSealed.ts @@ -165,12 +165,7 @@ async function mailToNonExistentEmitter( } }); - await sendMail({ - ...mail, - // permet de cacher le message "Vous avez reçu cet e-mail car vous - // êtes inscrit sur la plateforme Trackdéchets" dans le template Brevo - params: { hideRegisteredUserInfo: true } - }); + await sendMail(mail); } } diff --git a/libs/back/mail/src/templates/index.ts b/libs/back/mail/src/templates/index.ts index fff24cfa48..adc45db67d 100644 --- a/libs/back/mail/src/templates/index.ts +++ b/libs/back/mail/src/templates/index.ts @@ -9,6 +9,11 @@ import { MailTemplate } from "../types"; import { templateIds } from "./provider/templateIds"; import { mustacheRenderer } from "./renderers"; +const { UI_HOST } = process.env; + +// URL permettant de gérer les préférences de notifications par e-mail +const handlePreferencesUrl = `${UI_HOST}/account/notifications`; + export const onSignup: MailTemplate<{ activationHash: string }> = { subject: "Activer votre compte sur Trackdéchets", body: mustacheRenderer("confirmation-de-compte.html"), @@ -48,7 +53,10 @@ export const yourCompanyIsIdentifiedOnABsd: MailTemplate<{ subject: "Votre établissement a été identifié sur un bordereau de suivi de déchets dangereux sur Trackdéchets", body: mustacheRenderer("your-company-is-identified-on-a-bsd.html"), - templateId: templateIds.LAYOUT + templateId: templateIds.LAYOUT, + // permet de cacher le message "Vous avez reçu cet e-mail car vous + // êtes inscrit sur la plateforme Trackdéchets" dans le template Brevo + params: { hideRegisteredUserInfo: true } }; export const onboardingFirstStep: MailTemplate = { @@ -83,6 +91,10 @@ export const formNotAccepted: MailTemplate<{ form: Form & BsddTransporter }> = { sentBy: form.sentBy ?? "" } }; + }, + params: { + // permet d'afficher le lien "Gérer mes préférences e-mails" + handlePreferencesUrl } }; @@ -107,6 +119,10 @@ export const formPartiallyRefused: MailTemplate<{ sentBy: form.sentBy ?? "" } }; + }, + params: { + // permet d'afficher le lien "Gérer mes préférences e-mails" + handlePreferencesUrl } }; @@ -129,7 +145,11 @@ export const membershipRequest: MailTemplate<{ }> = { subject: "Un utilisateur souhaite rejoindre votre établissement", body: mustacheRenderer("membership-request.html"), - templateId: templateIds.LAYOUT + templateId: templateIds.LAYOUT, + params: { + // permet d'afficher le lien "Gérer mes préférences e-mails" + handlePreferencesUrl + } }; export const membershipRequestAccepted: MailTemplate<{ @@ -158,7 +178,11 @@ export const securityCodeRenewal: MailTemplate<{ subject: ({ company }) => `Renouvellement du code de signature de votre établissement "${company.name}" (${company.orgId})`, body: mustacheRenderer("notification-renouvellement-code-signature.html"), - templateId: templateIds.LAYOUT + templateId: templateIds.LAYOUT, + params: { + // permet d'afficher le lien "Gérer mes préférences e-mails" + handlePreferencesUrl + } }; export const verificationProcessInfo: MailTemplate<{ @@ -203,7 +227,11 @@ export const finalDestinationModified: MailTemplate<{ }> = { subject: ({ id }) => `Alerte sur le bordereau ${id}`, body: mustacheRenderer("destination-finale-modifiee.html"), - templateId: templateIds.LAYOUT + templateId: templateIds.LAYOUT, + params: { + // permet d'afficher le lien "Gérer mes préférences e-mails" + handlePreferencesUrl + } }; export const membershipRequestDetailsEmail: MailTemplate = { @@ -225,7 +253,11 @@ export const pendingMembershipRequestEmail: MailTemplate<{ }> = { subject: "Un utilisateur est toujours en attente de réponse de votre part", body: mustacheRenderer("pending-membership-request.html"), - templateId: templateIds.LAYOUT + templateId: templateIds.LAYOUT, + params: { + // permet d'afficher le lien "Gérer mes préférences e-mails" + handlePreferencesUrl + } }; export const profesionalsSecondOnboardingEmail: MailTemplate = { @@ -249,7 +281,11 @@ export const pendingRevisionRequestEmail: MailTemplate<{ }> = { subject: "Votre action est attendue sur une demande de révision", body: mustacheRenderer("pending-revision-request-admin-details.html"), - templateId: templateIds.LAYOUT + templateId: templateIds.LAYOUT, + params: { + // permet d'afficher le lien "Gérer mes préférences e-mails" + handlePreferencesUrl + } }; export const registryDelegationCreation: MailTemplate<{ diff --git a/libs/back/mail/src/templates/renderers.ts b/libs/back/mail/src/templates/renderers.ts index 4f7321255c..b8ecba43f4 100644 --- a/libs/back/mail/src/templates/renderers.ts +++ b/libs/back/mail/src/templates/renderers.ts @@ -93,6 +93,7 @@ export function renderMail( subject, templateId: mailTemplate.templateId, ...sanitizeMailProps(mailProps), + params: mailTemplate.params, vars // pass vars to mail provider }; } diff --git a/libs/back/mail/src/types.ts b/libs/back/mail/src/types.ts index 4f2363c85e..3e14ba1970 100644 --- a/libs/back/mail/src/types.ts +++ b/libs/back/mail/src/types.ts @@ -45,4 +45,6 @@ export type MailTemplate< // optional body or body template to be used in conjunction with the LAYOUT templateId body?: string | ((values: V) => string); prepareVariables?: (variables: V) => any; + // paramètres transactionnels Brevo + params?: { [id: string]: any }; }; From ea5fac57fb39ea688dab602368d08a55b123ab09 Mon Sep 17 00:00:00 2001 From: Benoit Guigal Date: Tue, 12 Nov 2024 15:30:13 +0100 Subject: [PATCH 46/74] fix(sendmails.integration.ts) --- apps/cron/src/commands/__tests__/sendmails.integration.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/cron/src/commands/__tests__/sendmails.integration.ts b/apps/cron/src/commands/__tests__/sendmails.integration.ts index ac2e4965c3..0f5f142491 100644 --- a/apps/cron/src/commands/__tests__/sendmails.integration.ts +++ b/apps/cron/src/commands/__tests__/sendmails.integration.ts @@ -371,9 +371,9 @@ describe("sendPendingMembershipRequestToAdminDetailsEmail", () => { ] } ], - params: { + params: expect.objectContaining({ body: expect.any(String) - } + }) }, expect.anything() ); @@ -474,7 +474,7 @@ describe("sendPendingRevisionRequestToAdminDetailsEmail", () => { { subject: "Votre action est attendue sur une demande de révision", templateId: 9, // hardcoded console FIRST_ONBOARDING_TEMPLATE_ID template ID - params: { body: expect.any(String) }, + params: expect.objectContaining({ body: expect.any(String) }), sender: { email: "us@td.test", name: "Wastetracker corp." From 7f7b81a2323b2f44c35c6aa8860868df85c24897 Mon Sep 17 00:00:00 2001 From: Benoit Guigal Date: Tue, 12 Nov 2024 15:52:34 +0100 Subject: [PATCH 47/74] chore : update changelog --- Changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.md b/Changelog.md index a29cf09865..eb3e722c0e 100644 --- a/Changelog.md +++ b/Changelog.md @@ -12,6 +12,7 @@ et le projet suit un schéma de versionning inspiré de [Calendar Versioning](ht - Permettre l'ajout d'un numéro libre sur le Bsvhu [PR 3718](https://github.com/MTES-MCT/trackdechets/pull/3718) - Permettre à l'utilisateur de gérer les alertes de tous ses établissements [PR 3688](https://github.com/MTES-MCT/trackdechets/pull/3688) - Afficher le nombre d'inscrits par type d'alertes au sein d'un établissement [PR 3688](https://github.com/MTES-MCT/trackdechets/pull/3688) +- Ajouter un lien "Gérer mes préférences e-mails" dans les e-mails transactionnels auquel l'utilisateur est en capacité de s'inscrire / désinscrire [PR 3738](https://github.com/MTES-MCT/trackdechets/pull/3738) #### :boom: Breaking changes From 37a6b9f80cceab8c9750bf037591ee33c30dd3d2 Mon Sep 17 00:00:00 2001 From: GaelFerrand <45355989+GaelFerrand@users.noreply.github.com> Date: Tue, 12 Nov 2024 16:47:02 +0100 Subject: [PATCH 48/74] =?UTF-8?q?[TRA-15418]=20ETQ=20Transporteur=20je=20p?= =?UTF-8?q?eux=20r=C3=A9viser=20une=20annexe=201=20m=C3=AAme=20apr=C3=A8s?= =?UTF-8?q?=20r=C3=A9ception=20(#3740)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- front/src/Apps/Dashboard/dashboardServices.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/front/src/Apps/Dashboard/dashboardServices.ts b/front/src/Apps/Dashboard/dashboardServices.ts index 0c35dfdd32..4ac842ec26 100644 --- a/front/src/Apps/Dashboard/dashboardServices.ts +++ b/front/src/Apps/Dashboard/dashboardServices.ts @@ -1483,10 +1483,15 @@ export const canReviewBsdd = (bsd, siret) => { }; const canReviewBsddAppendix1 = (bsd, siret) => { + const transporterHasSigned = ![ + BsdStatusCode.Draft, + BsdStatusCode.Sealed + ].includes(bsd.status); + return ( bsd.type === BsdType.Bsdd && isAppendix1Producer(bsd) && - BsdStatusCode.Sent === bsd.status && + transporterHasSigned && isSameSiretTransporter(siret, bsd) ); }; From f802103c03ddf9d5a15cfade4e539c169502e079 Mon Sep 17 00:00:00 2001 From: GaelFerrand <45355989+GaelFerrand@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:41:30 +0100 Subject: [PATCH 49/74] [TRA-14898] Retrait du logoUrl de l'objet Application (#3723) * feat: removed logoUrl from Application (back) * Removes logo URL from my applications --------- Co-authored-by: Julien Seren-Rosso --- back/src/__tests__/oauth2.integration.ts | 3 +-- back/src/__tests__/oidc.integration.ts | 3 +-- back/src/applications/__tests__/validation.test.ts | 10 ---------- .../__tests__/createApplication.integration.ts | 1 - .../resolvers/mutations/createApplication.ts | 1 - .../typeDefs/private/application.inputs.graphql | 2 -- .../typeDefs/private/application.objects.graphql | 1 - back/src/applications/validation.ts | 4 ---- back/src/routers/oauth2-router.ts | 3 +-- back/src/routers/oidc-router.ts | 3 +-- .../mutations/revokeAuthorizedApplication.ts | 1 - .../resolvers/queries/authorizedApplications.ts | 1 - .../users/typeDefs/private/user.objects.graphql | 2 -- .../AccountApplicationsAuthorizedApplications.tsx | 8 -------- .../AutorizedApplications/queries.ts | 1 - .../AccountApplicationsMyApplications.tsx | 8 -------- ...countApplicationsMyApplicationsCreateUpdate.tsx | 14 -------------- .../AccountApplications/MyApplications/queries.ts | 1 - .../migration.sql | 8 ++++++++ libs/back/prisma/src/schema.prisma | 1 - 20 files changed, 12 insertions(+), 64 deletions(-) create mode 100644 libs/back/prisma/src/migrations/20241104091219_remove_application_logo_url/migration.sql diff --git a/back/src/__tests__/oauth2.integration.ts b/back/src/__tests__/oauth2.integration.ts index c86f673f48..ec6a569d0d 100644 --- a/back/src/__tests__/oauth2.integration.ts +++ b/back/src/__tests__/oauth2.integration.ts @@ -32,8 +32,7 @@ describe("GET /oauth2/authorize", () => { expect(res.body.transactionID).toHaveLength(8); expect(res.body.redirectURI).toEqual(application.redirectUris[0]); expect(res.body.client).toEqual({ - name: application.name, - logoUrl: application.logoUrl + name: application.name }); expect(res.body.user).toEqual({ name: user.name }); }); diff --git a/back/src/__tests__/oidc.integration.ts b/back/src/__tests__/oidc.integration.ts index 33b078eb8c..64485b6b71 100644 --- a/back/src/__tests__/oidc.integration.ts +++ b/back/src/__tests__/oidc.integration.ts @@ -38,8 +38,7 @@ describe("GET /oidc/authorize", () => { expect(res.body.transactionID).toHaveLength(8); expect(res.body.redirectURI).toEqual(application.redirectUris[0]); expect(res.body.client).toEqual({ - name: application.name, - logoUrl: application.logoUrl + name: application.name }); expect(res.body.user).toEqual({ name: user.name }); }); diff --git a/back/src/applications/__tests__/validation.test.ts b/back/src/applications/__tests__/validation.test.ts index c710f03011..106bd6a7ba 100644 --- a/back/src/applications/__tests__/validation.test.ts +++ b/back/src/applications/__tests__/validation.test.ts @@ -3,7 +3,6 @@ import { applicationSchema } from "../validation"; const application: CreateApplicationInput = { name: "Waste Manager", - logoUrl: "https://wastemanager.fr/assets/logo.jpg", redirectUris: ["https://api.wastemanager.fr/callback"], goal: "CLIENTS" }; @@ -29,13 +28,4 @@ describe("applicationSchema", () => { }); await expect(shouldThrow()).rejects.toThrowError("URL invalide"); }); - - test("invalid logoUrl", async () => { - const shouldThrow = () => - applicationSchema.validate({ - ...application, - logoUrl: "ceci n'est pas une URL" - }); - await expect(shouldThrow()).rejects.toThrowError("URL invalide"); - }); }); diff --git a/back/src/applications/resolvers/mutations/__tests__/createApplication.integration.ts b/back/src/applications/resolvers/mutations/__tests__/createApplication.integration.ts index bb333e366b..0bea20729b 100644 --- a/back/src/applications/resolvers/mutations/__tests__/createApplication.integration.ts +++ b/back/src/applications/resolvers/mutations/__tests__/createApplication.integration.ts @@ -30,7 +30,6 @@ describe("createApplication", () => { variables: { input: { name: "Acme", - logoUrl: "https://acme.com/logo.png", redirectUris: [ "http://localhost:3000/callback", "https://acme.com/callback" diff --git a/back/src/applications/resolvers/mutations/createApplication.ts b/back/src/applications/resolvers/mutations/createApplication.ts index 96678712ab..3cfaefda8b 100644 --- a/back/src/applications/resolvers/mutations/createApplication.ts +++ b/back/src/applications/resolvers/mutations/createApplication.ts @@ -15,7 +15,6 @@ const createApplicationResolver: MutationResolvers["createApplication"] = const application = await prisma.application.create({ data: { name: input.name, - logoUrl: input.logoUrl, goal: input.goal, redirectUris: input.redirectUris, adminId: user.id, diff --git a/back/src/applications/typeDefs/private/application.inputs.graphql b/back/src/applications/typeDefs/private/application.inputs.graphql index 5e6b7aca1d..dbbda6ff82 100644 --- a/back/src/applications/typeDefs/private/application.inputs.graphql +++ b/back/src/applications/typeDefs/private/application.inputs.graphql @@ -1,13 +1,11 @@ input CreateApplicationInput { name: String! - logoUrl: String! goal: ApplicationGoal! redirectUris: [String!]! } input UpdateApplicationInput { name: String - logoUrl: String goal: ApplicationGoal redirectUris: [String!] } diff --git a/back/src/applications/typeDefs/private/application.objects.graphql b/back/src/applications/typeDefs/private/application.objects.graphql index 104d43761b..8ecb698971 100644 --- a/back/src/applications/typeDefs/private/application.objects.graphql +++ b/back/src/applications/typeDefs/private/application.objects.graphql @@ -2,7 +2,6 @@ type Application { id: String! name: String! goal: ApplicationGoal - logoUrl: String redirectUris: [String!]! clientSecret: String! } diff --git a/back/src/applications/validation.ts b/back/src/applications/validation.ts index c264e5a9e5..9972e77475 100644 --- a/back/src/applications/validation.ts +++ b/back/src/applications/validation.ts @@ -4,10 +4,6 @@ import { CreateApplicationInput } from "../generated/graphql/types"; export const applicationSchema: yup.SchemaOf = yup.object({ name: yup.string().required(), - logoUrl: yup - .string() - .matches(/^https?:\/\//i, "URL invalide") - .required(), goal: yup.mixed().required(), redirectUris: yup .array() diff --git a/back/src/routers/oauth2-router.ts b/back/src/routers/oauth2-router.ts index 7c19bc79a5..88832c270a 100644 --- a/back/src/routers/oauth2-router.ts +++ b/back/src/routers/oauth2-router.ts @@ -44,8 +44,7 @@ oauth2Router.get( name: req.user!.name }, client: { - name: req.oauth2.client.name, - logoUrl: req.oauth2.client.logoUrl + name: req.oauth2.client.name }, redirectURI: req.oauth2.redirectURI }; diff --git a/back/src/routers/oidc-router.ts b/back/src/routers/oidc-router.ts index 46d65e9f5d..e8b5d74ebb 100644 --- a/back/src/routers/oidc-router.ts +++ b/back/src/routers/oidc-router.ts @@ -54,8 +54,7 @@ oidcRouter.get( name: req.user?.name }, client: { - name: req.oauth2.client.name, - logoUrl: req.oauth2.client.logoUrl + name: req.oauth2.client.name }, redirectURI: req.oauth2.redirectURI diff --git a/back/src/users/resolvers/mutations/revokeAuthorizedApplication.ts b/back/src/users/resolvers/mutations/revokeAuthorizedApplication.ts index 230e8633e0..741e65f99e 100644 --- a/back/src/users/resolvers/mutations/revokeAuthorizedApplication.ts +++ b/back/src/users/resolvers/mutations/revokeAuthorizedApplication.ts @@ -41,7 +41,6 @@ const revokeAuthorizedApplicationResolver: MutationResolvers["revokeAuthorizedAp id: application.id, name: application.name, admin: owner.email, - logoUrl: application.logoUrl, lastConnection }; }; diff --git a/back/src/users/resolvers/queries/authorizedApplications.ts b/back/src/users/resolvers/queries/authorizedApplications.ts index d2edf69bfb..0adab60bf6 100644 --- a/back/src/users/resolvers/queries/authorizedApplications.ts +++ b/back/src/users/resolvers/queries/authorizedApplications.ts @@ -44,7 +44,6 @@ const authorizedApplicationsResolver: QueryResolvers["authorizedApplications"] = id: application.id, name: application.name, admin: application.admin?.email, - logoUrl: application.logoUrl, lastConnection: accessToken.lastUsed ? new Date(accessToken.lastUsed) : undefined diff --git a/back/src/users/typeDefs/private/user.objects.graphql b/back/src/users/typeDefs/private/user.objects.graphql index bcc53f640d..11cb084463 100644 --- a/back/src/users/typeDefs/private/user.objects.graphql +++ b/back/src/users/typeDefs/private/user.objects.graphql @@ -31,8 +31,6 @@ type AuthorizedApplication { id: ID! "Nom de l'application" name: String! - "Logo de l'application" - logoUrl: String "Date de dernière connexion" lastConnection: DateTime "Email de l'administrateur" diff --git a/front/src/Apps/Account/AccountApplications/AutorizedApplications/AccountApplicationsAuthorizedApplications.tsx b/front/src/Apps/Account/AccountApplications/AutorizedApplications/AccountApplicationsAuthorizedApplications.tsx index 43baf6bf97..c0d79b191d 100644 --- a/front/src/Apps/Account/AccountApplications/AutorizedApplications/AccountApplicationsAuthorizedApplications.tsx +++ b/front/src/Apps/Account/AccountApplications/AutorizedApplications/AccountApplicationsAuthorizedApplications.tsx @@ -50,7 +50,6 @@ export default function AccountApplicationsAuthorizedApplications() {
    -
    Nom de l'application Dernière utilisation @@ -65,13 +64,6 @@ export default function AccountApplicationsAuthorizedApplications() { key={authorizedApplication.id} data-row-key={authorizedApplication.id} > - - {`Logo`} - {authorizedApplication.name} {authorizedApplication.lastConnection diff --git a/front/src/Apps/Account/AccountApplications/AutorizedApplications/queries.ts b/front/src/Apps/Account/AccountApplications/AutorizedApplications/queries.ts index cba2607af2..6df548f96d 100644 --- a/front/src/Apps/Account/AccountApplications/AutorizedApplications/queries.ts +++ b/front/src/Apps/Account/AccountApplications/AutorizedApplications/queries.ts @@ -5,7 +5,6 @@ export const AUTHORIZED_APPLICATIONS = gql` authorizedApplications { id name - logoUrl lastConnection admin } diff --git a/front/src/Apps/Account/AccountApplications/MyApplications/AccountApplicationsMyApplications.tsx b/front/src/Apps/Account/AccountApplications/MyApplications/AccountApplicationsMyApplications.tsx index a134e97036..d9addbadba 100644 --- a/front/src/Apps/Account/AccountApplications/MyApplications/AccountApplicationsMyApplications.tsx +++ b/front/src/Apps/Account/AccountApplications/MyApplications/AccountApplicationsMyApplications.tsx @@ -76,14 +76,6 @@ function AccountApplicationMyApplicationsRow({

    - {!!myApplication.logoUrl && ( - Logo - )} Client ID : {myApplication.id}
    Client secret : {myApplication.clientSecret} diff --git a/front/src/Apps/Account/AccountApplications/MyApplications/AccountApplicationsMyApplicationsCreateUpdate.tsx b/front/src/Apps/Account/AccountApplications/MyApplications/AccountApplicationsMyApplicationsCreateUpdate.tsx index 7bb386675a..3a78ee4e23 100644 --- a/front/src/Apps/Account/AccountApplications/MyApplications/AccountApplicationsMyApplicationsCreateUpdate.tsx +++ b/front/src/Apps/Account/AccountApplications/MyApplications/AccountApplicationsMyApplicationsCreateUpdate.tsx @@ -32,7 +32,6 @@ export const validationApplicationSchema = z.object({ message: "Vous devez spécifier une URL valide" }) ), - logoUrl: z.string(), goal: z.nativeEnum(ApplicationGoal) }); @@ -89,7 +88,6 @@ export default function AccountApplicationsMyApplicationCreateUpdate({ useForm({ defaultValues: { name: application?.name || "", - logoUrl: application?.logoUrl || "https://", redirectUris: application?.redirectUris || ["https://"], goal: application?.goal || ApplicationGoal.Personnal }, @@ -174,18 +172,6 @@ export default function AccountApplicationsMyApplicationCreateUpdate({ )} -

    -
    - -
    -