From 0ccc0a16ec0ef8f8851cd535ed120cdf885836e9 Mon Sep 17 00:00:00 2001 From: Matthew <43279967+gladius-mtl@users.noreply.github.com> Date: Fri, 11 Aug 2023 14:45:26 -0400 Subject: [PATCH 01/19] Update steps for working with tags (#17751) --- docs/assets/github-branch-selector.png | Bin 96001 -> 0 bytes docs/self-publishing-spartacus-libraries.md | 47 ++++++++------------ 2 files changed, 19 insertions(+), 28 deletions(-) delete mode 100644 docs/assets/github-branch-selector.png diff --git a/docs/assets/github-branch-selector.png b/docs/assets/github-branch-selector.png deleted file mode 100644 index 88545b95b4d219cc0d41e384133e16d1663076d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96001 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�RH1!9Ss$ z9DfMIj$CzU8!`53a15PS-WdM(v33tlMmU9tdMEWFj%bIuPDi5r7!5X3xx6e0cT>$Z z7K2NP=8OLFVZEhQP@&~mBT3E*%4u;xoZTBaQ8pI*F9L|JQsg^A(5`Z1F!ov_P;$}l z*Jaa-7I%@Vqpzd33a+2XX@8fc`G8l2)U%zb5B9;yPxzM5E^3-0a3L1?vbV1}yp;r3 zYd9M7(7pE`GN?>st0S8C3CzpK&($tO7=b3TUL0>-e(6e|i1f!IvkK*pLRDjcFtN07aE8`M zL|Ci+jBS77cNC2Z6uO|OfVtt(9;;Dwl`Y)Od;VvOUJ)%pN?|@)4OlqsHhYS&UJPue zUSDM4o0y96qzZ6-@WT-SI)2PCNTfWIN^DyYMq9#}^sejv68Vroq-m#=@jriX3%zxs z2nS+EpNBTaKzE_zAq-Aqs%%T?2wo7)_sWTGGL&%Jy{7PQ)!Rc%VF()}N;rrT|B*gZ zGsb{oCsQbGwq>A=u5`Dp@i2x12K@6)nfB*A0f911Dm;q!Kq-+eW2CuQei@scXqkR( zPhG=)R(gME^gnHkCompqqjvAMr0~j)7+%HzyzL&{M+ycnsxB!!2-hkJ;H%0KiL+Z) zlyt@t&DT1b^=0EYC5V-A9GKd#eG>h9#sR61Z+$S|nI72?qek_h?kEyTX^m`Dpq(WO zLk;>1+K3sv+!$|7$9~x!7ABzQ;d@Ioei1@Dl6PB4F`u0BChYdxEjw<6@wmF>8j@Ok23Ycfhb?|uHZs~d( zMY36;^-8*SLBRC`J%Cbwd?vvEdvte&X4AL=3;HMo2{{N;l6-bv!bGTT)J1=kW8CPp z-$F5gO1ntGo{+c?pq?W65*sdt4Kd6w^J@W)Rj3(a3{^(zH=$3jv`6RXaT z#yU_ANq8FFdX5nQn=vDsJq;iR(*~7kd$w!NL#2f^6>uU4XW=03(SV8NXaJ=%^D>7< zdjmh5(Dk_#h4bf4q6-4_BHez%l3TrC@88;uSD{fUAxva(eQ7f|!;0Ggy~Yk{*Ed97 zxIto@+d>ID)k;fD;F1y)j7%Q)i6;;?QsNj;2tdn=gGT%Ojm2`URC(pa`y+6m>k|wf zkA&KG@ozcS^id_ws%ehIVU6>zAub6-R;(FR@CxkG)weDqM6p!$p<1hh6^yTS#Mvt1 z6iK-f{`y!uhH{Zcwp1D%$c1DS9pOD4mr65j`LSEtEpD&?%;~Fk*Ez_1sY>8T{9xZy z&$ph99=OV1TDM77Tm7Mmxn`0{@3fWT0BdRwp0{@^r*C_I?6b}p%|{+b8|QNf7X*@4 z+y(^naYtos9ZDDqWo2e&2MlU1n+@gJMkA~ZovyNn)Wt@CKtdqyvZLi}KTZopayaeb z!g$E(p=s^F+xlSKB~LjmYN^^5*(JnwCc%u-d&}8BkvRsQR<|RlQ`al-2DL2Pb*yoz z)+miKuY=p`1|`e!vf!o*mkFb%r>eeOEsKk5^u2U38}i`qa~4mRY}Z!|CKn1X3`U%N zDrGRum*2DaWppnOs^<$8o1h-Bsapp(oA7u+)4Y+Q1Eb9JS8ezJ2c5>#y=<{uFzq2D z(Xr0t(yQ72Fp4Ldxa;F1xOA~pI@q*tcCpHRy1}brVr0?bYzfk{gV|y+&vrIxRAJP0 zu~K{SFoW9}?%)8;#@3d9)hR>iC6)Pfx<=9&HTqJ+WB87B~|SC&ax#hq5f``|b#H#3AG)l)JLok1h9PY40QHyJ`qK?uSWl&L0%cY$by zocq)zR&Ly_NYRbtuKtbnjasWY2FdjO#XC<(6#^Fa;ba-NKq5(~)5Fy^xqlT9T+OL} zygSnYHz-sDA-Gm!84(_C!11o@=aLWy*CrWX8ho*$obGluDJpHnOm!FnSiI zCJzO+cU;agTMjwW(E+Wc5DN3Qr{x_1|$?XFr3o`aS+>~2yGBm1oJQyv04 zwHghhOPvPjNz~7h`{%1&_{5^`pcYhA4(Bt7fL??@%S*S6%d1VmFYyp|p;TRaVCeIv zZS?l>Q4}A^nf3QZzQsiawe5S?3;3fLN*y20^)ANVWEMP-SPXi6|Bk_B8BjW8Z8DkZ z-{wxZw6c=T?=P$D_VMOAovp+DZ!&|TaVnaXU-KCm4Q)vD-+3Knd;5B?9&b?9THI(_ zolpH_a90fWOPSRk7VYK>+abRifO6DZ;Ysgdh5=3P8W?49da1RmvBR^WoZqN2RTPU( zkCq1~+lmRbKBRH}6eP}hhWQIS;9YKuwVQ5!Gh`P&A3sh#R(-C@X)sr!jlAoH1?KMV4m5Iu0&=+_NnTzg zcGcLSaa7=j0FfL&un{Pf2s@)Oky8Tsxg_X z;R6E8{@~-l-mcF-va#dyTA}m3xcn6=trj?LD;dG`|WJX7k0N z&Trr4x;kY*+1ZWybtTby!vZjadC5KscZ};(y#O6jO;&lVYL&L&0Mx#+*Mg-wgX0aT zB6D_wGN}LHZ=5!|0k}QC@j9E>0_ zEX%c8RiQ8Pl0*QxM%0TP(w|+(IEklm9zk_3{pvQ$eLOb{TX>fRbw?jAcTxK$mxrV^ zEEe+dmq~#yZiD?RqRS;tP5PDr0m9~$<(`3zIL}7|woI?gd#18Pw4<(z)?_zHp1#H8 z-($tA6i|%Gfme%X38N88J{7V?H)RT4G|A+Tz}X^M;tm5hhl{nZfWlQ7BrsTYG=Wwe zxiV|WeFMAccj=qQ9NBjha&nK``DDsU_FsE{|0v>`j3$VyZ@9o|X!Uf2w2h9YFnqH+ z7?w#YZF|XeU0b``i9&w7SdZo%Nxk3d`R0kq{1?|Xfl3ta-N_ozT(da|us%+OQ`;=p z87b~Wh1U|y2@&E0)}b8A8P&Eo5jbnY#a{Xdj`!24onv96{r8$sU18*O47EL=mFhOf zD&2Q`f4!IANvQDs`0Bg$>}(s@Tp36cqpx3;IG|iMwjd|H)nL6El+Fxia5WV>>K=P} zJiINaCn})mhu~rjdeno4*wS1>c9*~%ok_g%Gx{}m*16Rg(ed*9g5*SqQ7DZQ z#P19D?i^m!G?$5^{pFMIQz2nQ(4~tE7PRl*KR@$q^MX=1#98Nt1?zA|6Ms|$42>$E z%Eboow=f!s$*uQPdOv0ZbP=&E9?$f32xyaV;uvC0xcld$ZNd8yyj(6&x5o=^$G_Io zU{yTJrh7cF6?R)rfcQATQoRm?=5c2L`pTnD01R4hw^doK(WP_RZV<`-;IE7o?;sF> zDYH!e+~XNyWsQM0&U=o)F`i5f$_sut)z!VfECb!P?uzKU$k4nRdt!hfE?eKy=k-et zV|V`WD?Q{#Q|!y8(L~;CxWbWWRI4?BNj_YxF_6FgP;36ZQjJyip)TTg18o$V&SccO zZAL;1`U{aBCyAMboK7XMpR9U{c)u{TJ!Mv@-dL$s=I}TUW>=zb1-NouBJ{ql-pLHi5pI}H!jceV+ za}EhCp&f-zdovc}o{^NxQtW`h0=4>FE!ldTBeUC})Wig(=X_~{ImK*W9)zW3`N;FH zR-|&E2UT9BJn%EkU#rC-i8Bv&Aol6>61hh*?2H#Ej3M7%mDF_iW&O>n(3~uJL#h=b zV*!AZGUJEXf^Znj=1M~eC9}urbk**Q3odCC{Ag_0sn~2L7alMK^3E4)uC)XcebN0B zVF#ceOb;eEEWd+O=Zpby_q?N8O4{sIIeChvlf6Aj_t)-WUYBr_Ot7dY-Vq9te}}#M+A~TmlQQWM89yi+!`j_n0a4A zkeO|RK2rw19rfH%LAXdM%S+}BeZ_-dbe3oCVFc1!cIdC3*X*bLy^<`S-;orZaQ8U* z)(J>%<^nao_F&LGO$c6ioLDX5OYck<=nZ%qWOf`!OF0=>GJ6LV6&0o*eH^Ec+MMA$TV3c=)R7_JWecIHrCgX6{|QzsL>S8t+M<>FmSjFhhglNVRC+Vs#f@? zoy3uZJ>+9C&+XL@%}q6_Kjz+nO5%+?sYk)C&*@x6m&-r#9nKe!dfpB&{3>e5#HZNPrq-p&*)dlAXv z0v)zLwwu;sLqoSFzLF!N` z>C8E5UNJ1>nxr9<#d|OsLK77gRZje)^pXz_?)ln)lpl0{-G%67*1pr4WV`DvOhDt= zYyaYBHvD*M-K8o+;r_W^ScQ#%kbMyd%=`8az=U%VU1X9@s8l=T2%`$*Tyl1M1EC0r z$2X-dui9O{0bIY_ojV-G&(m^8>aC|g#uB`G&+*ZDqjC|M_!{&fCvkJ>hFB+Zyj~3o zH_x%@`xRyF>q-b0zj_02WE&pD;nggpl<6WdYH=tmG4 zt}~>ONrQ}LMBT=*3Q5T)@G3)LLlJ##8wM6*v}kST4SI?~Ie9K!tv)hDr`6U&e#Gpy zCP^6L;&3^z0ReXLiXPpjt`}Y&x^p^(3~J4lgdZXZ=I|d%THB!kD%Cmlt4O6t*3idE z6(Smik?Tn{3Hi?wlRRI)@Hoe7mLGpE|M;j~ZTz%h*B&Ly4(0d|tQc5M?Vn^^XW$*p z1;snOwq?`&Ew)&aCq|V?TUjhFkN2gbTl-){D2i^7%T|-|>wC*|B_59B=TZ#j zV*3>szB-L=EvA9v`5ibykV5z-i1~O=VL`Dd7?t1Vf_Y(y(Dm_}8WbH;}vjwI@LA(yiQAs(<36t<5e4rcO1?k9T#z7sr^kK6MgKXCm&AMFX<=1%K6n}yr zw*k-N(|q+eN$t4}S4>2moN6yB7%A`H9&PrTeWAFQN;Q1+Zv8!}Rj_$J0JT!wA*jL8n=cX(o+BDUl-DJ<8Vz%M5>AUiR~G#xzy|?Lo>cdeee~nu zHke|>e#f~5yW1ND8l8@L{j$MOv;jc8X?8qKntp3abou=FCiP^%=wgDoac(^LcX_Gv zc9ShF`hUOeKR^n-ya%fOosNAjKMEnlpHHZn?0koUVC27FiB9Qmt3Sg0Wiiu?_>T!m ztzL&k)-~(mHUzWOYR1iIID92DX|VKU-SrVMwU`qm9vT(iEy+arg90=c;!2SEhl0#& zgZuqpN3jSA87T0%#BxA8U)%^T)^9~R+g<5Rr<#V-10M^)E;d?%g~OA#?ndf{kJ1qn zDV6yie`jrfyuUsy1|5 z>wm99y*^$JJwv0%(zvUv(7k9TP{`wW&|F+x9IclHcmCP*&Vu0mOvd=>#st*e{6h^3 z+FY)Y05Y}we*7rL)Td+$=JMg|sqbcv=3-^Ba$BJ})ep~ujuMlJ^gsaKK^dOi=B^L( zvHef0sttIlsd_Vmv*k8;Ra)JihjYzpmt#gQuR9E45g0`yr?VwrVacT4*NtxgpZc3N zr}Olqu(xe2BBBdJ=x_~!OE4(Z-pDhYW^!Sm53q!-Wqg__%cNdOIcG8#>kdEQfuL^S z3Q_R-rT`xt9ur(s)BWyj9#=MtXP`GQ903U_tkctNmJ+0Jsm;1dXDfrvHZDlcI#1|2 z4&v%@sN4E`EJj^l^83s7N<$gO?W{|_WHR1-nJTfq)0bWE53ooqX1=yYt7`j0+Owq^ z=oT>uEa)Eo9+JNoL|j@;#c%6vk5}JAflu0&Yd&A9*7=4nmBoO3doZE0^Sdud`e?nb zO(T|vi7DWq!AhjdOLr>w`!~RocNH?=Rh>Ggy+z?}3DZqI%mP>j>1keRF0%r%R3Ok-8#_BS*B9N>m(#UFE!*#f%&Q{0)WnGS{c}S9%&A`5r$WE| z=vDjjmCa=<+s}4ySe}&SyrdlNr63y#6>^L{PEfFwZ3a~#o9mQv) zO&7``-5#E_=51}NiRC$fUb*M&-x(SyK-&#%ta7={b}yUb4GM_AzkHbr4JpDh$HB>o z-yMl5yB3=_qRFHi7OG1r-=3zzt5%y64U?%{7PWPYGIWwk(v$6-tln5=Vq&6%#d0oY z=j-q6ZL>RD@?V{LA6h6>5@-rYvjD1^gx@oUItg89>-dMb5Cp_mLW2K{Glp*v=J=Y! z4sHoxu>nYfLS*My=CK5t$m2biZowvMy$_P1V2i~nV(Uzq1 z_FLI^cJ({6ZASGX4o8A;Oh|ONB*P9$)kYYZOs)!4@vAzUZGjiYi@^0n;^FwAX!(#C zAO$HVnD;%Qd$rD)mr|Jmo}8Rqd1IcL)#-et0*6KCrK8^qsebJ+uSsNTHD-|T~E_1wWdB2!y1ca`rmu~H^)Lq zTkMY1?J)j&ZNga}}bRH{^z_v;eF1l>eM+2Z0sx|V7m zmQ4%`@`QJE!Mgkk5-VwxV>YO1993w}*>Yr|!;AUFf7Tt{6zcoS&c~3!j{umtjf9f0%3YHm!)x3KAHjjS55rmEoA`2bB3L*_>M?8Oz*SD|48_Di)nk%Vhl_{)3Sj| ztvcH-%GAP!XVU%St0r8da*ky_9G5{{soNz2 zhg3Jm)!Y=whRiOVP(Zi|K$dbu?n|p1>J+6-B5(@VrF-u$*4xx1bjn1d@FeHV;%7`G zYiSE5FMW`UWVR2+)7aeZD2&H5Gm39b0|9=&Z8BFH;5r2(Dyhg(8w3P#(6|s?u-Knb z{&N}sY$g{`PZXNQa6AcYcPJ{T>G9i5?s<4Dv1p#daU2GRVTg(ljg>;pFZO^guSh_7 zemuK8X1{aUwRLd5dNfr+#dA3gy==zj&<|l(nmtwMXyHIqHP1UjG+*gyg2YhtqXHFj zwD|TEJ1=B`ZhXcVDK9;#%F}NBC2PSSf4rv5f`E%V3{`lQrGnvha@lkvw;`2SH7$v6 zdNF(|LwD0_4~PFZow#SAn_w`E3LIj^YW>hKzG$B9?%-O)hDI@OutenhLhJ#>jYm&r zM`w1<%4AGdx$6V966{5+J`J*hx48PmSaoH8V7I8KPZ!(@`s!7gKE@)g#^d<3)fO^d z;VYJ~P(X>LqmZ?hth?*F7X<&U6q2JiQWM_gXJZux(3qw!enc4 z^Eh;}D5|TS-gcIaSGY4Sq*-5*8c#8WEb*hxV;PKx*jp^*lPrk#00{9;1eZxr0o~y3 zg^u8Avglfe`Xt3c7&v-XcX(ap3`9mq)ij$x7s>uK%=yS>7WQaLeJjh}T`2-Wv7=h7>2terK!C?NWY|g3JL6f5zNRAk>aqiR~?k_km~^ z+F;f3O+z;~L^MG^*1@f#Ox_MnJ)QxuaAer*GB~~_opiCwBl7*)J2v7!0MkJd_wlCZ zm>TZhHR&X}LK>lNKu7jX4&lTQ+Ym5*+s_V-jIOK{y_)r>hwPN36(9_${`>W3o5%3k z2WEN2EEPcQ)78b&v6m7W1BwYko(n;G zeY)Jfj~|ozxEHWDxM5ILRUp3ZR}PzuYJ2a9e{PtS(Ao)7=gbY_uT;q8Va25&j*^sX z!fH@sY!LsMdpj)1o8|ToVWb)Guj)r^zOQdL`;xVP)whmobR^aWl-EFfA#SnYK1~+q z*SM@UJDNu&TmNrt@y}6gpaLn@P=eR9K{&PG^-vYYB_?dYztA%RQSu+}#@UeN$%SQh zT(YuWKZFIzzK4A+shBnhO;S)l~RfW$xg{1TO#7<|KfaQ;D08yY13(U z`I?Lc9b2%Wo?q6Azfhps$0EpcA3VIWg4Mb4J+}eDJXR9-7QbTew>we=Kl_s&sG3ss z6#d8=45EGx1luF5hpdC((U>z;#76M@Z{YaC=6Evq-N3?S2MDfq4|T~Ac5N(|nlT3? z4`aWN{y!E#V)Q+S%Ts;xrgX>INulgFg&zwWL;81nr z>RqtOn!0-Wo>O<|yb3fcb5)^+VMmv7F36JPFVI{%i&y(&1VU_%LHm6_Al$u>=%O0^ zl%rUx$5-JCldQej)9W7)cpP6~YK_Ojv|8+b4NYiMsFXtly&-s>2xfBqE_uX{yZdhs zzxoOh(k%(ZrOWjrVimx%GmO#FvOUjKNMF=tgo+sb^91B z%csA`;uvJ~q`0qwywd?f2+!KfA?vMnxI_3_O!&syxkWDk%zNo<<8_qSR>yy;G9yCl=YQHlSOcGB16eLWwRdB z``2V<$BC%I{%GRW_~N_1;DR+xI-4uf{%C?iuxuueARa3#$|FUg(OA*{jDf@-SbZdX z21SrMAN_+XI2*66-DGzj^($3BXE|Kq)Ds6TJvA=hXg{O2I3>*x8>&s;WBr>135c2d zs?-RnA$k_Q`lv3u^y94|sM9G2DC5#W6=x|X&-&*cT_0dhSu6#BO9Zc#KRYQT(5iQb zWPeRP_KD>)^8-1-YU6Wo4|Y8Q6>425@}eWvU0IMu-Onn0Szbdm5A9AnRAMijJnE?i zbCsdB&v76DUv@q2^R>FRvA1Ek&$^ufc>~B2!jB8rj z@)hQ&Z!FvJ<(f@j-(S3P3aS65Fl&ZR>w4pr(MEbh;BtF`eCs-?ipt_~mq@aegu&uM zL8sI5bC2yc-E3r*NTmLQfubM+Y)?QNSTrQTwG$uXChHac49r@2EpOwgYHFQvu?kxC4*`~CVt+H{KNqu;1$Ku zKz5s)YOm|)Uf7#jhaUanB2XFA75Sgnh42l41S}>cwpO7!v2S95QN}j;HvUg3>4*Pg z=R>ZM?U2gA6g4-Z-lEPpx}=q0A6I!w9LVkLOTVqxbjnkN2Qm&da0v-4Eb9>R z?O^rr9NM4q+TJrqjK6=S=MgG9r`*F(D3#>sE}jzpmDEh|m^Dm(?0)0*=GDs8pG(>P z`=`z!vL}U6xhaVF(0Zd*T9?{-gNp50WVW;eNZXgnI+assHZsX%vFA~TrMggSmj)m? zMPe2cxj9sj8n`gci`Pt*x(~)$hc`czjbpqBWrk+z)U* z@Nv=|cWBcub_;^pZC`9%mrRDiRO5rItE+R9Nu|cA??D)zJH*_i4fLT zG2sg&lV{-Wvw95w9O$VveiS*z5R1y(TR#lR^Xel*b^`otp8)_ejK?O@SE`Z1Y(NS0 z;T8z(2k?^l>jFmz5rX&Cy_gIfiu%Uc*~j6Djii8_3HJS`P(>01$_gJ1`J<0k6Mvm`9daN6_Z%!DT7Hm6r(TU<#Tn(RDO?c7A?;-AqJH z;F8PXzAYh!3o2z6948PZs$_EcT-cXchIi$+u5@lFO)f zyI?rpMfWAl1`-|s_bTYk?3rP(*rD)zp8dqCgjI61-y4p?oFyanY;};Bs+k3yoKNHM zOzM0A6j;;wt`;8rJJs50DiRT3FW-9yn47TND%5hg1|#0p$HD$ee9E9xYn6lUR-UJg z{2$idDy)vR2^J0nCxHY41b26L_dt-~PH+hjoE6;N-QC^Y-66QUyE~jATfTkq|IfKO zmn>$Dt(ktitE#Kl4}E*3aWaYC4_ay4fs9gCa3gc@CANotT3feIn{k#|ynq==q2D7* z{EbPh6XSu?;&A;)UcIwf&Nb+q_e1t9ez{hz7Hp4UPi}*UulqWfw>T3E`~Fu(Xlt-v zettd@N(j@TeqGeyf)QtN%}2RaZy$&?;h!Yxj?8eOf)39=Ne5EWOH=mBD;2%t?_2OD7~HH;*DLbr*qyXVz#$l@98#EGN*&entP_NA zgbc>zq+|Pa5$8kIN91+_xyW&?(^iJ$MbKhz>?PW~p3{i8Qd$?5v&yDH{JN+P_V$w= zwq2P*S0Rv^*S|y+<~V&t+qSpn^M2jE@a1sXPSK$TGQg6Dx}~@2nv#uLI^CY)H#Id) zs!QUi8U`AZoU49KU6zF(_@T545V$J|k6&85$ZAcRH0D_KLxitZ$8+ zonS7ouCK^>lvS zW+LadZq9N%EoU222${i~C>G2~_Sxw_Yhs5bPkj@JaqXcfxJtxwyYhC0Q))ux=oX_- zAoiS=xce$Bm$$60P@_;J;2_aP492MmVi!8!i%AgRFt}^CMGVUTTSP> zj?t$K`>ySd2R<4mHV}N_tS5opsb_Fhm>UwVzmGZOCg z12MN$>c^mPpkf6UZ_FE&5{BpxKqA#fdCnI7C-6BeK-|uCjDChSe$5A~EK|2An2YF5mvnlv zQ>M9hZ^Os(9sh1Ae=hwb^oB=>ij};TaZ1u7$rD`)tkL?7?=g>$^`e znW53Z>4#p84A^F?f}?I5^zB4o^R&1)Tt5|UuPDRGT}>DXA8XMp@cIAVM@pT=yqyZ{Cd zF1s_P>`Wnu9k7~p0;b@ZSNP=6fN4lq$-l+Ap?9W^js{@tH%y%<=?{ePfH*#`IZ}y`6H&(@TXxZC$ z>S>!!c)Ji+u02J^3B=6>AT%Sw#UcM%U;!K?wk=aMwA|&wPQB&VdqCDlrtteMbpn%D zJ!rD1l=*;lqs>(`ddEC^U~4?XSdhD{Q&d`Kw8gW|`UXc`LqjIl040h>MSbg~*@_yx z?_6I;CjdEjB+R>*nL>dokg!*3ZG{{9m1crG-x0p(xym;;SLhA((U`MRE_Xuzyztg# z_`aCzSQdi2(SG`7Eph;5b$8dVRjH^OASuKz*$KJ0uz=|XzB_jS_yr@hCIC5>Bdp8D z$(jF)_uUI@wW(rvzg$Wk=zt}O!9XZh%1kDYk7r1$2}?9IS!TN7#3x9gcwb?>%*9MH zjtl-P#tBA!d{PuX-zKqO;=(4Lk7I&ogD6NZFrK&%&}Awh+TE<)YGvNCaRYJjR|tjkN_RELbtp3 zQAMi~zAF#w6sxB0X=?O=JdPSPfRws7Cu7f7n@d^RM~?{5kg&b;o8`lP8Ge1wQ;UX!;!NOqUF z8)QQ0s5O#^V6=WPJ5+s;G~>iyVgu$n+d0h@m=&Jsty^{G=8*a|{7pm~*z z+#XjbP?l18ghLxBJ@G^ZUEY!l2ndE#s~J%D?~;y2E>ynYHP{+UPuEfu1aYdI&SKcF z{nl^xE?12nAX3N7cjClU8%k>Adw+r27YnV_*WPu|^EHZ6?)NUc-3hmtVq?ZH37u>> zeLAPhQW$tg?7}8SdTM^f-tIxSjAO{?YKC&>$y@)nKyL*kueL_Qp8%U{yVSvVw3=CkBfp*;9Imh(QTyQa5@&~kFfb@g>)Wu|EyEw(!}JjHTy{+t>u zlztR z>;`}9scRt2+2S~(#;*0rmNrXzG=Z3rVf>VeQ`$(d54330*`eMSToid&c6NAYy(OPs z`dQSA+M_sub$sWXt2x8w$dH?McVaz|s3sJH_oKtvcoY}@X$|Le- z8x3S#|3ODZm9#zI-D;ar53(`-Zh*>+N#*6kOie|VQEkD$#jXL*^hBdrR#D|9*g$3o zXraDj{%m(DALy18+tDsf!a4@6daIq0?21{C0DRL>zhHv>4n}-#Ht7vxXd>k^r_(!rJ?G8S z%lJ?$B3WpE2MH5gVW82n;L{&S^iQC0)7gw`Q!HVJM=gZ(1i4^yiaTh8F6)IC7^ENQN*9a4d7EAIS>4xyPb$powo7|9Dat~@_wVI=@Z&oQk?FQ1Ob0%Uw z`WGP`c_!mHG&j6YtR<(F$0^xjw^!iJPaCkrfp6tgo$pfai(rqmx>s(|;U@X|guKRN z8G^=9A~}Mt!BI1=bXTB-_{eTSPa>Tt=yA$SEtQ11;=Dv^;-az1Y=lx}I_0`gBRi;= z>LWg9Bpy|s=|dKN7gS__wJ$HX+yj6I{)(h6o)8a4GIK;89_{5q-h2rpZCcP*bOdld zTJJmSpu}#5{olB{cXZllW%~KiMHh$c1|JyHmM$RvQIgT5zCKXypTymER<~^X3sSrv zxh7$&$avw9k(aQVlg* z=V8G4*=6=KF;VMdhGWFMv?Ok~M=Vj+H|2k`0c~)Ws=o5{JPC^EtN>2)RA2I7?=C;i z5<^qdLd~A}vERzK-NesT4E=XDRwHip@G-wLhDpN-9Tn9xzaPz%YGs-i?~9w$&^vzu z(u|`2q!|EzK`2A#%JaxzSBH_YRSf~M4_+5uy5iI)Dz5gD08}e+;Zc8L`d`mU8z%DV zof}}J=d@vmGy$Y}T{0020;}A}FwWReysDq0Y9Zl(X4`|GON%Wxi^1}a9M*D-321sy zoNAbCvkL{VQ~B3ASsQ=uwcaZU@y_U*Fbtrn;;%YclS@S_%YtM{X3SBd?6@#FMM9Fs zPXCl(ej(kE0t#V4%lZM_Q?i`olP8fdgszxAw0QG&$JdKk6OV(BAag zTyK(#Ajb)N6CG?<;u-K8n(4#7xZ!n2%^a_1e|*<`8!_cTksqa8+97Yn{`)JC6-9{g zp>jwO(2)c7=fnWfv&9_kpe)<9lo)B?6F^L_UxPK<5R2+zj-FceGutW{IRDRtK;iHi zMI0F%*N^Ybk%W<<>681&^I1wvJcAm7v3?zAvHDK$L#bkkBuo=ve&t}%BW(ijUi-yu zX9eAS=t&V%x-*zw&R`I~SXpFZz&2;ib=qoA08jI^4(cY1|0}-zmD@VM=C&=4B;2Tf z=eEGdd`%Etfh?L_5#)a_yLd+*PaB^2*q!pzT~xFCyV|hykU(ux&rNP}5H|5xGdWN{ zQ))Z_aE-rjtdnn=T zTsW1_*Te+S(hvXzX*rl^p1B5DpF$(zbaNQ?1ck&gd{-~B5&r<5AI_&4`(q!}?(voO zoPf5gt4p$5a(H$p^=041ey27+m?lIREh%bql^oNms9Qe#l*;{(;h!xpi*@jVlNOFjvUfu zGG7z@c`(1h0e6^uOG=E_t8IaRuQe&q@sn^m_?<%F-b8ktShG6y1zgIg8s%zLB@E&cnLxYivQ z+ZWDFsmg2-1ms!tuH#mVEskjMjO>}t2L}5%1p()O$;_a@JY}!+CSxdorz?vKoT-27 zG+dX>@|?-;@IKaS@>3nq8UTkfP|(8TaQi_b=Ghw{M>4clXkUkYKhoI{0S>F4<+?6i zgR!*q_qk^UKXwmh>YR5h?at0Sx5r19aMGtX3ybg^0Yv4M<|QO4E9A zcep={Pw9W{ugaE#mZ#D}wcZ)-MMrXScX!`q)yC6ohUw=pvH3av|8SXAf^oJWVQE{6d3w$C;pRZIign)w7dG2VHk9~T4q}T7k zY9dL&UZ|E20!&1|s^vrGJ+i;3!7UqaJh(rFB_2;z@$N)M(-9GCm0W&(4f#@hR1V~i zP~taUeBWTbd|DJ0?w#4+G+oUBRN7dE3i4AD*GQ3EBZDyST&&7m_UlR&0~Nuo zx!JQ|zE+yH%4qr1E2~m-)c7-*%6_pGP}+Y#?^+3GHZ|C^wHA!rF7D58KxYXLYF*73)I#-OvKM_i}GMR}{_5+nc;Smlp32+RBIY$|U@Wd*3*~;3ePz{hC_wk1vmUvNeaP)qo`yky&6)<&g1{)BPp8r136S zWM$$VkAj|48loc!cZe(Wegc6g63ytIQrvDwVCswY-jznOTA0vaKaKj=>ll=XXA3{tliT%J|B9>-@%6TNY_6@0Y zat{7zhKM7Um}6DN2kSI^B@3$pW#P^ue^`Jk>ZdRaTp@XM$7D6vxlRHZEwsR=h^n5f zn`DZ8wBOp|H0z<_%Dns4Xm=#iNkVOTcaDPfc=7>*)y)55hc@i0go>SR(+A}}D95Kw zaIMJ*!jX>GdEc`c`gy{h)3t@GPdKF}GItdJtmc!h%d=F~7!e@=g#nsqhp!jM9v&X!1!kgCvN($Rw6iT*m-4*{ zWn(27noFv)RUmi{`y((wl^;bd2Zz{yM$ppcG1gB`ND>(xoJ{lDxo~lO*mr-OjHEyR z!K{cyZ1Qw$GfKQwckyiA>N3ABs<6Eq@aq29vu*K+-X)_sN|Be7=9qy1ac zJCmY?x@ez<;;5_9_}edkvLd2bH`w=udEGgY3vQD@Du4|3%wg0S@F(T8Yi_WR@=`74 z=90W&4)BAKo7?wWu1mQ-Z+QBEa}2857vU{kuJcu&W6bA07lCi;6uJ(muCDgq4ho;0 zI4djiY;I1`__jZ{FxSmN>X--x30=s7yrAf`<>8^VcKk$27Dj65)V=%#C(slpVQbBR zx`~K(URdIV|E?lirp5-g!eO~5@2oY`w3h|2s!gEid69aYq8%ed7ki8sSP)zDk^$JoyP67X_@QjhHnnb8TtUt8Tv>863W6 z@-xsMq-)EW?8(i*mXn+PZM$P}=v`?)ex}}8#^zTwO|6(0znp2)X)Q0IS3-yWHGhdy z!^Z|Hq*Yy#F#t(SWG<1uxJYU5XV3Jj54|%OtcG>}#0LPiaCNZ1UvVlxQBo7p;-AfA zCKFKzWO}P+AN&%C&RJ9=S^j|;VBDD`R?njksy^KBg+AXSKH7VsGPXu%l*&P92DEVh zW(RijXWM+=SI};@#oA(j?6Z6j1AwSL+@s&l%+_+dPg_>Gu*EJIvyo|k>VpvvIM0PFT7PgN)T%htKkcvbpy z2f!Hnb3Y)gBOHkz0UA{f=E5|a{&k9%lW5bAd=e~YzmiF%lKFS8i)Hh5RIu3X;9ic| z-5i&f$-;PP6Cyh!3Jc8>g?Lqc{HT3V24iI%`46N&p|4@vD;CZ1!MCMC#|{JX0}Ug8 zg4`fiKJ5^m%08}BN!HQ*2TTEEQ}#B}d5wb~!xYNnV&YIUEA)tK6$)<+M5 zQEBAgaPu7SSv%SmB5TY3mw^%KiyE#Eta!dR1d5lN}4~v zEa*wzfckr?O6)NwQN>_wphDQ3L z`c+`Lc#Lmouw}Y5YO~jX;N1TkqzKz2*X4OK90j`)K3k3Ep4%#j^gr}vo%m-U)fXT; zA*BCQ9j$pq5uFyLsW*HWReFSPW?}-)iiU<^_g=of_IR;7*Vbg;mlxCJ$%>@6oztN& zkJ3YGPi6zLs**EFj@inM!UdFDOp=l0!Q2~M&?u1p8+7LuI^=>i&#jO}f2FRwP>b2>~^`IL!j zzKIhZ$mPm8d<_ogUy$<;^#CAuzfnh!j$f(}gRZg_^e&o~Z)dn|HrbSk zte)3&NuvlM)h5^$>p+QKk+4>qef$^mHmF=u6G;pyJQwZOD`*8&t;CbON)_5Y_QS%9 z@Z(`;idLsT)6$na1{zd~;y9nP)3?xQH9L~A$dQoGw`{wCVGCmgDul!x!MmGXOoaOX zTXU*J+<*~@McY)$L29+fd3UylL~FL(#~??aAc`p3;;t!0D}*|00EcBNvp4a!(tj5y z9H>+z1NG1+?y+-H-h1#0_iwQZUcys2rnKg9eVy}UGFW{|mT>sg9nlIPc(a&9G=?J@ zUbdTJ?GGYoxgd+2D#XhoP~gvvX)_FS?pzN&2%w(T5l2%DOF3Ai#$Rjb}8ZudXu@4Qcjqt&EP0u*~1BbDZMI_G#8uZqsC~ z9W*isVWN?V|3jPs0&e8hdXuLIC#jTFQ~K>#UTu+${2yi}69w@UMmlWhv=s%guw)Dp z`Gj@>+VJy$8*hzXHnBdEoJFB*fxm{6*h4G>^l%iq(bE`#fTWSm|f>7iTemh&27!|#(XRj7~s4~iOS(O>dhorY<(?z=(5CO8BtXAbeG ztQ9}4$OOP?lSmLznd2UEMNNOaOWfB3bYCl%F9Md>Jokoi!04>v{?|S|CUjPTmu%)o zlg~ZOl0eo5;kxqi|0?7@6i$5Q)ln<_#{U5dn@RzokjZsKfHgOSIjMchXkAp|cgP(m zulwog>FS`?cnj&?Nql`Qg-Vqw;N4rb5}h3MZEG$nDoI!_&5$l-?NAj;%0ae;@1g1` z7d3Dphacboc3dI*}|{KQrM$x8(IK9;2mhrAco_*QNdctMh_$)Wn( zsVpY8Xo+nngxchmZ1%7Qq=r6#eWgTS6)jP z2>|2>ECOx5{O99-QlJRAJIu=Yi`w}MZ6SI^TmH2A@$KV{0d^@>MpMV0wsuqd)nx0k z30%84zwHD>Wr~F6j7q=h8+$wdVfo#e#9nFW)vvJH*(YNFi z209NT8Zf8ue4u4*r_G;wY0T9Q*|#e$FPyF@G*hH;6|?Yy_HBxkt2q=Sxr8{JHjU=Lk-`76ISF|CfVkFp;+tnx zXiR21zMc(a?HqveEg0x)X|LL2R9IdaRMIBivOk%IOy;Npw3w!4hoxH-v@O;T_xI~0 z#at)+g_G6}&+F{JvnzXdQ+qN^f;o1_3lXIv-$Vfm1(1mc0{V_v)RPAF$`5|NZpcS7 zw=)smRjawt80YHcR?M)C6-HAP?4^rA#Z}->)5V-dTlc_-g1H(qU)9OGhm#f`?`&d~ zGn`dgBnyBj=Zho>ewBG4Y41%^T)!l?en6wuQoO?D1!eFg1H^2#iNbh|8D;f23#~fF zO8ux-UEV$lt)is!JaZLPJX_rdrG}v9g>=pb@e2eH1C9XamDLeRmambCE2Q7cLe-%tUH=GWb&n zYFI$ejTgpLVS%pw{C%!{>hmiw##5{$n*Aq62;ddJ0@jMhRqDAP#Gt@lo3aY^FLG{O z#%k|TCBN#HYMrdfLICsKI$M?&^3~;eO7oU;SCr}iUuRV6ICxeiC7a{>`hpzex4{kAaF<6Q$ri{|jwc_eO zt+N$?GBtLT1cH}|EHZ*erEZ5k2inDqv4JAosCD^gHR5K@u-eau5$sRY`z8CKX&^^{ zQz6I=Oea&S397)EUzp1eZrk9vIcW{)ovSo7)=V?^v^L*;_JqE*W-%j?deF6c$r(*5 zzK#M^n|f6)1Fx+Su*d))?dFn$ekf>4r@KOARp~gN6Z2(kD7f!yIa|pQ;~;20WzmU+ zXPd8*>(WvqpsAG-K);t!RE(8ivIM~AJLk#{T7zC-JzYL~oVb1tnJE>N%@DG5x)^?= z&?WC^G9e52$&1x3b@RRyfsdB!9;}2C`a}>9g8?Q);%4uJN0*&t3-n;?!ly!TFR=jE z0`cMAhbBXY8k@v1Ff=p9%-<6L}t zuRDrPL%4Q?M29~c9y(XMP*z0(@r@9y(>HWYsgtfmBlb8EIo&1O$9Jzq^DZ99C<|x$U`70)`)}i5J_i-JO2!h;03~!=ucS8Li;HsQd1>e!($@T+q{%`E zz*jB2q$z-&gHwDMy`i`@!6e0zKeUAy^J_dZF^{&9|Id=+4^S(#mPuJr|6Ow414~Z+ zwxYP`f7stJwpU43ulSdLltHhn*wpJ=`u}>DVcsEf!^IIHF7F^xxNkZucW8NhB*IPq zU_f02Kko)?n=UT|0pLYvE87cVSvs*+Zc|BM4N%d9ahob`4j-6Q?M@xAzT)We`Re$J z&p=Mf=5z^RqWA!zs2DR_2I2(jFmR<<_40w1LI}WkD4?i{5+dls&wwdG@&q$@#f`Kv+EdtB}RV<$KOIy|c=m7gI_I0;^5qrSe0PgPT8=C(+Wrx;-8nnHA z(%ZAOsvSy>+}lp?+(2}BJsjAQTIhJ;@&*3iZ}Gw5wRJ`u826o>Pnnigm-FXG;24c( z;lt+SeINZ>M)X}rM*y|t4=&QO1HhtPDbCQAJICC04Gn2h!xUs16?FqIj$5h_x6m@& za!G8qP{|9mBH01@mYcKWkBvKTfYdsZ@43lnxsGRQxOo5e?#`3i_lH?!Rn=r_FCEgy zkHC3{WB`SNa-$`XNO1dFWlQV_HvPH^pfWf8*>lmfZyhOebqP|{n@M?^t$m@x;RSg_ zbO+*V+;@fc{4Ee73`{ZKO(^w6Uj#HWb4H)zMwJSL=xqy5Pk$CESAykAIa1*7^9wc} zsj+6JYf?tPbe^WlG#V%*ac%i0)|z*c>x$UyO+tCYZOYx<9P_rVXH$N#Wv!wNlm1__ z2J;#J!-vma`IXxpi9$kwIqzk1 z!8@chy2V%S5b8pS+8mE1Kx8oIjKqmWJWy)ETMN@CGL18p_ zK~!PjOcz{0J-tEf>dLP?UC&M}=oBy>dCUe(`vK|DwVnHU3h#|@v@}Hq)72fGzjP;^ z#kdxm!!4Qru!+%P8UoAs>0zd*^rf&=5>FsxU@W29brBJVT6?I_Zit5C)g7#`@+Sa} z%-8wBzj+`YJHlVRwHt>Jne*%qbjs#G61$dm0NzaLzoG~7v~p2Ha5()z@UeT+?ck2+ z(fz5TU+I6LAbGedmdM>v>A5DdX$;eUf=|JT7y4h31?c|xF3vz9mYKdCb91mH^0NT= zd%S!xtyEb?*US3$S7$(xaWq9#r%HkK@BxWR9+%jsBTvUQkKLurz>28yDYMC0*je#u z`kEn2?RG}Ju{Uw?@%g%_T!(36nQElA>N)bT?{4kLq#|~8NPPebjXY3mP2f(UrM&h< ztmzB{imTG8XNco+W?}cdCB%N83IzeNKDM^8JDrVfGLu(OP)Uakpc&3`jdr+v9}8AU zD^^hQRs=;tW_C!4D}a#z6*XI;E1Id~P>Zgpp@_IV{MSF`$}U!#cb`CLPm3*==)b=Y zT-NW-m%j&;`cwG@;kTx9Md1MpbF(_zi;xay>%@|MpiT58T+|tY(+Df2tfIezp*xf0 z>U6RrQ&wCs)lc-RPX$W(5ZRXmausqsft(0AIV3-=Ez`fx@Yy;YjA%Hi=H?)=G&sq9 zBLDV*R4PT`?lFc_iKe-3V*_vvy@1{x(aPYtqoyN^^I<*7*EK|n`vY)v2SGr$cDPi` zI;%E9!Hz%lt;XSe|Gs9@SHs_|T6f^Ar9iHjRn}sH!>Tm9Ft;CiBGY;>Q=EOm3W!(Q z9qtAcoa4Jh9F(WZsIPaQ9xD+FIMjIhVMLudMa;D1j9c`kHh=CMJ98L;r~W zRau#z;*>`hQm(0c&Pq3&Vhrj}F|@6$w&i?p`0YT25#dOrAQW%G;-%+7EmGDdJjM+H#$FxehRnP%jpSBSURXWDN2nz#) zAELo*}4TwcaZlldyoaD1WE#R3vs z2~GVP3j2&C<=|jJoiK-_k+DxIaB8`C_9FxQ0uqM30dXFZgMoJ-x1#TN=XL7~r4Rd+ zBdM)k=+>xYftn*&a|(ca)L~f|e|IX+1z4$mE@Z4ad;SXRUYSo!mQV5(w76egc=QoQ zaXK_otm-QB4THWF$$`F9bk_k)g*7C!UBhYi+Dw-wF&2jvmRdjk#)yVR5oxI6wR$n%#rirN3T0G# zi>L3@Bez|PHfa!TE4qg+sZ9*Ko$6->D=c;cu8=7R_-goAnoP}P43idYKqZWJL&(j} z{%F4$hfzT-cJYErs|IEs=qqkGqWPh?*ovqQ7%7u}aD#0@rBxjQp}Ahdt}19FlP{n$ zbrYOuPv&0lGQsjH5EAH%jD6?=uz1>M%pId-Zp}uEWsmI7x1D0Q6YA|=;P6MwPp!RQ zRPAX8dSYd$`~Qb({AL2Xb~#$vv3_jUq3(G+haNKGs#d1AuQHyJw4|p`3PKYPi2ah@ zZ@TZ7OfY+2qrV_UMZ5!x6L2V`nLmGy-?KUmfEw%{e#|z#4~%&dym+9ROlmAh-L(tT z-T?<-4H1a3kE#*f9g70&4xej=FP4?%D_G4IV!qP<1zYgAq%yrtyZdp)TP*Am5NkSq z)d&zv4(FTX(?ttj+5DUB39O-3eRWnEJ5Q#wH30_&dk3O81w|$b6zf}qv9tUmpQt_^ z{VMWc9u0HJwG5%#i|HilBjUNBrVu zU(t6Ep}-9fpc=?VvM!%UNE+B3N&(+ahi}#sV!EFP5RTXjH2my_Mg^&lPfkj2;HCzM zFZ)wU4Nmjw=O{7#`&Ke9XWO9#HB8Dq3rB_k@&oC za>35=>4tBeX@I~#Mkb-#a zGh!(QyoKPRWh2Y$kB$@~cuhV!y^Pi^%2^~RbI#i0X^FNJ+4oIhc7Mc=!>eL{M%U4K`k+6;!h zP#dHoAMz)G&3|n;mIp0lO$e+meb}9_cr#19616>bxKxXq$XbLy;{+`k$Ab%{|H(JCQ(Qih|=yh0io*&(ZDZa|N!KQOEqzm4|I7RYiUyffT= z`vM{Y^0ap4<&}q)Ph>Wg??v>4DzLU}z8!JizeJD9P}pO?<#82{Y^5Fp=5J?qVi(A4 zE{p@i6LS@9k$hC-zgVk=yYducqR6e5!)!uI`68m{6*;;-2`-R9-ewx!jQ9+T|LNcj zTZj3qVn)(^CCfnsQ~{0zt6$+=%;zewXPTSFvMdQz9s4m_A6Y&QDisM_Y=4zWQF2S= zz@}6z4w=dXJfO92`^Kx1_)%ZSDnno6cG#~V%5Eu6$n0lyOBla&?HkRMFq?H&LQmw3 z%7a{KwcMklR+`n&Z1%@+D3yxaD_U&?Th5XfW@eO*I(OG(<*P3qyRGN%dvP*dF+vNN z_tQj6dDy;!k10EdE!%OStH84xJ>Y91xkF}uU(JRByb5$Krm+V$ECAs&Q$6Q3PPC6L zK*qenC9tpM3DU90B|l6S9(dEy7+{N95L^rrI17j_6rYV2E{qwTGlfv=e=wtjO<^g{ zKr}R8s1an3a(Y>sDN9p0Jekmpb`5uMJX?oMU^4b{;p3 zJg-{e^ry4t8`CS&cz-RnkoEJN^on}z7#fC0N$Iiv|8=YZ=vbUdQ#(<^f_Ff zKt&wF>N`BvJ;>h1{4&cOzMa(vGas=&F?S`5@Yfd08W~NZiWT5B>klWu)*6@pmZo?~ zZN7LDlwq=d%j=~na6)~#?0ACL?D^@Vu#hl+x%2D?PCrN#8Gb&CeXz)20iKCQ$mxcv(>``j4X!ril4)=FS&BSTgrp5kBYB^##_9Ct2__zc-Xz)%_GTKknduoL*!a4g(!Ih?zEsDowuGBE9ni^yLYW5#c3*Z1ZP-y3luetEshF;4sAF->>G zzTP7mzsc8#m3Obw;LK093KQWoXX>+njnr{_Nm<-$Ei+wIyckSZ{$Velcms*JcSa zldiAudBHYxDYvJ^%2a}Oe%Tmhct3>NbRyyeIGcDV%)l$K$Xq<5UWc{0|=}LsRzYzDY z-|!3Hirz=9R`jD8WPI%<{iREkjS%J0;ShAVfr$%}z_2ixZ>Pti^=Bk%Gq+Rx=nPqC z-qcC4!8M=jziusA$PXA7X`jpInf^3$99g`p(6OKU4OxXT?I2sH;$z?2YIlTjzS+M~ zRmpubXv-*HaeB3!w80q9RRgfcg#8db}HI*7V zgN;`fUNebs8Y+r!9Z&nV0sYxLeCZ>lY*TBpsW#Y&c>P9`v61Su9B}9xbJy|@4HWk3 zDGNVmLJF;VLG_vwzM-YV+RvZkXMV|p1J_E#1a8tUVYCu=%_;?}EE=m=n0&Q(*fwF% z&UnJfg9YM@f=28h_~D9#d!OSh0}h)Em^>OSdr(=$+>EJmT{jyM+8`XJw<~gD9?l>c z&YrOiJCWAL$A(g|vVRp^M3#ZqTx6U^jdDZs(+7_?>Mn#LPJ>tv;Y)vH@7DJyp3@m8 z$sU><1iCV_zb9t|b3T{LRtl4b2JcrP02=~dlX*Q!GI!Fid?-z%Pw$N$UjGF9>wmy5 z3s$=sWQwK!{YVB}I>C*?LHZtZ>^l0NZv&6*AcTB-pnjTa^4~jr-9ri!n8InwC2QId z<=;C54u%&4o9BTx$XCtrpW|~G0|(;Xv*24$`g1yeHs_;49t#f9MbA^rg&+XBN`B#$ zXttuOpnjG6dz;ff;Gm9rUaIa$emw3&=o9WQOn**&of2$ALI14Ue!g@UX^eb+H{!R` ze=bW55BQ!0o>r8d+<&fXoHz|m(?;Bw=il>s!*Xx25TX%Rs|`z|RewM0Kl_6PP!86c z-L!i`ueRP|l&sYG0}TiGL_|y@jd^f?JvD#d6e1jOcvPD1*)!LTuKWp@U`S#8%oRl} z9;6Rud;s_?c+&Fr=WgFPj6TofrKx0UGoFBxlRtolQ;3jFb;HGa5<`SDwhq&uAcV47%ch*$&>?DF$UZk@nH6EJ%qk^`!h@q>h$^6rq&Ar{5Z?v@_wsQcFi{rNV2mt=C{?mZ39fpxi zE$T=TXXuG&Nc)3DE56xj)XA!Ji%{n;+f&I2sBbHqi((J$-!)utT> zTWG0*^Hs(~$+>a$k0Hs=b*?Ww12N>@=E)2A!1y^ETwi+gbs`(13GfS4>fWP;+VKn( zLZHJBYvUy$03MB&z_q2RLx|b|VewbSzb}rENSa_`j9BV2v~VD*K(3ux7=0!p0v4AS z{l+tqFgbDxu`m%C*=OFzM@;iYIEaTqXV!D2MFQbm$C;2kg-nW=(q}Y@nBo`%KtK>^ zv-cZNdw0m!aR1JcApA17yF#in($tO9*fB6x=&aS&5S&=1{~%R+=izxGvyf@&9@RvH zy^xV+;S!Wchptw8B2a=gCw#|Ya~l`MZFR^-o{L5_T=ZjMWC;*PCxZ6a&bi;e9HYs~ zJhYw@n1nH3r0!LgM}Fc!Ko&n!t8ofeW?!f^mKr#PbYgxK{r+8%!FmLoDNhSN7-RC| z)2s3XMiM^(i(;L_9vo@}t`<<}$)>9tOUBcqb-I4` zridO$@2$kP1X69u^yfUtQFnRi|HYg>82JJj)WFyhk>ezG*=#G2gY0&;o5VIQ(Y0Y3!^tjYd0cLeVC|FGQrv zz$}Y_sh4mDd7SLNecQOl+x_X15Wt-?0Ni17mfkC3iY6|{1(1~qfC#Sf>2_IEmP;~q z8)L}S8nPavNreYVH8>VwVF9ZGSBDlyB_?Ba>3g{%qmM)Jt#PPX>Xw(KhBs1qs{M6Z z#~bc~KD_v}Ez0HlT9*eC@U|ujv5$M={y2Ao%3RWle2h((PWI*Rrir{kj4INUavH^I zERmZRXtduCYBUN~98OU=1}706fFOqRg6%w!6iX{9s)qOZ z5n9cd*|PpywoJ1su`B^-4I2GcrsfAMBjbl#EX2by|EBKZ&UMjuwFq*d!#V>dj z6!s(zXT^cil{!d(kPNTGWDRD>l}e2?eeR1~ICb7MKAy~%BlOj$SRggyNSJSiPR_7h z{f+#(qOgE-Em=O;{fw%`UUDiyISU;OPOMeWyi$cF;s7U)AkExUz|Fcy=dI9FDE#)Z zI}ioc`GU7$!lz2oGPBNznN4zhD-7D&&JZGORnoPnBZe;BiMQw`w#TlU@&M3I6q5BX89GT-jnN(UzzSM*)%%BBk z$!cP_&ry3iOZ3lrg9*<4tJ#mUy*-ZGx*&0~E;NDN6v5}+6F6loZHFb&*psGnXa2Ze zf5i9R>0l|#?QWuTYn4hnZg!ysnF=BLce^WSkGg9Z8HuB+A;~?ign=F5nZ0d=Prt_} zKXIBUQE4ew1mirAKKA)9Vqi>`dZIaUQ^M`sw&wVC-raQaAp2UI@^CAGp9Q~p7}Xz* zLD%4{v9zJ~%b|}X`3m>a46Vm;@$g+xpZ@JbDI`QvR5wh>kd0L;lprD|9LlBeg5v1v zX#Yf3z`4FefB8>*t@FSI!4{9=JX#-tZn-or$iVCu*RVlq2z zA=sS4A6#x*?ZcB46D?1#5papsEOakou!(|L*8`=YBhRCuI$JQk<14oZ2U>jl4XHbM z*jAp|RFf)2ofzdGJ)RfJV0j-eF{^KQRn`nDx%n!4uEuL@twqN-v(zhy*9N~6hSO@9 z%f7?*2bPC*diQ+=%Jos#973(-CNjB#&kpS!5US&M0;T4CDcpgVPJ`3Q>y^DN-yQo` zir?KG#^aMxJDjfAzwr%)N~0q;O=sf1zpCX;cWF+jDyXiBr~a+$sH)IlJ)^0TZ)!lL zmP3>?oa9TdOPXODn8T!j`DLQ-1rMa7E+SUBVvC|u{KPvBr-J$Z@ymGI zs0N#8p~uS0skJOcB2$5A%dc2r;~{=HLd5NXSnA-`mv}Hu`k{$>#%-z&e`Hc%W(>9c z6nl4eE=v6(4dVIzToLc1T|sH!^c9SEj3_d_gIOU>80}?WUc)6h?-l!T+TXHu}GnK<^tl& z4G!QJjn`oTbo=zL=o6bmFN-j%+FtLG;*P^Ly@MfvUp=*GCGFj;{$|(-b#?aK=$S>0 zV=Ov-9g^HA1Gs3C+i%=cV`P&G)|zV&DnqMtHi8xqn2hC9KXo2POtzT82a&pBEH||O zc|W$>fEn?^h0wfDry32uQ4w7W45v`JKraCbWGJBu?ADa$^v|RDuT_}}_RIx}Jrbqw zD@gY0k^ER8^yYsvh|ao2l>sA5!U-zgMdl3goo|ZkV^m2MoBTFZ^l-rMu2Q*>srm^f zdnq6gv?up}nET4EIF^OoKp?>(1b26LC%8j!cXxN!1b252?(Xg$+&u&v+~GE7zej$; z{lZ$qVwjrl>h7vXC#O?X;$FGV=;2-*AVj@*Axb1BGrH{j8|Cb6D;(IZM*~|_ANiuA z&9Tv$jmFYYZ96VtZp_K}^4u;WiOZI#y|b9>rdh0@%O7lsM-yl$?b~l)=$G`u)stva zaUaUb+x7NZY%-6s(Dd-EA2TvcU@TOsXzqF*bcz!jx@JpvvPGl68ndcSp165#mGuV~ z6`m@VoSpSp84^s8MPRbWehTgiLnO34XEN)i&Z9}&7hqaZ1WEQrPUELau>xypJ@Riw zcAsJS*x$^eNz#uuU!L^YR`Q2kqF)7t&PQ~`#eYV=4Tl-#!*f{IOK*zu>9D0$R-bOT zj?24x@tUtU=2sY{hBYE&W;b|W%rj`}>E)cxO?B2M(y1=r&e7*v3ms+56;Gs4Hch{@ zpj(}CyCh!0W4~Axj;hq&`0moK0^94A()nMe$8&e666rkdVF^!v)3+P(MPG>ywa|aq z`%1?gL;JoOKb_w3?|GdxU&NuQuL5Sz?+_&fw94$c?LNXUBNI|kAOXn~eF-JZAQ*L$Wtddb za7Gyt%%k1MNNl4LX=|NP7Fu1sa@^Uf&Y5f zL(bHo(V>CrbvdI40*6M(TDjek%#{Z1|v8y0E zIy>3`xbF;3{~9}4yRzgm3kCiOpRQO4(x*1WZ_#3tr)u(`Ra{7{_wo(_4XzS z-~+_MRIhdor+ibuO)z#5N}U!egT2=4;qqWGB|9WtnJenqM)r1WJJE4rhWETFk1=c1 z!(GX$(8{G|Cusb(J;*o!9QR7 zwQlmYJI3h67h}m)!%EDyu?*&ar8PQ|XJnuw72Y9-em<~&j;A_hS#=VFK)NwMv{(5RR%lhdC05KcAjyH|G^)VA==%X zMYY&+oT>eTg#GY8D~{CgVJ$db`9zQpee&_c3&MAIuuIob>_5+ULg$FQy0UcD3bb5xJeV93GkVZ$ zbn>_QZZUx`oF1jq<^u12x%UM&D|PV2!Flb#!`wN0PKoO9uv6pdj51rjshIdY6kT|= z7gz(2l<>(tu>CKJB zzzgE97$8yK@vMs};>CQ_e_a~L)WF0cU9eR-mx3lS08eE)G6)uazWG}LTq#Jf5WfS^ zVUZeO{)0OKGmZQmcq_IQdipQaK;f@OkfT^%^FhAsAIuK8%2J?kxZQOcuk6cn8d3t= zPv~0@wd36O%i%?dveRJ`I40I){8~V)pEta_dDsoEnJb|H>`m3ELFeC}1)cDY6pE-D z22bSfEuV`tNl0MmmWq(eVc;(40ITT#LWIJyzzu8o!L0Ou06t_K0N_JjQ!T<(`5)MB z?;Q&KXA%DIw-fYynHE8VKBJyPAU6V6t@^z4_a+_s0j>W0A6PEt12C}U51k~Z20Mf? zoQ7QgcVxeLk#2SI6Lh-BJfVIB=MusGsFtSuKbRe~KY&F-Z)?u-{m)nlKD`eBjAo+r zKig#r|DbQc@Pk0K=J@}MT7G;#%pa0Wl>cY=f&>5#D0rV#AN@a&;ZHE&n;LwOs{8Nf zWI+SPK`1~5$aTgxbn#l3FFqn3&rcQl1?#0C!y#F>anF0R4;;~Lb}xf6G&+qigoL@( z%T_5(c9gOiJg0P)83QE&=%!{32LC?Da_IiJZO=7U16>!FMN^q=euqy8-A()vQ7Ug} zG&%@x-cP&->uu*B(CE~+* zKC3kW+AZpP0(XTfu_^{E)-}XB{i{v_CAuuMjSahuV)3)J*DOChqg#m(E%i8&{Dq|{ zhwZ<-TJ1iF`!K~(FQW~EZgN{Y15znXW|#Zc$*Ra!t2MAw z&c_jHtfhK$Nw{haCb&TMSa_ZYOs@Cwff8GG0yG>PxF&+7Qdz{_NIdsSO%{md2vCn) zSQR&>)agOHoNNS^CQ@N8a1Rt<+nE0Q)&fXD|Not^N_k;Z)+!%^hL;W8zqHgzwNJx65NVkw&95rPJ{m z0;NJh%=I1rBMzV=8o0%MO-Y)pi1;qEW-#sUg zv-?Ag;ds+hmK_`C@`KC<&(E7ze+~~alx!J}A72jzGcWu1MfB`2K1Fi|9{b5dBwsTtRawH5^is!ao{mzqc50zKb6LOvuUU za_M51!;9ntkPaZ+1OC8hc}67P%@O#P<&E*O>Si>W0ygD*E)8QK`OIR0v(HbqZ@UiH zzvAq};k!-55o)#kU%71r;ekL_6ra+Vl(hx}^iO{obJ9%k!#&}g&QCqQlku6pC?S|qfu zjL4)Gr})tc5JDiBT=l#di#HEV9qbD9o3k|%T)y1j7sR(R8G(8b`Cr2PcF9Rz&MBE| z9OgBCS1H0yq_gxM(5?a)u94W+ay_{s9uXLHB+*>gbAy$Lmbl5V6VSPjKpcrg4jRvA zCSG}P$t`mtpdH1Lx@lc-=rI+isl#5509uq@i4Yb`b0X>GJ6wsvAC4t3ak(rH@bZ6Q zhPntZAJl7&KCLD(n@$D+>M^b*5~(BQ{Nqam+PRmm5j$44vh#ZCne-HP^jl& zJa+t+qA|8|e!33-q9*W<7BAQo)b?>WOvc0trW}+&OuZmQf1PkViaKW4y^62LO{ook zJWmFzt6X!RNTDM(fVD`}{C{eRR6ov-GD4mHyfTEfV{8 z;!b&r&-1dK7=VXX2~kqLm3C|bd!9i4htXKP_^-F}G&=QAI-V^}3|p^tmu}m=#(Sfw zU#V4I!hHaoYrn2lDV;ALQS_AwZR+k%K)v~#q!zEjD_5f>>7lto;ozT|uXa}lv~IBm zu8E!aDwP1xGSZai4%|(}Ss>C>E_x#77wtleuW&t_tb&#Lte?nd6XuG&_Y8OKOMwD6a1LT0=4-2KTEi z=cO1Z6De(jhj>w4yvJ(2wuE@%CP=mRRSd1o6pNie`ZJU9DnM9d@OjFH zB~U8&%Gc|G=@!U*Jqxf4dt7ffCl>2k_Kijz4E%w>Jt}+`RIFU#T+>h?cYdajL7Qz9 zl;3Hc+Zrvt248F8z~TIe)1a<235&*1RQ!Sp+8Frk86CByXAcTrruJrI9m_y@X%$pD4|p1S;ej2%?9K>|yOzWUW~ z%f$iMjg9TnLG3hI>7;Rt@2UIov9^8nRs}qi@n+Ns4{=rMDpQHt;Y)HdwU; zYmFxVG%o_IU);G4DaZhx+0FAu6VM2HlK-@^T9r?)&fVvjQuq%=;3f&hQjvyNW}en4 z)hE5wty1_~;(JMoer_$1-k45eocVObrQ??QdSSXvo^85SErG$9KSAiG3kB4Ec=2Fk zU{h>#LLsc`SuT-wTgc`HHNhyM=CT5bT!4rX@2&_er8b&kb5flSJHdXXreWXXfJz*q z4=?d3#o@(-$U>v+GVU^OgQWw4#rPu~eFK=r??>SjA>HIzBV}y@NKG8H?vm?*EK)2nmb1|2#Tx zxz%wp9>Z^o_xH}e)k;rvq`q#K=o2~Q@Tg1B?es@=#EI^wBR~!lT%PPsQVMwWw+2vg z+-3&g(|jT)skA0NqZ9g9Sj$QR$gi)3p!;J!U~(9sxRIuY+>7Pd?_XndZNa#eIIyFNJ6^RCloZBJdKMg{H%h zeBspP?Q!?*AOh38s$+jiT=GV4(|g|u@eIpQD1!$@gY7}=rP^~g(T>ak>mh9A8-bOCjXl?7VnGkWG#D9y)nDTTZ|$Xf zu&SNn7C5}v;8~Rwf}`1%&Cc9#{BgE;PwNe(iC_Y*cw5WS(XA%omucRgC+t$ot$8XE zgA>RWLElef8&jDbnJ(q_wBMGaM}H+2D_$8nXX!Xv(=(~4Gn4d9**?TMgZNZzIznga z=yNeBds)Z&$KR$KWIBAjAlz<_v8!&s1plqG?fk+1(nqaWMA8})XB6}^P+cDFG*C+i zrDvfD2+q<&rp?+a8P2MwnqTAVU(aMI)fGcS8rQ8y@s-UIRXI1>aa3(;tby`JM+cRz z>S@qyW3kO7(Tv2A#Y5sPu-tl<$%fOqv05)iSu^JN>P9>|^H>M)zz}@dcup0CYMoeZ zz_^<$xA)fS^n$EAr0Xx>t`BJVE}$M`|L0fDv8|_H(11B^>{FhNdK_4?{v-&e`I5mvA})4da>V3R%4@E-$Ex zaer^cfix}cIkgeeT#XV}E!XgkJ4@l^AhF%RyHtw^o>rlm&d18?f=Zi#HR*o6+wQW) z5#9=S*B1lRd)PwsjpbF#V}MnvzB1XmGxQUxcT94E(gs^0!~;r^IGTOumHsNV?9B!L zs_vmqf1Od{9_o;xIAQvO@wWIAI%XMukv3BB?Ww8bbRIH(gl4x-#6otbc-cb#kWBZ4 zYhU0}Z?HGxUZ1PcDxykOKl{WhtIPQcpCJ7v@mRu*r_Ew3=RG~e&o!cxGQkPK_SOaM zE${35Xw}ZkozE)M{?Q$m+J)mZf?GXDt5)=zdFEk%C^$$t8o*)vk*rtW_64@vX_ zU5$t9`SMsY_^#d$CpGTwCExO2I<^U+vFosM?G3C&og@w`G+7+e{&>@2yNTF8pY_+3)IRPyskOuR5 zX)KhwC(pBJ95TF8w~WoW8pkx-h|UxX{`er(a`90eySTDhR3(JOt<4j`sOYt>A?9g| zPIxfv<%|#4_tO*{7l~r0j6_SN;9V}^E3)3j;AVZBEw{2H7E+7UPayM#%5{cva5b$N z_AG(h^&u}zDv`;!K)o4PHJEx9T%M%JQQod%*`0ALzkXjt1^UIk7J2@vIPC*J!h!hQ z%}lk3vVF<&Hia=dVj=M$QL+!-c!3TSL0i!sP>NLI% zuH!+0oO)HRfs7VHrhj7omK-M(wS8wWD$hLF-Z-kpEE8=n^o`cdzE9cGTN3JLlxdf$ zPs8NL+pb+*fz^+O9=DX+p!zkkDVTu}hoSbp8`HhEI|~1|5|JkU=vf`7)#?o?qjJ0= zKFf8FR}3f+Kb@x@C%LLst26a74(B+LN5p4{`_)-sL;DR58Y6G2bVGeAa+KzBh7Q+o z>8HuRq+L9W;M+_SRAW|bjekXyu6yTuKnUq|*xQUAw;X^l?2g0SQWHAB&zb60pBsk` z3qCMwRp7i&rE>pYvJrb3zo3+OgTvV@%3ULv#k3jHY#lz%ckLMG?TQ09;g&gy1*#Rz ziJ8g*NF>+M!7;flUcQ17`s?tE1^d5%A3?uF9_}!^)Im)F%IyDwLc3qU6xWv9`oX73 zM`L^taRTHWM2AtLZ6wdb~(GEOe3RX0voK5+kA%RPgh>5%nz?mp%H z-6riUcZ$N@9Ry(vTFywZ-aYLnj_5lYLTP2T>r@YGR@{s2xkF7T*_`!ZSrs;b7#-55&%)H{!#ur2O)t+plMcx72ndn4ym{0`9}0Hal`#Hh zUYL(dgF*&rR*ZP0*oVV1`exBb;LCc^p))w7XCtF_kt$U(K~U8MVU@(yP<$h{qk>eH z=-ww~2Awm4Dw;9EUP!ke7ArU7Tyab$G6=VOX7B(7VazXRtqz~Bi?$G9!>t~tN$qj6 zHYo{Q^tN+ZrWDRz#>8V;Uo5q18i!2FuS1c|79k$eKAwx~WnnWuVkW;sf>Ny-cXJ|s zLFi9KAnGxrv<1TblO!HwhleYpAyVWF04gBVUimGaJm}Wa5oL$J$&V_xy1~{y6X<+OUDLO4KUrp(?246f) zN{tr(L6HoJw`8iuq*93>6$+)J)|Q!KpKC205lAOf;&1X?r@{^;kmKz4Ovft+GvbZ2 zJAz)u6GEa-(dr2ifunQvK{P+nFVTRCg@4 zFb|!nK#JH`3%^Q(IgoRJn%J`Knk7-n@b3~|FpasWXH@N=-CFaW6Fe|qN%+8@msSIX zFqwlQv==Y}`eOKrZ2kno{CsAF!TMT~A!@3!J$Q&?TBS<@2d~zl=61m_KX`cS^fWVz zoBzdAy;8C-9?)cN#P3&CkTZaXOv9m@e=))!yeHP0cEZk*o?VN}L_qhDG;8ehX zMDH=Ix|#_x-duwDY%#$uBx6@D$ra~bI)Pi2It!>PK+96XEb}l}$PXyr3vME&RLCZz zp`_o>HHgx?rsj#78^4T_eissc%Ogdq9LH=j8~uDWTtmb}(i=mGY&x~|y+1-asr}X= zj&se!)bm>ks3!ISkF!7ObWk z7sw>Z-ct2x*29v8+2O{79M04YNxY9oLUUDe8baFt;CnxftKms-0^20lmm4-Ffs7FHz)87Z-ij5k#YCaS??fS~Ps9c`J zX(EUwB8f!*=+)vUt=4M{*AK00vfw`~I)$82vJeUc$dAx?zd9O*^BK24G9qIU&T*uB z2nK0OB z(grdj@FItSrahjUEt=^F>PHm+5mgc-^U_@0`s2xs+dzD2S4%Oi`mC3)_Ed zmKx+*By8Vu{>(ECWft30_z^3@4?NX??S9Ioz#bwZ_-SnqPa1}FYVTqknZsyhQYc*Q zA&crnoWT&Wyw2|d1Bn8pMeAfm2Wyo{rZJ-UaWhwYlQg{D|J>?xAhb{^JK+^WYPOhA zsL>pWG;qOV62C>oqKuM%G(qz-XxxQB%NSgspy8$zff-JqC3TF!Dg@`+6+I0|U)_Vm zG_hM01C|-U9OA)+P{XTf)>Gdm`Fc{@hoa?RK4rRB?EKY<_EL05`}wR{Wl|h-T>ZyS z$#mY2$#+O_>PLj~`MVMCj~yVRM7A74&EHVK9O8#rf>dW5OI!$(@n}HotKo&^U)S4! zgsJb>!aOU+1@<=R3u{QWEe0x*qCj`L3ecSRkT@u|n%$ zDSzxw`q1_XB@v>WeBL#yS*tNarZgJG;<{v2CEOXNuzB0VAm$hoWmbun3j>BB7uMd0 zT?Ji@)IcS*VA+;|vOhX(C@CPMm-d)qIBcnUdt!l|XqY&KL3tHh;r`4;pl&Ut)XXLn zRvRb2NTWnMnwbl-CzFa1pQJ9Nh4ujGsP~I~+nqgup;K4L1>>?ic7hHs;$xWyOT3=y z$qAA0_t5ekX{Av4g=U73(ztg8r9DTq(F3P)p!VB1`dGULzu7aJI_LS;OMsAVd=25cEFHpJ(XNvG zYsy5yh$5gSRR;Xp_chKtK>V^=yAx(B|0*h_Vv(2CsfCav0Ur{Qx)83uz1}b>@n8h| zqgm6!1!Oql$S|qf)7K|URCh)U)7=0COx#oSvqWxLL`2cmZvQ|rJ8A}~`7#waxq`Ys zzqgeL(CF`F1d2`$ES94mByPz|HCG!v>1{S(ggdxc^G31ETdCY)cV>i1w^IE$4U7f! zQSoF+DP;Bvk8-606ff%p#W1aT987XY6E8|x6=yuVFdBUIDhIheF}{g3=9;aChVHz6noY z&C9pD)tIeMgrSzjFsmW}J)Kk<53KRXKcgYa1l05 zaH94JMlCfse7>wAnMNY_VtJ7?%T;R;|Ku^&JXOAXdX zVe7t~Lv)>7){4h*q))T&=9S;NBIlx8!&VFOj3p`3M{pW+X)yG}xS{zKH%}CLj}x~r zWulXSV1)AWSTkdL8eSxU@x=51HG@<9yfJ$nsjc?dptd{C^$i`8hdfD*mvfEr^d`R| z1BAXsc7BhWzy2!#j0yq_T{FimcxGx{ItBAITJ0!+wX-`IHu-ywAN_{gi?Twaq-1J! zHN!KT4LFLXm$u)5wav{}c?nMHxcc|ZlupM?tQ5T9F8vM795 zyi`};Gf1bSH8AWKHp9cobtdh#1}SnZ_{F$KZvH16IxU{)<+?-t`BK(<_dVC)1j?_X zuPiV=N(VYi-b$5fc!3)@AMms9*;|v-r=yG0{K_Mo3H7|6)uUo0q8zG6vWrP1R6r%e z$dbGMg;4ZDL`!m%9}DG0h{k}Ym=ipkR=XP}z%>r~#DSG477Ff5?oXF!TLO4BB9QT} z?&plnHs)mZf26ONh);Tx;RH|=FQUSlLf;&+SvoC}-AVtY)=&}48`q&thZR$XIQ%oVIQT5*qN z3q>~3J%I2`MYU=-&Ia_5(nRV!0C?%m+64;eqmrMl!&Fv>qB6TPAj9qV%sx06O@$;) zr0Y>NV7^+bN&IO678ZitILoQT@=+|i(!xYIr>%*WX~fYP)zb}fKR7B|_`Z~pXdDFz zBBxO?Ch&5h6VlEMevTeCRpCEIFBdqwKiAX(HGDzeF~d1 zSsJ@_0AGja?)}BrKl~utmhHA&SNj7Xe>~-$eWk%X_||%rfQ3Y9hvQ?DXNV6==i4iK zfmAwzEh3gU|F@Ehi=pftP;7qO##@6A3vK)t)T7V)H?LJhh9MCcQZV~zzKgMW4_F&s z9sEFES7a=Ibm%o7QJa{I=e@7tD4m5%2=@;jaw-?ax)T$^)%MSYfcqw#Nw_yuf5FqK~zv_`rDQ(^VDZd`+R)r{X z#DbNYt2Jp_u~$^m>HkH72|lksA77bbAM(Aik#vO4kU6!N6?x~{apgJ{h*81`fy*_A zf2>lEAH=vlz2oqHWQjBjpJQ>nU-$SsEa1><;+s90$ra|H+Ns5fd?wcK;C?8}U^1B& zez)Nbi_2Y~Of{-X5e_JIyC1I52Q)@$_+Ivelqhs{W}9qQ53aRAO0GcA(Zz*WU|}@i zG!nbZqSph9v>ON0Wx-bKW> zpq}jOsp_|@53zy6)Q%uZxsPHi+42hq6p@EuC&i+e5A{CZ`P$%iA6;g_{Qz=Yzh6}- zX1NllM$qw6sX1B`IQF0gKh>DHa^3Rw6SBgy;hJ3%?oor~(f?5Rk3c7vTo;Bvs^#m~ zF`T9h!a&4NUEF>&0an2fY7bOmXbs83e+T?&Pd;wEepnq5+^p8It_3L(iv8cz!>8%G8_?WU58d*l{yWecgP^6I8>jEzlSy&6g2ZN)(sNBeS zd8xn6(y{A-%Jo+gKl~hz8!7}#A)w#xVnQ`rikDn2n+Sp}fku5TmhMi@ z-k<{sf$jG%`H7jKgx@O0wM;mC9{uv7KA%c*M)LLZKVh(0L3r@Jf&X2okm1L2mTwof zFYY`JM*i6ZA?#vz4(CoZ6|}4#hZtql_KZ|GIV@}Ll4^M1%H@zIzmlL0MlMV2I+=m6 zA63Wx%d(jt#5qPQE2p1LwU1f`^!62-FY3uAnU9zbqfeGc&q*axg;=k;N^$w_jioQ< zu3g+rYI{ET)$G0{5&J@HLg%)^6~WSN zg2I4NX-;8@*WOjHuFcuXr|eeC!SJu}aWWZJ46V(OBrLW}#$lp5gfnrDv#B@bkGw>x zd8G*FFmCo_M;RH8?pNe3QW!mQHY?3%cxX-W_w{I(02`C*^&Cv-sq9JUC2Z;;77Da$>p-7MUPA{=^0tm_^rPsN1e(C zp^O-hsTyqel47vCfa`dauuZDU(l@t(eIG3GdEaRnh6rvp#~xXQ`Lkdtt&r8*{*luQ<(| zF}d?qv%`WkAt$kV27Ut297o&W4lJInBl7iSZXp#AYO^3+{5uOETN@#lWD#IcGiGK) zHEKf&rBel;_bcND;sVX(_pV4Jde38D-hA#K*!M_Dqf`$MiclXbd)9ed4nj{>6jw`z zKVQlY;}+-j+#Z8$M<~_l0l*q0{4D_^eA*BUy|Op+P`>qBkz9*LqGmvP-sEzkCj zNV^M*foJPk&IL3Y?GP;v`+1a#4sl8NXf}O- z8wq8rCs%FGN-I70VKFX<#&O@A^O zY{`!DbWDwS32;B_<4@XTz?Md?P*{df8+5KjPwA?L?~6jdpa@nH77Jk}yKhvSf1Ox_bFxjMOa zm@|pfE0tf@rq;rq+^X8>!mg2;}6iY-eCDN%vw%R5WKt z0VI%24^>SiILdZ8%|t{`xxbg(5PsWyFI?+)Ytf1sEb8l5=!sCgS2d)e0p0KenHsMF zi)WG52nYzA`~d{t(Y$aZEXGk=usbo)m#o!nCS$BLzByz-bv`3mV_E-mr#WFHnVz00 zE?W}!G4|f2A8|>1q2uKguX5i`R3Q$R6MOsUt-7smuQ>x$G7br>JhT8yF{`Un<8{!KaCp3g&yJe-Up;~Znx*#TwJtkQ=v7eq z%=MSqiG2n=@qG@qa?si-w#;jhtC96`O{rYHSb_--Yl>2hrE`Y`<3z|08OJbgFu>=B zrvzs_tQQP8FJs2b$B|DxutaDpm-D^Xi=3rah_|M5R@Hn1&f3W(6{SC)nJX{0!Nw`GG~ ze|6Lf3E@hf`yspu$D7GBy_4ydTAHCT*+=Sy#0VvJY z07tuZH{*{7s>rHUEDlRG{sZM1m~FB`Dq2d-)GoO$9J#CU)#7M_LI)rW?v2yU?ZW6D*nZulqC7!Y*O7{a2b{hhQOo??yT#MEM?@!7QCXIl-kM4Hs?=!3Mg zN(4(SBx`H~I*#f=F_+0If!!B6^_rSbSqjdPbwy%#8FvM+(9oeZYuk_NK5pbPWH4q< ztDe8T+PU1|tyk8X^|gVZS?$tvK1;qN8qLBoGkny_BwsG*YJxf{V=o(2n}Zfs#Q55% zHMN*DdlMgGvgbJp{K{!o`rTks&p#6=wdVG2oxdjINN)tMW{aw$sa&sT@kLs8(UxYo zYPmSp=P|jtcnwX+?xa(hJZO5yD@Jimr88ITT5r|Fzb1SOAVQ+!<{820#4S@WO_V>V zXr&&T!k`yq2yEjqNh>y#PUNl}T7&6tm|XgP)-0<-fIKHqxSUK*$nP-y3FLW;-|ewd z&>1|Gk`;vTfR*sgfOJb@QrNkxC?hl~!hSKNEW$pSyp+$(;{Mc^cJce6@aU3DWv9}Y=2Iq2 zc+Gs7G|>STs-&Q6BsV2>{X}&Yi!-B);`RjxkJmk@KSbf=LpqwW!VuB|hg1*~mdu&9 z%N~=9CU|^zC`!3k!lJtXP+pDvGql_;QDnhm+|l)tl52nb(!mYPOu%{$?<1I8?~Ojh zU0;GbT+=U^cLEm?$}NudBFAzin1cwgEa3RhTO@YpBYoF@rns&z|Hr1mVGCKo^Pj|p z_u(M(yn8mDRe!MqwAgInWDbuVt&D}LM1XSr*PrMC{Q6PX$M-lQ zl-mhZYWjX3fX^%X=gkCQ?*S_i_l4%k|KisH#CK^YUN+M%)iL&{BT7 zX)gaxBYFSy*mnY)i7Tz>zk~6I5C>51|IhyAwCjwhsMuV>Hy+|GbiKYEUbZ#ZI!=!y zxz&LjlT>wU=%rY%=S{Z546wwp6i`GXRMO zy44X%_JQ*96joP4pj2+(;|9RM>@Tm08{Q!Z8qJ4u;`!X*#O^uK?nkY`WKUnv78p=v zg5%4kdH;d4^O}+FF&C}9Ij7W_%AbQsuVGC+9g2wbylg;!fui`zXhX+Leh`)wh76B- z^ER^$Kq^Q|RV#k-J|P<1wh#RJUdaN31{yeN37>8iQM^BxI_@VVLqBG-3VF+VFdvGSR-drJHt)|zlM%5Lt zlI;GJvmys(c%!Y-xfpaaVRzW}4zIWpOx6wC@nT6RP_9D&1hg&u5#!=_`vWD3LVYRj zY_|=M{mfuF=>>3fsRb&4|0L^Mq($OPyM$2CGTzp8Y8_zm;O)e@B@Xd@U~F$kp6Xtd z6i4Nuh6mybLR0+6k9DPOQ;S6whf)4e?v2NOwANr18n`qrz{-M21q#NW@6P%Fp*)3r zJ4LILStN}*lhorAzIRk>gQec;?K&WJW)Y3X33*RecszMns+q&TJKq%hFE&WDqRs7a z&EbQ~{zVrKGXhAakZ8$SZMwKhv0rLC&$+I%?`s803QF@Q8;;owM#5N|U2d=(_Qyld zw7GN4VguqP6+3{1ZjSNQpo90jfe(-E9c~mpkj9*;G34fX(~^78-zv$@7JCU}wR}x{ zT`X1pYTNPf3E=QU^*4Q@fi={YiyebTqfNAq5}8<3`TgsUY)0EjI5FMVM^C2pH@fG0 zz^AfUDTID~azXQ|*#rh)fZyzQ?zN`Q%$9Pp@*}cX0U z;m=wpE0E-K_h^tD`nF&j*UZ&W3WO%x!8UFloDvDi#wt$$fOQ&6c_2`$G;#`rx_oX5 zw3(|*{5K|>ZxTth69qu&?~rU#)|{Z(W-Djn1i3L##a(Tf%&!(ImBrJdN%Mb*Y@ABH zoxt9B7OpPBTWmsy<8U%NyPAu8oY24F*IXIcan1S+qgCsAvjwO^DYPLVpkk+YAbdER zo*r;gj4=)yp+~E;#M^Cc=@%3?y1V2mKB*8fhj`z?!k~`JEmq)qXL6XQ4UfOR==det zHkPY@Z<2*)`K37)yXb+8Sp~A~(-55c*Nw^s>i&E^TE6QA3_sh6#EqL!=o9`kXs!w> zhf*BjtN2odRvj7;;U@CbNIQ&ph9Vk)6BvWk$A0#1X<~D%l+L{UJ0p_N)>S;-50p^I zcgfOX>9fB(P$W`hlOFS)?C)$SfEs)7GTVs&kuh+%F zchu&PoM2+uem6KPyv%aMy*-NH`9{1`)+4+p5*a^@w0f(Zy;WU#GgQ+^Io0P`xb|5 zW~;(tA4aX#iPU6Vee2J{jNbdZ!|y{(&h`xCw5y%NlZMu%d2+RH^P>v z$TG6h^TlxqzuR%uBu53U#H?ifVKv0n?H3`G@>3!BOjIQ|?h_UgJkAb1n)B zs7-|xz^p%0Xox*hXEx#>oyw;=tKPEf$+ABW#1yD?>3@YmzZL;@pxG7z zC?t?>Ye6GRt=`G2t6>qU3QeRe3jcb#hjiDXzU8^i5V@W1Z!jTOsOOhbIHS{PiB4v4 zRv&cTxaF#{zpG>=lS#(rxC8kI_!Okazjz2qdUl$kOPCJW4wU-NRLRl*E>YIrnKixc z8P*-#aaZ^-S0r;>ggz5Kn#>N+It|fkNI*nG1Yx!>td5s_t+2d2k9sq^<(l7$c%Xrk z9QjBdR9fe@9SHPgZzL1;=+}$oV&(4h!jrj>YDL6DsYqald{*us48deN!PU?kmI!7? z>u_8*V3%ArY>HtDE+}L}gca+LfS<{xpt)< zN7BMYV431Z(hXkXJ|~*zWJi`2cQn`5ws-i2gI;#m9F}=+I166g+#^Y~J`DyhT71F| z0P-m7e0I^Qr?7uuvjiLhzu>I7_P#$_bg=eGC@w)zdCh|6cTs6!M+I-4p+YSGlU1P-=|#rEBerMv;We&&2Y zM}dTj(`aEVkPl(aG%IZ~mbNSvBD?-*SfnonjH4&w|B?2VVO@1y+pm z5z^E(aKC{CAvfgS>#eV>8b@lUN372SbHu;?K#15pTx5YJ%CE9w6{3Z2ZQ7FC11i9;p_)yXUkpYP z+>H6Ibza_=ll_RwhCrqzn|Wh6DXUUpL#{M&b{cf(8QXTO=b25E#6A9=p;F6`EQB!d z42PLmdTvsG1rh5YTIbqoA(tdHFIv;Lh*6HYG5sa(hA9w8jBa;7;j(w{*1TOyKG-LC z7(8X^W$wT&9--)oxz+TG^m({XVfH~Uim54rF7XSqc#9;bvX1m!a0Br3^IM5 z5FvqF@go`v2mh<@ZVhkT#@C{|H%aqNMm(K0eLGi&jY!*46Qg^kvn7(Q)aLzEyDdsU z@Cs<~VQx$+gq9E-cMYhbsZ0K|u_)2*F91>5T5$qp!^GbC_Jp8MBE0=t?A>a+5}#I3 zyZ604!{{Uot?Ypys6Hc0hQWSPRT>`Vuvm;9qoehuPdA}EesjOqfHMn}Y%_*P@Rz zT2VaGDeRa7gxXe*Wm+vXAM2yVh%Wb9-QB*@DAJTi@;e^j+eDH3b^f$9+AzL9x?J)# zYI1ORUvVg3K|1#M&K6@55XcbdldS=1sBGy~T0;iow^AcRU|;D&gi@90E4RL6$H9Xt z(@lf)8ORG5bi>s1-XdVtGvH&yU1R_L^gF^w6B`f;`WYZFI$Ukc9IvAE+E9X*7-)+W zXjQI{q{Dis*Y>rh=8>~3Uy0++yO1~@%tz1^OQ$;!hwO>^PX#1Sbe>VF|nw;-w z*Gqoy38b^+;k}(%$EggC|C%Uz&xdLo9cg++fP2AocWk?7~<6?%#UF-oR;8JyGKC!*p$ju z$#v25_8o%h&|9SAfo*NzacuB&0w~(0oJ^p|8z$ox%C+F~-L9Hmna|OgG`DA|hSb)J zOV9)Y@sE}94M~++H*ys&I*o#iuE(2SocNj4+5RE%IyhXGO##k`n7Ux|0Z6{Wd0<~7 zs;rm_wmRX)w#SgQw_2H5+@6@D;m9_`m4LseY*tWf3$q*^}polLCP7ZeLVYA_e361%g)$@5X8BD0=#Oap1afZblT@-S1~!6 z^x{sE=o2^W<&TnCNB38!hx)mVvV3;eN5d&)2i@*Hm}(VLq`5kigINlH4n{tqqG!(jmMXJQ zCP0_cwcml^mj1zU-h)KGm(S^ucMieeg$lK#_^X4#>`8&r5?xBrYHy#>?mYCA%D6w?{PKM!lrAfu zPG(2LIvvYZZ!Q$)>hr9XJQ>T{g5zS&KH6u=l$%WGGz^FfM^_*c#TCCV{!p9g4gtN4<7&X1ctDSrnSX{<~-4@G1-Hot1k4|!%G4(^v zI}}>+y?=^_m_jC0ju9_dsqCV-=hGPo=0-nHy{WvHK&s3WrU{giTeD!8Tr^><93CSp z)i@6A&hRdKnVqB~LT$W@c|qWD{bMWDqQYT_2B;RjbV5zUsWcc0u3K~xo^@kAGd-3w zyuOhj+Nw14a1@P6z%nUA{mMTdH_8c~CE*vZ$A@RJ3?QP>)zv zT{WBU;p{`1&_1gjR*j>n;^!&pLm<2z7v?xpf*>IwsVrn`G{}mHsH4*fG%h+!R}H`I z^RR1Hi-(deyKpyudBd~htJJUfriv?k#>4=hw&-Bz(^3-m%juUICBNDIdSQ*@xv%d80`^ zg6Zgi?thJ+WPWnGj%$?nV;%dKO%P75SkztSO}BcUQ%ucd_05lUK2FO$@!Q1O;%gAb z1igXqSiq+J{03>WsQ;51L*-pDM#IO0`WIzhAzy5I46a0d>gc}gxAPOHLGxcuC>+#l zYOVAj;sj&Tuh-%ghdLLAUdc(ck{d`2dkW(QbJ|}B!*|@?s`N$frNjgm4JpJoG?5ax{;He)omLj*g|2;B@o7`9J=>;S;{ne$ps@Qm0P% zgVFvu9S9uJIHADHJn0+#+dgqC+9-!=*HiOxRPgw`)(mos35&6RuIgfZ>RQ>MkZVlu z6FNH|JtUV}H$J=g4?4qqngF`*lZAgbP4pzuLevVg|CDR|Z|^@vfu<|qJ{J8o8v<@m zLM3ijnAIr%o(Ap{B>dDSsZ@!?Ut>Iel1VvUQ6J^|pK(hNV?GTsgsFz+zoP-wTd+@; z2U@`QvErYRkpZ{R zVzWVGIHVagIywqxQh^HK*=$CEJ(YLQ`}WTbRqQzLB^H%KI*a9Gw)&b|Mzcb(K4XNs z)262{QP63&q5%eG_xa<~rmk2jv`R%vn-xxfEVVaH9LP61nF8{+XggEiqBt$DP!D#1 z+{lwOOMe2jKiH~xJ5_D;_)b0=3uuarQ>nDiP}8$BfEN)dSS=7OXbW29jYc!9b=LBa zQ}vkx@M-}m?TZ6$KTtiKbr>=tK4jT4h60dO#D)@@r~UcvXxbM*pd_sk9NZ*0X6wrHR{mUuh574C57EMLWYwRNqG~tR>FS z93QXLru47Qrxu<)j$D^rUr#nh8$QBzgQLC7els%dVHe;UiM#=@#SB=mfC-T6)hI z*tX(!LZ{X0_66Cqw&PBC;P~t(;*0HHn!KlJX%S2&H~7`%rhco!h-Z5(6vj;THFy%L_f z!(Ip2Q<7^Ed4l-j-o%7;nj{xee*2=irM@QaN%5t0y1d|MH=Cj zuqhUcjlK( z^|(8e0?o?Ie^;lbynntsvprq{OD{ucwY`{xS=X;p?Szvjlb%b<;xON)vT{YVGyTn9 zhTzxQg}LM1SSvc8=fex-nE`B8ea=F~qEJuD(04#Yf9zWo)ZN|U?#_V!%a@R2qV1*P zP&s0{&uNP^j2Ej((|; zVA!OlFU|$f_S>8Qm;=woZ6I8 zXlh>@ldgXMb}FvC_Va?FR3dZ8V2}S;rL*3A)8n(EX$ysopI8Ul{iiud`c>U+-2*W(TvXj_Xi4B#7&7ZAcHJg5lSu5^7TxaIn6!0&MfM4e>6kAK%#Na3_c zUTi+jyJjcZFJ!yG=Y$?xrnWl)_96mKaK)-k$hqdlAd5`be%aA^HhyEVRd8cVMTS-8i zu(Zozsk_(P@wsKW@?r>=#{0v>Hs18s$k(|#;nwB`MNGsuz`3@o`ir~HXWZ@1i@9HT zx5)S;E5$*jE`WFHB(cDni4Qmg7sHbGa+Cx6Dw?Gb=zJCTL31UTp8lUEcGhyDuG z9}DiTsyC0EQaDP=s_lTUp@8IVH_hSvHDYfHC5Op`JdHO^bw#Ru1Dqv7AvRxqI?V`@ z8}e1Cd5-EG{xDlH5Lq&oy5l65PKB<*qU!+T)6vs}Oc6UW7$Usg1%J~b9XJo=42l}? zP6Q8T{)0Fy+jn;sO-rvJWaVP9z~|$;u$MI1{#@-i{WLr}gPe+*S$) z?IzTIV?z)Q&O1>$!(ph9Ouu2djSWwCsTzXW5N>|&xB&50FV^NVy^a1%T*EsFe3K*!COgU)CU1k{Q*gn+r>Mb_}1>pDq6Ol2`E;-HXrPK0LTdv`_E_o?Aq{ zPAL^bUTyDh+0uV793oFi9*Mq=hvD%Uk$rHb9*izJNfN8)cD}(Uj5drOs>RY^4Drf; zO^pS-n*791QyYBcdO4b68 zK7+NlW(&1Yq7ej?r(Mt0x=wU|u3nQ}kx$c7CxF{^DL~Tc=SrD8cY5}vuZ}M3ODI%h zP6xA_xbW{x4_lK+}Pl1;jt5TAvtFuf{1@K@p{F#?c`RkiW1SG zwbjGvau_9746k6vL$ys1cOYq>OIV5qhptWr1w|D1(H|f%? zo{rY-!ph3y&}ya&y-ncD_a^a~X|x8T=DQ69gT6X*^xzKy{;f*1q(XIrCdgQ7db4|Y z{2mz;=^P<$4){%9-m@Bvq`?g5j}+dRc`vVfY%yFf;*bD^<{g$4XB0v%WbJXkSDD1+ zIpQ$|x4L2eY#ssTwjadx$?TO zQ_7NSw@8S^Qju^O<$sW?!8f+vn}yeCSQRk{)E&O_XCm(y9U9r<4z3mB;sDGwP5Je%Vsy zb`ube8_^J=Mpr#uY46UnCPaBEF+8)RV`x zUR8SV$_v^tWZ>>5)XJvYcLYfPs@~zh8|L!`)UbmFC<47_79Fr*W?@l0%)65buIckf?8k7YTtAnc-qzSZm5O=6+YoA>)- zY`COma!fPI;4vAb+qg*?is#!Q6qqe~=pixD^FUUWCku0!x350C(!H;~JztZ5k|Zv@ zC1foiDsqw(_4M5xByLZximWyoP%ioCBg*@B$Iso!({c)5k3tIOb|@}S0D|#tZP&o= z7v?gLiGaLFmYYIXi3E0f7l&PF(O?Dwsh+rUSv8Wkto0M=-bP2(#DNkn_AjV$q8wy| z-9}B--Wuj62vNS3*XIog$CnkDu!k-Rdz8<)IS&RhX<2gQI-*Jvr$c) zzJajLT`zr&w%HelPA-YzjmpJ?&hYe{-?Kp|b2ws@GtYd5z2v<|`gy|DdpIhRgY>`_ zB6r@#kc#@vR3(0-@-*`_k8_+Yr;C5AlY1}{lI%)HA-s@{XW{FwHJ%Gv-LP~r@b~CJ z0GZsIiT;_CiH(o>N8;TEtF$_F;dAxa``y_<&g!5=9oq4s^6pjXUFFIgaUl#pq0g71 z2e75z4o#$`3zNU3PCbZ%kiZ|NPE^>A-cp=xlSl6azUk zDXZN|R$=h+@a1Qx28K@9r%fhHCCQ5Msx&wpdkFWrA z^EN5t{XfQBf2>-GgW-a_u!MDTRl%VD90FHkL7*OGg*2bh{`U}^Hx(%{q!xyEoZ(;g z%`Y{f-?xV_oQ#+KY4)GCvVy$eoaCUDl3zXbtzrrBmP6M2Oudz6;j!&s$lJ>jF^Oh+*JLdO4A5cF5Xt4qF+p@aC8}zzjMLqh>-?IbxG`?qa)HHuh z#H;|A#@QqKKJ33|0^(^b&*Cxu9<&)Tm@>1gc>U17NBs1)|WWpFX6(xGOc73h$1(zH0WLIJiGLKE5`@7)j&p2^jiy{BVD3 zc|y7tV0=XCn^jE$?STg2KJ?Wifsbtce(g;BQ7O_CUGMcIgR$Q@CV%P1ZIwG^v)eiD zRG|XGc+aJq)BPq=YN`X+xBo1b#Qfuu^;pQBhqvV^M|0}&_VOW-U60*u@#cF!4F@O~ z@{t7Qr6M(j{F8wSn2>F_5SV+l7E571FsE7i$62!tThE?cq!BhG9zTD)U%5U~Yp^+g zjzOJB)E7;TIKD_;XG%uKooT!RS>CHlNXE#_2i_SRj9es=m!0tCI@@;e{B+B_nZkF| z=8klU9Ei2K<{nPdBPOuiH|f????bfh;GAyImmg5}>;-{+z?tPh4S1r@p@A1ucx7$w z(F{?EqRfZ|!SV5$sIUCV8#>5W13$BL9-75s-hQ6OM?Ly}^PEf@?v4~%aQs17--Z6y z-M3&AoVRFTN1$`n-}d-FF)J(zp?rv25_9eL&ulz2N{O8QgZT!$ka)UIU)Z!>i!>z9 zYSZlMPn4;$y4y!`g;E@Wi@hl`2%xZ`qgU>+oz>aq%x=37Z!X=_UT|NHZLD4n3gBn- zGVQj2s3_EneSR;9`~z`{Xj)nkx+W&xd@cAN>a8-Z&d7xQ1op^A zZ#_GY?yeDe&d$1kyZYF`iX~?{PY6IES)J+TOrAh(#{B{k>c&B|+39%s_cdHh-pD(| zCJ`#FY9@;&S1MZrPsHaXCwr z%I3C;n}0JnI2il9M7*;x$KNd&KE^0(Lc8rX2k%Jg;;m^(;2V@xlwX6|JIE$aI77H|}VvQ4taBhT?UKhAKHLmuU&5KS0S5 zd-A=&V}1roRs|0E9$)JolF-?1X8Zu6dTSTerWeP0Luno^VtERdmX`LrFdLS$^*D|u zB(~erI51+jj+=vAXZsv*Ktl9g8y~OuGdEvAtG@BSzuEV*cRyTozZ&=XMm{5{T&~+` zXm@ahg*)|#RHRhanL|CHP+PQX@B)_^f2vTiyA8dYms#*jk;4`x%|-uq#(x8I z5sMcMqs=BlIb;xhzkb0oYPBlamMAwpw}_7S+&X~TIjxK{jq>Tophc@cR;{-q&l}e8 z8cFB(?Cf4zO7|-^nr*hHgtw|K(5QHE-P78cV^Vb-6oNfHMFgKYDx_O$N9wgwafnZ!mmO+u7IgZxVZJY9` zLArHFbIJEy{^?N-&I+p@k8ri0;6H&wPfU3=lkz2n%vWCy%Vv{S zX|blyVZ5-&?^vA>zBWIB5<4+YLhpf z2U1;>CAj&Xlrou`?l>=q-io=GDpZgbDwX*HS68Zzj|+F<380HQn`eE!@$@N$=J-pA z)p4hzb&j%g_y3;}zK0@Yt^~%9c=M)6@{bfpHM;#Eb10d$AOuOh7Ha*(^?s8+lz>Zx z_fccIRaJ=mWu*gS&g3_Dbx@b2Zcz2|6l5t$rOd+S<$3d&m6=q5x^h&s;o$9Lu5Z-sd}$AFj2?IKOh?QN3*ZAkZ6Tr2Yp?V5)%`6CMI92WC}ebGOTQ>8ct;<;D(_Oq6* zoMLb;q3#wR6XOT^X(D9m*M@=rTJg;!Yv5f+%FQPv(!<#lHp|?TngpBbAmr^OW6Sc2>8DaIEk;TM zWT=Q%sd2QF99C{Q_Y8+6XF|H^gLgTH4JKFRZvPT73q^{!a@nt(rY*Of;sdoNke3kC zsNeBMJesUGlA$Etf4xs?sK;-zW=NAZ+& zHc7)&TWf!UA@7eWdJUdSA8UrbXT&3nb;rRpA5nzhd#8vqr2BG~+eFNKnAWKLc1@RL zsoK7FdAHt{@SU#Vb8^XRP(s%!G%i*7^TKD>08A;)f2Q=R)irc72Y!NUZ_z9qm$xg{^d){~ zR7VbAj!?Y#hh9QpowW_Hh5>|mXdcvbJ*2btzC1gvJoC*BMiOzFcjN2ZcDCB0883PECg zXfXC%3B@w4R|aO1MWz=e&N3c0_+h{{OwfM4cTSO3VNsGfY%rBq)~Iw0n&Tdh2QwUS zsIl|m?~@aZYVQ`LeG%Dlj0Td0uh&gf=dlnS>0)cl2^4(u5bYfZQ-uCO4UYf}UNwb4F*G(t=Z(BA&LamamP%-qn68JSINDh9rCMn!L5Np3 zY9&EZ^UV2N8Vp+UhD%rLq#a-GHJmkd>LP;j_I_5iU!SQeYX2&4SZa`Lbrk7M<*ND| zKGX~wfv@~fFT4#G^S^S2h+$&h_Z0ez8VOXG##s(c4(KC&p}fv_a5;}z4eK64>^`E? zK{*6Z!JI1OH|plL>M%Bua6-u_yL_ua(%xAqwQL9X4UX>*PL~IZ`2|c^!8A?&B%LCK znspSj2ECD5@H#1V(c*qS6r3Bw2485&#LVZKgnw%5}imtkPvm0#N- z)+m4bOuxr(brd*z8vfu3^?Yr7gH{LPV5#q;T!TE!E0R62sG3(r3O&c@!~LS$>|F7- zpQ=j9NM0(#TV-@G2OsD^)-9?3qW-x3sYL*a58dMAtYM}5Bft~QCaG0A)WSiF%6#rZ zqG3Jr!rm#}Rvc%!I=alLJ+C{ghQAwF<=1@Q_)c!{uyJ~a<}o(=D>C4SMEIVF&%;S=E$JOj6P}7k+8OW6^cX z`UMk4hL2W3#zz>K|NQy6!b_#G68b(zdHvCh(O_7IKPqV=Kk_*vxrgOMuuOxaaLUrJ zA}_zTxks7dVIzC)L-5G5=;Kry&0rYh8^U&#vl}!&qG8JJ`gMpPc?c+}uxzXAUbG8deCAI)(H}pE`MT7!%e8cOgfm)6y+vLs7S%qn zkAW8MjraRiv)ixy0Z)aYk_tdvZ#URFYVGel>u4V<-=kuW$s}8eqk+HgLiqZ|hSzOz zT%mpZ8?F)PDa z?}MC?LOp6t$eBckL?wHP1DRIE{YWY-;OF1md-tspPDVZWKY=>y%a`cptO5xP{_U4& z%S+K=p-VCMix0VJ{|R}KA?1w9z7U)y$o&-}FDJYvhFoO4jO+LN7gNA_*UNxVy#9ev zV3YB`(ea%Ph}my9TIG`>|J?6s{WJp)qPLkxnBKep#_ZnO;UMB~n^&em2ebSiP_gE(72Xx_=_v&-w}0J9RTj2VWLrt77d}^q)a~VuZMsM0aiD#%cI(!+;8t zgI3B_*7N>42F?UX{y=~Izx@U{Djtlw<5N`1 zU&n%4o-jwt($`Rpzi?3p8ekGCbT%LVI#!YJL`g22Vxs;$ORuMn5vu@30TUu@@z>)b zzIeL&!o!i-<}a`WEh*p;!v4=ayQKbyTR_@Du}bUv#ZQYc$(rXhQ9e=sr>9m2AM~8j z!t;^&Rz;-!L;c!{>n%+CvBI;(E8%ovMx8Np&T7-px zrzDtsXMD1ZvWAKDRup*WM^5+gwpZ(OU9)gCh`5>6KO#)7m5Md|n=TJBA1v*CtBJ;8 zDf2bKuN6quX26h-qH24*8N%b_+7|&5NRiA22vgecw~kwUd7QSH7&IG00m%3ceqjew z*-$nH;)NgXu9-|Pc&Z<>>5GePJS|V4|wHkJl+t$P!Myza1J?=vB< zN821{;KD}k!(j>K?`;gsNEH~F5!0>se1VF~Ye$9hn4t$HSL5|Woq{{ zNJH0*~tH6;0%C)Kat@P9&v_lwO+jk?8ZEy(J%=AHMqC~_5oTq^5KAbMs1W~0fa zBm8qUKUT>HqPXkG^Q4lWp+q!cKOT~4w5|rM=jA<_&EK5aw11m0dK25-`z=Mta%!X) z=VJyx%JAAv)z)xN63bQ;g*lBv#?4o5dx2&rZ!J0`TsGepcNTn30o;ZG+&ZtSc`l$ItiSsgJItJXjQQ1sDW%eCzth^?(wyQtTzdm)+(r9sgKeca{n2nr~9 z?ugQ(JUZ?aRZ++4@p^E7^~=hh%HK}_1K?F7_qBKet0or$u*QD(Wz~PIT9^!tLv zZ1dNL{WOKk{a1bW06KMMUx|G-on=fJ1=1S639X|Mq9xty5p;_5v>9(jTaHJHjfer6dEDgE2 zMrbrLv5Z~OM^a+qXFc0ori(dz?B>6|fZ|5rK-|8S;NJqSUKy#Sk7BgU5V?ma(TvF- z>d1KDU8%Mu3QyyN_n>e+CkmcpE6f137X6b=E(@6T2Ye()qHb}>XJ5z?Z%Qz=fCK^%Uw(-_!z9q2h3wow;rq5Hf z_Ga(CZN*6>WeTcmnYH92)D0)G`P^it4Jr}Oy(feXJ@~CEfYxet`qCqtR>*wlw)D;4 zc(b^{c|1p zs0Sw9At z>~H84BeV||nn&&a_^I#p`K{~tV@w2KWx9Pw`^1X30>T z{PnNGhm@H`iI3gik?Yb~j2zI&EOn-vg~iet*wkj(vg|vs0DkM(g;zm8WZCB zNJtLZAiL$<%j-5Xu>?BpFn3s#>`-ZH)?#h-l0bBEsv#mGg0W*r>btc$7Kb_?MU=Nukv-r z8>;gdq5Oqaeo`!B(MQ*mX)5*Z_-fY}@g^0)>(<|Ooin20giw!f ze%9!*z^ndNs1=7qAIzxWw%dK7r>AFM1|N2K7)~%*V=}J4&7s4T#_Ji*`t4(p>(c2b zgE-j7@JG@8QPY{iceo=j{J8JJE`*kgt-hax5p*vBIU^tN z4d4G286SS3ei{NYzryLam>GLZ`lJydCvle#+u*(mdQZv{6=LH#I{x4T+h;_U}sU4SCy_` zLtvlIWwJhDWnOTJd`?nMfE+rCrhOWoGBovNJ3^&u)7#Uj`p$-|tCEYYSYMLQITRq)dmkkEuRcGAf=dkl6Q$#KYfl`jfhC5jpq3x%ch?tyjp4;at zNp6hwT1q~-r4YU$<@G^cM$e@9z!LH08_1jR{^VNPYRuU>GK0eQulxx`noZAxJ;%Dq zB@HDIQ)DA|Ec>KP6GM&POroWzq|DaH8-|}43=r$(h0@T<>51m0Z#3IQRN!{H-n?HLf|K zw-n?#M&oB80$oY$xxue32?s3uVH|xUXjiLEm)@PXDH(3;AoZuq+!nVzB6~ehmUPWH zromEnHk{1g@w<(_(jWTdgw~Y(0+(G0#uI}fQI=AGk_o<%9jEpcE*9$13n0`4mdd1Y zUbQc6vH|HGKi~;rcK`gfTsyRO8Hw`k z4rcF^KBvUc?z^!KVVllzR=l>i>I)te203N&TNC6Dq!?PQHgT+Q$M$ng%R45QvoEG< z?LQ!;#bZt13L`X+%JNt^Om24hn0nt`D-!oSI~l`!WAg%R0a8My@i8?#{D!WK5!u0p z!M}<|v4|$~PAR~voBxgD=7+Fh)`^c|>0z;S3@0Bh9mUlOEd||obwXm9rUA@rL}0{> zuklrMsWeQS0}e%HQv-7Sxj<5N@j#>0gH_cgqa1F_U=s7_DPhFs5jHWux(vuWxq;cG z8TEg_jiy&uin9-dtd`H0_*VLp{}|Qee5h^x_YBhRT-Y#*KL2Xpn&_y;MB%C#njuTA z$BkI4w;Do-K7WU32rx=z#)Xmr?x3H%C zF+_Dd(-o_x{9!ud3qq>#po9tt&upe#Vm%JMgZW8W`kZ%U&ocksQcp8=8uKGQzq6Y8^QuT7*l18zztB#9 zf~8S+Y&r_ZksLK0rHp~mO`%{pUTe*5mbOu#9G+#MYc_qCD;CfC?c~R;A+hc}6G&wt zmr1vl6I^x3Z^2+i+iuKK+;~$zz8M4aSxdHal@ymJEVUWLh%ZSX=Z44O-Z>`Tgw3*< zhI;!3WD6H9Rp{-C1iP7wAVb#!qWEQ#V4; zjC(9bQr-3N=wpMeYy`5A*spr6U7ylsY}DEs@s1(4?uOhoz1tD*hw8ei(-x%(XBO{o zP4=oHeMrN(9~a&^O7(Bcbuu~i!cCSesqC*Jj;<8ziFgpiyi-1rgS*3k+&i59wPHy= z3wRJ=_i^a&)PcKl%W1LmvU~0sqEHu^*1M*y47hL%`?(sda15R(3VVs_N=vkzj$Zt( zcGOGt-}v2q(V*O5+^!e zm~Bt2S=!%y*^xX{eVn_j+a<>uh>P(ZqtW3NeqE;3hU2_Vl^9JP9GN1PL7lj(T%sUz z&hcsRy%avT6pW)^_m7}KEC_Axcv|pX$_n->O5r})dZV1@b-1tB8$a^SBaoeR|ENqg zwD9pX?xK0(PJoZvtbbCLu@^teC-p1aN1Cl;M(ui6rw`RT+WmdWyOr#W+O5rrOctRY z=a!|{K~VfR{A6K7qQ7hqhGZk9>FDeNlr~esU#~n*(UX>z_AMVxcE7zSX)H^MsJT61 zfX+&JMugRM@alLC&vWL(?4eW$Hj*V2{&g~)Nwj6!D=pfyndqZhBb9LJHgR7QZQA_n zmphgRPUb6OkG-Q;RXB<6o$^zt%JKuY?qPa_p_`ZC`guuS!a$P>wc9#uY3F3X zrg|iil2TWC6w;Bpd&sI{B_J9vRUk6w$jU~QU~g+G@dy;K0p~{Z3qcg8I1%pufI-+3fGJTeC>&ttUSS^D^+oEk|Uuf zSViI{ulfhFkP0ksaj(DEvHCx9Qv``upKi~|@{Q!r4W9UjH?}l@U)cBOy~}?P(;sGH z{gj82nl$-O8W4ae#2`!xr2y@PKDg*x{SAFMpYl+Kr9S^T=?}>fK?l@E#FLkq^XbBW zj)8QbQ~-TYjVRduJ@CY4vf;ZT#+tVsPaP6^x?HFg4kzF*SVkHGx*jDgKL>W@{)71Z1YQ6Xr}g5RR3H1l z#{ll2dzv^*agdn!Kb?Bx2QL4=>u8%W-alhHLWkpQf^GjT|BTNKVf5TExfhPUBupo5 zPRvpEPgEjEY=Qm~No)S$!Qi4I^eIcH^YQ}GYwg>!=Hrl?K9I`~@*vYAZoL zn=T2)o6xx#Tbi4hj27LRT`w6NWCTR$p<7>qNDJNPmcJGvxOdKG`REM@tcg~rJ?^eh zBMABBKw6jQ!yT7OfSWcy3^X)I-7z{kKc8wNSWg}}n$>D`Ay{uUKJrbZ?I9z*j@4@25w!A zEBmu+LN(q@Q4qsbcY-o@cvJYACY+NL?E1i}W2BSJNW zuSOdUK92XpOl_8FHNg|{xhYW1moB#7{TLXl^(P3%Vho)jYp2(!M6=yw?2LrqRm9n> zHrYj<-%k&FND`Ar5B)_-W5-6Y!;{A68gTY| zJd0L4TvT{HL1^Da| zDx1jdEfs~(oIc#Uj$^xI$dnXvx*qTZAQAaL+`H)YPvSUT+;K_#Qpt98R1;t^kl)Cc zN)bm~F`b%ey@zGW&?cHJ)kJS{IQ(&glwx&$V~;_$uL_pv1uB`%rQs2E9OHS?zHFu( zq~g(C1)$uz(f)Ui!<@$U!GddlvrF`53cWfeYr!KPE?aTgj_KM>wx&9rRwaIetvV?b zymbnPW%k!P#+^yiAoddVj$pq@P-&t&RQO5^Of&PyQ?U<7oPtcT?vJey9wA(aaC%wa~%@1!6w}Tbfv*S@O(UG2eR)1=LHc@FaUC-j-{!_ zDrK01Lsj1@pQ>s08;3YO$6k4O9E!h=2Z>h|`CE)^02v2nQ_8G_rUN)(tS7ZPd%6JPw7F6qn#z?wq8{zd@uKzkvwfwt&dtVFLX!K_4vf4_~u}&#J4ey zN)D1O0_{g|!N@oHJb@L#Ym*kc>B4rCOTNiMIYszTx0r!Y!VCT@bUm3>-+ZRt5b(`K zC0|~#MycAQe}{ZpY%Gds_oU@(dmu<&Y^`po<+?UHwsz!lf<1)$D1xYoS-epGYDBwP zL9@cD-fRPR98zC!7jtM?veg8y?(NEt5Uj?`a;~e1E!mxjF7CN~m&gn@<6f&fr84A3 zhX*_?O~y>4vexAv$rFfZH$Y&%7@9fI;;USSjt4&fN+@{4NO|e!Kz%dG3JtZ(*-iu^ z7Q@bt*?e={12KV*(B*J}Y85UfgPISh121$VQk!hD+s$;-PJ#fMZmd_Lb-7Eo+AD9eWppRl_f~z$=oInYC znqct1s6F7oA5{}L0pD>rIVc9_8cCALLQ*aoL1Y|Ci@7>W&CPIm9^~T zOio=+<7P0)R9BldcpOiKEQ!(Gl9IfQj*5b)p2MOK6hrFO-XIGtmJX-h%4X?wYxw=$ zmG{7}EBF{)JxzpcQRI(n#fnwW)oQPyOs7jkqe%S~tM<@YOm8r9Uel9NE<$ieA6+~4 zAaeroFD`NZ?nQ%;sOZf>m!>T;u~OA0LPZ+o99eIZdH&aOSy#$ST^jN6{f^~oas7qu zdY^?P_n2Bv+SstU4gH4wQYh?kInQ={y&rdr+#EQmvQ4+b%gL)49<@u&aK;VY&RfRj zq8&+I5DHE4$18G*Vbc6+{6WZz*gq%|Mx4@SddDbxu-LiDraxQ%2YDcBhR0XjqfQBE* z1d~!KDGU~c$9_&cPWR}<@zUeSc{k*0Qmc+(zr!a*w^7!dGyQD{0F3V0nc6$`@!jq! zin<=a>RWLJn9lczA~;xU)TBXo78hvcqFFR7$@%PwK1N6s0pdVna!m)8t@Us@Op>M5 zc4nB)f^u4B;rd3Ow5V#jxaGB|xX2}9KP1VgN2SA2PIt4JT%|N_VqsPytd9t(HPAM? z0{b%0`G*70zs-kZH1;nG@z4XZPb+Xm*y|9|V~p+w)vl zieWf5jn-@N$&%lq$(hW$u*We7-{brmFOX|VMq^SW0WbKN6tPf%T|Zd?(rd*+jGgg~ z?*`|sI>!j~A=RfIXU+T{(trB(e_!nAq!g>#K$>2!Qo3CWL=j7Df3HlLh4qx6RXAU7 zFA5)O_GtF|as^7Jet+4<73F==B8S;|O(b+C?#Dk~NFbaF!oyNg67A_=>by_+~8FgVSs> zq?RW(sU*wEMZ6Q@GMctS6TDn$@90eAbS}K{Joa&>QYa8`YKpQEB<_csEKs6;PsD>c zDHTIGb3UZT4H7%L=H707H0pJvXDq?N5jQo;WIb>E-k}kBhecNLbDRn1H}8en_<9ci z^WEqlvFSuJ8(~zpb0(&eplr2GHN>qi_dC;%d@&XJW05yJ)J8J4ipB58zUzm3Kulxq zAUe4<_x-M7*j_uTvp_FgVz^~Lecapa!Su@=P|p5;8avCVsQS2F3(_q}NQyL4Qj$YS zj7UjJcS?*yN|%UqccXNJfW*+=Gxp{_bh zR9v+xRoZ3@a8dUgWQ$<~@q@K5g_thfgJ4CD>j)CDc1jjb;9||@pshknE8^&kuUrMg7CY%d^q`$l}hsg7-k1 zJZ0(}HIN?-Vk2zi+G4cp74>dEdm!a>Xvs=c31%)tq*xrIN)-I|njk-5Rh0=?*ynH? zf_*`stCW4R zlmZ{D6SI1t(QP9t$DWH~hu{sL{g`;*%_)@t@@+I{f2PrGzBIVVA#HY0&ipYy>P}vi zN!Mz?A&YKq;JcPgBWo9(k53$=Uc#ZZwwHG^^^ z7x4Q5#M(ObKQ*r(Zd*r#V_mk)-rDX5R|orlz(dFOCP> z6Xaf8e_hkY=%7db+?#N+|IET6K!k>VK-SH1S5VxlK+8V^PzUNpp+_y_*rnA`vxbIf zW{V=A@!hp8D64f`;1fj;N{lj|ZpG9uUx$K()+JF73vkCNv0@EzAIZ+)QSnhj!R|f1 z4z@iswIFxY;U0s%fWt?|5Xw$) zOdbR1@E6eONWYJk9#=5Gd75ha4kS(?pErLwDb%mh{8Xb<(;TwP){OQrZQ#qMo;zOQ zJ-l%J4d`#6c(WMg``HC<-yi*v7g^@a8ofZT>Jv9Klw3Fvg_ceTr5bIw!#+?$Z~eD# zek%7^6mw1xzA`qY&9b#xk+_9)y;O)J6uav-eCK-f3ohmR6BVWgoj2=U6D+rdhIm8R z9FSPnTA1k;mJ?i#QRuaq_$_F{Kwa;5rQ-|C+uv4z1~@jR&TK&9k9MMZ?(tzV)GCJS zW)W;@JT1AqC+NNQF^kn;d}XU@83*qZvu+*1`{ONqJRFu6;hU+|=Sm2X?&nOb9bS{1 z`_H^5d*-h*(P^+-Z}H)a5gyJPhI@^HYp}$R;lBCcQTH%)3Lu=F9pYn-#mA4OFVC|$UfjMB4-5sJRhW>A)IkG0fr^kVKwy7 zlM$pQ$Ksbd3CcIaw2%yRP?I^nQb5WcT zg3_v}Fs=`I{Q@o_)!E&T{aS%|cX_fBfvU*rg(T3Dka(M{*~^5QtFA4L(;<`^JeVU+2p=1{m;W!JPt#aeJovb$xnACJQpQE9P zXtQ`@4aF?gwLCpz>WPjV=DwsrPjC%e&M}_hEj5tgb!{Duc9(qofp95|N01kHC1>u-j4b&LEO}GKik}Nbb8xFs3q1@`D}m{)~kl z&U!rqI=TB{FTk04`94;@fa?;0_E*cBFqtJ;bBDHbdO?HB9KvhG+`Ck#Epl-QkFJhu z7bO`a`s#b*&&Iyo;236!;ZI(1jQmW1Sa(>A2{?E0NrEEG7tKYlbc++vqC{^PB}%kH5wdc{^dzD5ZhuI$&(-JP7=wmacRz=BM>>lGUd-uJ?*{JY zwErIZu_D6iQ}o*9w)$@yAl(9HW7*Yi-`sz%#a93fygq^Rn*Q9se9I&Nros+tpF)ZL zgRv|0z`tf?ZJHw{9E6NCI$d)FT=*lfGvovCV8}*MeDMEDg^)nRw)K>Fx4*Xi|3B`E z#5VQ3&@3BCk06?+y;<1bYEyGU?ndcy| z1urBA5n`X`USc*6qkatES5g{CdQS7}%6JRq329I@BZ{$zuaD0?pjn!lq88pVo;PfA z<=RfZNM5^u&VLACgc6^ev~6VmkUY{xt`1Jt(cpV$J2~mGWmKV7@ygV z)8l`2U|Jv~!8lg6fH?KN$E!E#_=<`Rk%Cahha9>;-3#Rrh`jA_i{JdzZi7m>p?)lz zK5yulk;Pv+U^%v|L~vM&OQ!zrHrH@EAC@-0K@13F4_R4z1Khgfsg9d27d@0=8C?oQ zlB*1CDHHcWm72Qg?3k#A(7_j1AF{Mj4cp(ebqctiS-wgw3R`?^SXsh?FPpXI^>~V}9SrYVQY+j$^HOmREPf zfL0;H!PziGmrS8%*(WSin@S+8ruk7E7dH?bD;ORz`t;H`#t7; zbo}<&$#A)3UKWt&MZlw~jg_TVsk5`+bbmoTJ~j5+{bf4W<8554Z7f6a+h(~85EZ}$ z1A@}^wW`cTPxj`6{*e!78qFx;%d{{#%eu>}tHm?)@v@ggdPq6V0$WItn{J=u3}?VH zHwXSL`iWvtl`*TF_uglw7V(fvuKSM#YU@W(0~b9`rfC0%&n9{cJO?Er3yW0fo;($V zr_`biE`DGSlj8Y0;!Qo> z$@gl2?Fo=!AHd)y*SO}MX6kd?MFb;9h2AvlTB)%bpe-zb$V9!cfZO40uleLc_>d^N z!&xE^;OK=B-r%B za4-RtGC2QK$^f}IN{Z+9pHVjnD8ISL3?@&OJB$(z=#(p~dv9JUvR5JyTTB=3NHv%a zQ1Qt1z8zv?LWv-r-p@6 zopJ)QLeMuS>nzpolRD2IRNmFU0)S*-j%-A!TpTy*%Xl`K>3KtQbF}|=Nswz+0z!W8 zz?k8)@_EQIAh(*1J($A(;^q4;1axO3`~-YJVIHcvM~!N z_)Ur27$$eeqih?RM_221R@i=u#Ey^2FsIKwo(l|XP^vaLJHN0iw&Lv#+SpS9ogfP! zkfpTk!N$QNOI0~^Sc2D93*Stxq0Zu#mXJ(O?VA0E^U6|`Nxn+W9RjR21rT8An+vLa z^0v0Lpl;D>`)NWaRUnxHPc^)v9y+?8P@*Gxq2UDb7L zWRy;YolxA71SOrI>`!1(*xAJ6gIUnim;ES5jqCgVBu^S|BKJ60HLNgBx#<0plcjDw ze6?GtJi05PpF1dd+TGi`m{vkVKD%{X?ygZ}`AJL2R`Hf z-ZkVl^hNMW=ftM%4>t+-P(5M(o$bVtwq9+aAUod%wUX?zGER+~S~QdHQ1Pa3P7}L- z1sH2g44Rxp(eU9B8_o*qUcfSz%yK43B4DUy$xE|=Y-e^hwh2Dcy7#+6p<$~zfu7LB zC zl!Fw^RVf`Lrb7$u!U3iNBeihAy4Hm`VLK_S*HjoCIv=DA=G$Xhq!T688KjtZMl7#R~` zmVsmN3WDw}9?WcP65*Ahv<9*{80lE9;%9zecd#=2%z~oOKBq4USoGeChcwf+-~8Ko zKF)hVr9;o(D-2&0;5mmm?g}Ikp6KC`WyTKx{+`4ezF9E<2^%x5{8IXU^3%(Ht$bxr zv2K+_*y59*dTVapQXqV#ZpIq9^u10(&nb-;LO7sb9>70oKcUS6h;V-@M-s$=q`0FW z`E&)lt-{8P832=mOM^Y!N*t%(7M52JJjx9Zb7FawDiY@0NB!-c2jp;ry=Has+aTuV z5b9oYh6wHvxE``f!mi!Lx;Vw}P_Zr~2;J!Dz+64!o>5DF^(2^x>BamaIZIZVZhfUG zKZ}%P2Bds_9T8@DK)3X6xw5bvz+igPi!NTdgWf)_#4EH!m@Z7PSmkN z3tC@}+zxYfg%IM`No+|xPnW|F`C6X=>o|T}X-vA@U(UH0@bY7O3!H-eszVkY4mikQ zI?{-FC~FIGtjQ&FDf(X=k0jas0+zho!F7OlSn1M1dGj=LMb{jEH8UNoutFt>$8rW??u{?s~(ZUkp21G?5z+I4xg zF2CQUgCY_ZedoDwAP3`kC;=J5%JIi&t3%ety zV9Y93n;qb7(e7&Ln=*R0rsgigoavMed5Rm&ug!5Djp*1iE?%OST3Nl$n;2w&Bwfb{ zkk!1b@v>h^jIR|hD2sdb0z9$4s}1@Uu~m;XJ9VeO=R;um0>o*F3ez~*0YRLc28Fj9)*6fxiw`zh!_yl4Ch8G=Mk$pi zyN&&*dU130?+R@2=9o=%wDqbC2A~Jm^3uo#+Y<$oq9;ZDiM0OTyv`4ZonK#0+NkA- zQTv|HO7^49!25--@Vu|HZp7Xlk=^XA_=J>}mREe$u)Ui{Eh;_!BcY)U_GT!`Q>wK{ z5G4G3q{LanEU-Rno)A}Hm%DTxXXI7Czd%>Ui79Zc}Uk7qdgv_##N?^b;Nh4+=mZxpr%%)0p1Nb z?$2X{C5-V;kqN$MOI1pL;!TE6Y^Z|BHfl!uRl8C8_WP0`7Via^_rxC8KoU%OH?+Ql zQg8rrb%sf}#8J>WGx|?=lH&sPWw(PeS{^+2JEEzrC4z|AR#j5k9~b~@o&TT)ZHJbM zqAvj%LM%sabt;FJb~-GqnZ0UKVBn6r73;aG3nplU^y`UM{px8Hc3eZ*N9qtuo+0+n zIh?mNx$wDi)U%TMW;A|cpRAymEO_E+qtNW+&XVspSZCg=5S7874+OYh`xWMG(qSb# zyePYoT9*1^-mdnMHvFny%tqOH;1In&YP@#>43_A7@+mNU1G!U*;4T z^|Nw16~>w-eT>NIRw{gq)BK2BQ=KI?A@(5#9eJbjJ#aj5{#hghbZm|DGCtddPp@z> z<(61OB<^1p_|0-mVi+i(!b3%&U8bQaTn`4}I!|p4P~QGul@81SRRdr}D8I$F%*oBDwFB z4^ekU);R~>)IC)FGOT{%h~e=Bin;m8A~@S>?KW~$?kAd2Z?eNz^fO!oYpa=xzmeKex!DZP2&?}5F6 z%F)0_prX(+IY@PWU@Ch>#)Of=ZKJ_WFHF*lGIY4HGW`wSN=ue*6sO22QSBfIWIXAY^5J? zRf{^WK#d4|-`n(uV~sEixJ-8IWqO(THiqvNVJ61JDQpP;Tf4q zj}LI>E=vAz*8l9OYDAOM?1+5#U)19xIYOSo)wELoOP(5)0T_U#6erc+Q9)~jrNyWF zS^YnL0QhAT00hX!ZF2nQ-XHPAzWE4AYr-K;<3E4^oE>cuT!#N>tOEG{{CjwS4)wq& w2>GtTMUsydiR#vu9|77$%pX$Yn<2Gyo5Z?^)`jiSa}W3fODn!8l{EDGABR9B?*IS* diff --git a/docs/self-publishing-spartacus-libraries.md b/docs/self-publishing-spartacus-libraries.md index d8679751204..24dee4f7d70 100644 --- a/docs/self-publishing-spartacus-libraries.md +++ b/docs/self-publishing-spartacus-libraries.md @@ -35,22 +35,18 @@ For more information about using Verdaccio or another registry software, see the git clone https://github.com/SAP/spartacus.git && cd spartacus ``` -1. Use the branch or tag name to check out the branch of the required release version. +1. Use the tag name to check out the required release version. - For example, the following command checks out the first code-frozen 5.0.0 release, which is in branch `release/5.0.0-CF1`: + For example, the following command checks out the 6.1.0 release: ```bash - git checkout release/5.0.0-CF1 + git checkout 6.1.0 ``` - When choosing a tag or branch, use the specific major.minor.patch (for example, `5.0.0`) of the release you want to use. The latest release is always recommended. + When specifying the tag of the release version, use the specific major.minor.patch (for example, `6.1.0`) of the release you want to use. The latest release is always recommended. You can use the `git branch` command to confirm which branch you are on. - **Note:** You can use the dropdown menu for switching branches in the top left of the main page of the [Spartacus GitHub repository](https://github.com/SAP/spartacus) to see which releases are available. Click on **develop**, enter `release/5` in the search field that appears in the dropdown menu, and you will see all of the available releases for version 5.0.0 and newer, as shown in the following example: - - ![GitHub Branch Selector](./assets/github-branch-selector.png) - 1. Run the following command to install packages and then build the libraries: ```bash @@ -116,35 +112,32 @@ This procedure can be used to create a fresh application. ## Upgrading an Existing Spartacus App -Before upgrading your Spartacus app to version 5.0, you first need to make sure your Angular libraries are up to date. Spartacus 5.0 requires Angular 14. +Before upgrading your Spartacus app to version 6.0, you first need to make sure your Angular libraries are up to date. Spartacus 6.0 requires Angular 15. ### Upgrading Your Angular Libraries -You can upgrade your application to Angular 14 as follows: - -- Start by upgrading Angular to version 13, and verify that all breaking changes have been addressed. -- When you have updated to Angular 13, you can then upgrade to Angular 14. - -You might have to append the `--force` flag if you encounter a mismatch between peer dependencies during the migration. The following is an example command that upgrades Angular to version 13. +When upgrading your Angular libraries to version 15, you might have to append the `--force` flag if you encounter a mismatch between peer dependencies during the migration. The following is an example command that upgrades Angular to version 15. ```bash -ng update @angular/cli@13 --force +ng update @angular/cli@15 --force ``` -Afterwards, you need to upgrade third party dependencies to the version that is compatible with Angular 14, such as `@ng-bootstrap/ng-bootstrap`, `@ng-select/ng-select` or `@ngrx/store`. +Afterwards, you need to upgrade third party dependencies to the version that is compatible with Angular 15, such as `ngx-infinite-scroll`, `@ng-select/ng-select` or `@ngrx/store`. For more information, see the official [Angular Update Guide](https://update.angular.io/). -### Upgrading Your Spartacus App to 5.0 +### Upgrading Your Spartacus App to 6.0 -Spartacus 5.0 includes many new features and fixes. Since this update is a major release, some of the updates may also be breaking changes for your application. In this case, additional work on your side may be required to fix issues that result from upgrading from 4.x to 5.0. +Spartacus 6.0 includes many new features and fixes. Since this update is a major release, some of the updates may also be breaking changes for your application. In this case, additional work on your side may be required to fix issues that result from upgrading from 5.2 to 6.0. + +**Note:** You must start with a version 5.2 composable storefront app to be able to update to version 6.0. **Note:** In the following procedure, Verdaccio is used as an example of registry software, but you can use any proxy registry software that is similar to npm. These steps assume that your proxy registry is already running in a terminal window. For more information about using Verdaccio or another registry software, see the [Prerequisites](#prerequisites) section, above. -1. To update your Spartacus app to version 5.0, run the following command in the workspace of your Angular application: +1. To update your Spartacus app to version 6.0, run the following command in the workspace of your Angular application: ```bash - ng update @spartacus/schematics@latest + ng update @spartacus/schematics@6.0.0 ``` 1. Follow the onscreen instructions that appear after running the command. @@ -153,7 +146,11 @@ Spartacus 5.0 includes many new features and fixes. Since this update is a major If you are using Verdaccio, you can end the script by selecting `Exit`. Do not force-close the script; doing so will prevent cleanup from running, and as a result, the script may not run correctly in the future. 1. Inspect your code for comments that begin with `// TODO:Spartacus`. For detailed information about each added comment, see the following: - - [Typescript Breaking Changes in Composable Storefront 5.0](https://help.sap.com/doc/typescript-breaking-changes-in-composable-storefront-50/5/en-US/typescript-changes-version-5.html) + - [Typescript Breaking Changes in Composable Storefront 6.0](https://help.sap.com/doc/typescript-breaking-changes-in-composable-storefront-60/6.0/en-US/typescript-changes-version-6.html) + - [Technical Changes in Composable Storefront 6.0](https://help.sap.com/docs/SAP_COMMERCE_COMPOSABLE_STOREFRONT/10a8bc7f635b4e3db6f6bb7880e58a7d/93ffb557d3c14922bda14dfc8b4250b4.html?locale=en-US&version=6.0#loio93ffb557d3c14922bda14dfc8b4250b4) + - [Changes to Styles in Composable Storefront 6.0](https://help.sap.com/docs/SAP_COMMERCE_COMPOSABLE_STOREFRONT/10a8bc7f635b4e3db6f6bb7880e58a7d/d008d0179ea141bf84fde6ec98244ae5.html?locale=en-US&version=6.0#loiod008d0179ea141bf84fde6ec98244ae5) + - [Changes to HTML in Composable Storefront 6.0](https://help.sap.com/docs/SAP_COMMERCE_COMPOSABLE_STOREFRONT/10a8bc7f635b4e3db6f6bb7880e58a7d/f6ecd8ecdc6042dca6552c0c16448e0c.html?locale=en-US&version=6.0#loiof6ecd8ecdc6042dca6552c0c16448e0c) + - [Changes to Sample Data in Composable Storefront 6.0](https://help.sap.com/docs/SAP_COMMERCE_COMPOSABLE_STOREFRONT/10a8bc7f635b4e3db6f6bb7880e58a7d/911c4c3a9e8c4d51a9ac4cc48cd4fda6.html?locale=en-US&version=6.0#loio911c4c3a9e8c4d51a9ac4cc48cd4fda6) **Note:** The process might also downgrade some dependencies (namely RxJS), because Spartacus does not yet support the newer version. @@ -161,12 +158,6 @@ Spartacus 5.0 includes many new features and fixes. Since this update is a major You should now be running with the latest libraries installed. You can open `node_modules` and check the `@spartacus` libraries that were installed. -### Additional Information - -There are other important details to be aware of when upgrading your Spartacus app to version 5.0, such as the removal of NG Bootstrap, the removal of ModalServices and related code, and the addition of new entry points to the `@spartacus/cart` and `@spartacus/checkout` libraries. - -For more information, see [Updating to Composable Storefront Version 5.0](https://help.sap.com/docs/SAP_COMMERCE_COMPOSABLE_STOREFRONT/6d285368b1014628aebbe0aa2c74cd9d/7266f6f01edb4328b4e09df299ea09be.html) on the SAP Help Portal. - ## Sharing the Local Repository Other team members may want to consume the locally-available libraries. It is recommended that you set up a server where you can install the npm-like registry of your choice, and where you can publish locally-built Spartacus libraries. From a4c9ed448943a02fc8034a9c785443fcc499884d Mon Sep 17 00:00:00 2001 From: Grace Dong <127385561+i53577@users.noreply.github.com> Date: Fri, 18 Aug 2023 10:28:28 +0800 Subject: [PATCH 02/19] fix: agent starts customer emulation after creating new customer, a CONFIRMATION message popup (#17765) --- feature-libs/asm/components/asm-main-ui/asm-main-ui.component.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/feature-libs/asm/components/asm-main-ui/asm-main-ui.component.ts b/feature-libs/asm/components/asm-main-ui/asm-main-ui.component.ts index b9f71340635..2d4d0b83384 100644 --- a/feature-libs/asm/components/asm-main-ui/asm-main-ui.component.ts +++ b/feature-libs/asm/components/asm-main-ui/asm-main-ui.component.ts @@ -306,6 +306,7 @@ export class AsmMainUiComponent implements OnInit, OnDestroy { this.csAgentAuthService.startCustomerEmulationSession(customerId); this.startingCustomerSession = true; this.showCustomerEmulationInfoAlert = true; + this.showCreateCustomerSuccessfullyAlert = false; if (parameters) { // TODO(CXSPA-3090): Remove feature flag in 7.0 if (this.featureConfig?.isLevel('6.3')) { From 9d971ecb8893da895a04cd34517a4deb69e362ce Mon Sep 17 00:00:00 2001 From: Roman Chygryn <129765378+rmch91@users.noreply.github.com> Date: Fri, 18 Aug 2023 17:50:00 +0200 Subject: [PATCH 03/19] Update full version in versioning.scss (#17768) --- projects/storefrontstyles/scss/_versioning.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/storefrontstyles/scss/_versioning.scss b/projects/storefrontstyles/scss/_versioning.scss index 250a70f79d2..5ba22c35349 100644 --- a/projects/storefrontstyles/scss/_versioning.scss +++ b/projects/storefrontstyles/scss/_versioning.scss @@ -24,7 +24,7 @@ // or `$styleVersion` are enabled. $_fullVersion: ( major: 6, - minor: 3, + minor: 4, patch: 0, ); From 566446adb745512ac9a847a098c42e3aa72bd6a8 Mon Sep 17 00:00:00 2001 From: kpawelczak <42094017+kpawelczak@users.noreply.github.com> Date: Wed, 23 Aug 2023 09:09:58 +0200 Subject: [PATCH 04/19] Chore: Update latest webApplicationInjector.js (#17781) --- feature-libs/smartedit/assets/webApplicationInjector.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/feature-libs/smartedit/assets/webApplicationInjector.js b/feature-libs/smartedit/assets/webApplicationInjector.js index 0e03ead7e02..8d6dcebe2d8 100644 --- a/feature-libs/smartedit/assets/webApplicationInjector.js +++ b/feature-libs/smartedit/assets/webApplicationInjector.js @@ -1,2 +1,3 @@ -/*! For license information please see webApplicationInjector.js.LICENSE.txt */ -(()=>{var t={874:(t,e,n)=>{var r,a,o;o=function(){var t,e,n=document,r=n.getElementsByTagName("head")[0],a=!1,o="push",i="readyState",s="onreadystatechange",c={},l={},d={},u={};function p(t,e){for(var n=0,r=t.length;n{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Heartbeat=void 0;class n{static startSendingHeartBeatToIframe(t){const e=n.getHeartBeatInterval(t);setInterval((()=>{parent.postMessage({pk:Math.random(),gatewayId:"heartBeatGateway",eventId:"heartBeat",data:{location:document.location.href}},"*")}),e)}static getHeartBeatInterval(t){return parseInt(t.getAttribute("data-smartedit-heart-beat-interval")||n.DEFAULT_HEARTBEAT_INTERVAL,10)}}e.Heartbeat=n,n.DEFAULT_HEARTBEAT_INTERVAL="500"},167:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});const r=n(874);class a{static getWebappScriptElementFromDocument(t){if(t.currentScript){if(!(t.currentScript instanceof HTMLScriptElement))throw new Error("getWebappScriptElementFromDocument() found non html script element");return t.currentScript}const e=t.querySelector(`script#${a.webappScriptId}`);if(e)return e;const n=t.querySelectorAll(`script[src*=${a.webappScriptName}]`);if(1!==n.length)throw new Error(`SmartEdit unable to load - invalid ${a.webappScriptName} script tag`);return n.item(0)}static extractQueryParameter(t,e){const n={};return t.replace(/([?&])([^&=]+)=([^&]*)?/g,((t,e,r,a)=>(n[r]=a,""))),n[e]}static injectJS(t,e=0){t.length&&e{"use strict";Object.defineProperty(e,"__esModule",{value:!0});const r=n(167);class a{static convertWhitelistingToRegexp(t){return(t=t||[]).map((t=>{const e=t.trim();if(a.whitelistingConfigRegex.test(e)){const t=["^","$"].join(e.replace(/\./g,"\\.").replace(/\*/g,"[-a-zA-Z0-9]*"));return new RegExp(t)}throw new Error(a.whitelistingErrorMsg)}))}static getWhitelistFromScriptElement(t,e){let n=[a.getSanitizedHostFromLocation(e.location)];const o=t.getAttribute(a.allowOriginAttributeName)||"";o&&(n=n.concat(o.split(",")));let i="";const s=e.document.createElement("a");s.href=t.src;const c=r.default.extractQueryParameter(s.search,a.allowOriginQueryParamName);return c&&(i=decodeURI(c),i&&i.split(",").forEach((t=>n.push(t)))),n}static isAllowed(t,e,n){if(!/^(https?:)\/\/([-.a-zA-Z0-9]+(:[0-9]{1,5})?)$/.test(t))return!1;const r=e.document.createElement("a");return r.href=t,("https:"!==e.location.protocol||"https:"===r.protocol)&&n.some((t=>(t.lastIndex=0,t.test(a.getSanitizedHostFromLocation(r)))))}static getSanitizedHostFromLocation(t){const e=t.port||("https"===t.protocol.replace(/:/g,"")?"443":"80");return`${t.hostname}:${e}`}}e.default=a,a.whitelistingConfigRegex=new RegExp(/^(([-*a-zA-Z0-9]+[.])*([-a-zA-Z0-9]+[.]))?[-a-zA-Z0-9]+(:[0-9]{1,5})$/),a.allowOriginAttributeName="data-smartedit-allow-origin",a.allowOriginQueryParamName="allow-origin",a.whitelistingErrorMsg="\n\t\tAllowed whitelist characters are a-z, A-Z, 0-9, -, period, or *\n\t\tThe wildcard * can be used to represent a prefixed domain, Good example: *.domain.com:80\n\t\tbut not a suffix or port, Bad examples: subdomain.*.com subdomain.domain.com:*.\n\t\tEvery whitelisting must contain a specific port.\n\t"}},e={};function n(r){var a=e[r];if(void 0!==a)return a.exports;var o=e[r]={exports:{}};return t[r](o,o.exports,n),o.exports}(()=>{"use strict";const t=n(597),e=n(167),r=n(750),a="smartEditBootstrap",o=e.default.getWebappScriptElementFromDocument(document);if(!o)throw new Error("Unable to location webappInjector script");const i=r.default.getWhitelistFromScriptElement(o,window),s=r.default.convertWhitelistingToRegexp(i);parent.postMessage({pk:Math.random(),gatewayId:a,eventId:"loading",data:{location:document.location.href}},"*"),window.addEventListener("load",(function(){parent.postMessage({pk:Math.random(),gatewayId:a,eventId:"bootstrapSmartEdit",data:{location:document.location.href}},"*")})),window.addEventListener("message",(function(t){if(t.data.gatewayId===a&&"bundle"===t.data.eventId){if(!r.default.isAllowed(t.origin,window,s))throw new Error(t.origin+" is not allowed to override this storefront.");!function(t,n){if(window.smartedit=window.smartedit||{},parent.postMessage({gatewayId:a,eventId:"promiseAcknowledgement",data:{pk:t}},"*"),n){const t=document.getElementsByTagName("body")[0];!function(t){if(t.properties)for(const e in t.properties)t.properties.hasOwnProperty(e)&&(window.smartedit[e]=t.properties[e])}(n),function(t){if(!(t.js&&t.js.length>0))return;let n;n="string"==typeof t.js[0]?t.js:t.js.filter((t=>!t.namespaceToCheck||!window[t.namespaceToCheck])).map((t=>t.src)),e.default.injectJS(n)}(n),n.css&&n.css.length>0&&(e.default.removeThemeCSS(),e.default.injectCSS(t,n.css))}parent.postMessage({gatewayId:a,eventId:"promiseReturn",data:{pk:t,type:"success"}},"*")}(t.data.pk,t.data.data.resources)}}),!1),window.onbeforeunload=function(){parent.postMessage({pk:Math.random(),gatewayId:a,eventId:"unloading",data:{location:document.location.href}},"*")},t.Heartbeat.startSendingHeartBeatToIframe(o)})()})(); \ No newline at end of file +/*! For license information please see webApplicationInjector.js.LICENSE.txt +Version: 0.0.3 */ +(()=>{var t={874:(t,e,n)=>{var r,a,o;o=function(){var t,e,n=document,r=n.getElementsByTagName("head")[0],a=!1,o="push",i="readyState",s="onreadystatechange",c={},l={},d={},u={};function p(t,e){for(var n=0,r=t.length;n{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Heartbeat=void 0;class n{static startSendingHeartBeatToIframe(t){const e=n.getHeartBeatInterval(t);setInterval((()=>{parent.postMessage({pk:Math.random(),gatewayId:"heartBeatGateway",eventId:"heartBeat",data:{location:document.location.href}},"*")}),e)}static getHeartBeatInterval(t){return parseInt(t.getAttribute("data-smartedit-heart-beat-interval")||n.DEFAULT_HEARTBEAT_INTERVAL,10)}}e.Heartbeat=n,n.DEFAULT_HEARTBEAT_INTERVAL="500"},986:(t,e,n)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});const r=n(874);class a{static getWebappScriptElementFromDocument(t){if(t.currentScript){if(!(t.currentScript instanceof HTMLScriptElement))throw new Error("getWebappScriptElementFromDocument() found non html script element");return t.currentScript}const e=t.querySelector(`script#${a.webappScriptId}`);if(e)return e;const n=t.querySelectorAll(`script[src*=${a.webappScriptName}]`);if(1!==n.length)throw new Error(`SmartEdit unable to load - invalid ${a.webappScriptName} script tag`);return n.item(0)}static extractQueryParameter(t,e){const n={};return t.replace(/([?&])([^&=]+)=([^&]*)?/g,((t,e,r,a)=>(n[r]=a,""))),n[e]}static injectJS(t,e=0){t.length&&e{"use strict";Object.defineProperty(e,"__esModule",{value:!0});const r=n(986);class a{static convertWhitelistingToRegexp(t){return(t=t||[]).map((t=>{const e=t.trim();if(a.whitelistingConfigRegex.test(e)){const t=["^","$"].join(e.replace(/\./g,"\\.").replace(/\*/g,"[-a-zA-Z0-9]*"));return new RegExp(t)}throw new Error(a.whitelistingErrorMsg)}))}static getWhitelistFromScriptElement(t,e){let n=[a.getSanitizedHostFromLocation(e.location)];const o=t.getAttribute(a.allowOriginAttributeName)||"";o&&(n=n.concat(o.split(",")));let i="";const s=e.document.createElement("a");s.href=t.src;const c=r.default.extractQueryParameter(s.search,a.allowOriginQueryParamName);return c&&(i=decodeURI(c),i&&i.split(",").forEach((t=>n.push(t)))),n}static isAllowed(t,e,n){if(!/^(https?:)\/\/([-.a-zA-Z0-9]+(:[0-9]{1,5})?)$/.test(t))return!1;const r=e.document.createElement("a");return r.href=t,("https:"!==e.location.protocol||"https:"===r.protocol)&&n.some((t=>(t.lastIndex=0,t.test(a.getSanitizedHostFromLocation(r)))))}static getSanitizedHostFromLocation(t){const e=t.port||("https"===t.protocol.replace(/:/g,"")?"443":"80");return`${t.hostname}:${e}`}}e.default=a,a.whitelistingConfigRegex=new RegExp(/^(([-*a-zA-Z0-9]+[.])*([-a-zA-Z0-9]+[.]))?[-a-zA-Z0-9]+(:[0-9]{1,5})$/),a.allowOriginAttributeName="data-smartedit-allow-origin",a.allowOriginQueryParamName="allow-origin",a.whitelistingErrorMsg="\n\t\tAllowed whitelist characters are a-z, A-Z, 0-9, -, period, or *\n\t\tThe wildcard * can be used to represent a prefixed domain, Good example: *.domain.com:80\n\t\tbut not a suffix or port, Bad examples: subdomain.*.com subdomain.domain.com:*.\n\t\tEvery whitelisting must contain a specific port.\n\t"}},e={};function n(r){var a=e[r];if(void 0!==a)return a.exports;var o=e[r]={exports:{}};return t[r](o,o.exports,n),o.exports}(()=>{"use strict";const t=n(977),e=n(986),r=n(810),a="smartEditBootstrap",o=e.default.getWebappScriptElementFromDocument(document);if(!o)throw new Error("Unable to location webappInjector script");const i=r.default.getWhitelistFromScriptElement(o,window),s=r.default.convertWhitelistingToRegexp(i);function c(t){parent.postMessage({gatewayId:a,eventId:"promiseAcknowledgement",data:{pk:t}},"*")}function l(t){parent.postMessage({gatewayId:a,eventId:"promiseReturn",data:{pk:t,type:"success"}},"*")}parent.postMessage({pk:Math.random(),gatewayId:a,eventId:"loading",data:{location:document.location.href,version:"0.0.3"}},"*"),window.addEventListener("load",(function(){parent.postMessage({pk:Math.random(),gatewayId:a,eventId:"bootstrapSmartEdit",data:{location:document.location.href}},"*")})),window.addEventListener("message",(function(t){if(!r.default.isAllowed(t.origin,window,s))throw new Error(t.origin+" is not allowed to override this storefront.");if(t.data.gatewayId===a&&"bundle"===t.data.eventId)return void function(t,n){if(window.smartedit=window.smartedit||{},c(t),n){const t=document.getElementsByTagName("head")[0];!function(t){if(!t.properties)return;for(const e in t.properties)t.properties.hasOwnProperty(e)&&(window.smartedit[e]=t.properties[e])}(n),function(t){if(!(t.js&&t.js.length>0))return;let n;n="string"==typeof t.js[0]?t.js:t.js.filter((t=>!t.namespaceToCheck||!window[t.namespaceToCheck])).map((t=>t.src));e.default.injectJS(n)}(n),n.css&&n.css.length>0&&e.default.injectCSS(t,n.css),n.themeCss&&n.themeCss.length>0&&e.default.injectThemeCSS(t,n.themeCss)}l(t)}(t.data.pk,t.data.data.resources);t.data.gatewayId===a&&"theme"===t.data.eventId&&(n=t.data.pk,o=t.data.data.resources,c(n),e.default.updateThemeCss(o.themeCss),l(n));var n,o}),!1),window.onbeforeunload=function(){parent.postMessage({pk:Math.random(),gatewayId:a,eventId:"unloading",data:{location:document.location.href}},"*")},t.Heartbeat.startSendingHeartBeatToIframe(o)})()})(); From 0402fcd97059d9f6c8481a5527e9c96eb3428a4f Mon Sep 17 00:00:00 2001 From: kpawelczak <42094017+kpawelczak@users.noreply.github.com> Date: Mon, 4 Sep 2023 12:37:38 +0200 Subject: [PATCH 05/19] fix: entity id type (#17800) --- .../entity-loader/entity-loader.action.ts | 22 ++++++++----------- .../src/state/utils/entity/entity.action.ts | 16 +++++--------- 2 files changed, 15 insertions(+), 23 deletions(-) diff --git a/projects/core/src/state/utils/entity-loader/entity-loader.action.ts b/projects/core/src/state/utils/entity-loader/entity-loader.action.ts index bf9347e25c1..4e222f5f7c9 100644 --- a/projects/core/src/state/utils/entity-loader/entity-loader.action.ts +++ b/projects/core/src/state/utils/entity-loader/entity-loader.action.ts @@ -5,7 +5,7 @@ */ import { Action } from '@ngrx/store'; -import { entityMeta, EntityMeta } from '../entity/entity.action'; +import { EntityId, entityMeta, EntityMeta } from '../entity/entity.action'; import { failMeta, LoaderMeta, @@ -28,7 +28,7 @@ export interface EntityLoaderAction extends Action { export function entityLoadMeta( entityType: string, - id: string | string[] | null + id: EntityId ): EntityLoaderMeta { return { ...loadMeta(entityType), @@ -38,7 +38,7 @@ export function entityLoadMeta( export function entityFailMeta( entityType: string, - id: string | string[] | null, + id: EntityId, error?: any ): EntityLoaderMeta { return { @@ -49,7 +49,7 @@ export function entityFailMeta( export function entitySuccessMeta( entityType: string, - id: string | string[] | null + id: EntityId ): EntityLoaderMeta { return { ...successMeta(entityType), @@ -59,7 +59,7 @@ export function entitySuccessMeta( export function entityResetMeta( entityType: string, - id?: string | string[] | null + id?: EntityId ): EntityLoaderMeta { return { ...resetMeta(entityType), @@ -70,7 +70,7 @@ export function entityResetMeta( export class EntityLoadAction implements EntityLoaderAction { type = ENTITY_LOAD_ACTION; readonly meta: EntityLoaderMeta; - constructor(entityType: string, id: string | string[] | null) { + constructor(entityType: string, id: EntityId) { this.meta = entityLoadMeta(entityType, id); } } @@ -78,7 +78,7 @@ export class EntityLoadAction implements EntityLoaderAction { export class EntityFailAction implements EntityLoaderAction { type = ENTITY_FAIL_ACTION; readonly meta: EntityLoaderMeta; - constructor(entityType: string, id: string | string[] | null, error?: any) { + constructor(entityType: string, id: EntityId, error?: any) { this.meta = entityFailMeta(entityType, id, error); } } @@ -86,11 +86,7 @@ export class EntityFailAction implements EntityLoaderAction { export class EntitySuccessAction implements EntityLoaderAction { type = ENTITY_SUCCESS_ACTION; readonly meta: EntityLoaderMeta; - constructor( - entityType: string, - id: string | string[] | null, - public payload?: any - ) { + constructor(entityType: string, id: EntityId, public payload?: any) { this.meta = entitySuccessMeta(entityType, id); } } @@ -98,7 +94,7 @@ export class EntitySuccessAction implements EntityLoaderAction { export class EntityLoaderResetAction implements EntityLoaderAction { type = ENTITY_RESET_ACTION; readonly meta: EntityLoaderMeta; - constructor(entityType: string, id: string | string[] | null) { + constructor(entityType: string, id: EntityId) { this.meta = entityResetMeta(entityType, id); } } diff --git a/projects/core/src/state/utils/entity/entity.action.ts b/projects/core/src/state/utils/entity/entity.action.ts index 066576c55bb..0ef2e395d43 100644 --- a/projects/core/src/state/utils/entity/entity.action.ts +++ b/projects/core/src/state/utils/entity/entity.action.ts @@ -9,26 +9,22 @@ import { Action } from '@ngrx/store'; export const ENTITY_REMOVE_ACTION = '[ENTITY] REMOVE'; export const ENTITY_REMOVE_ALL_ACTION = '[ENTITY] REMOVE ALL'; +export type EntityId = string | string[] | null; + export interface EntityMeta { entityType: string; - entityId?: string | string[] | null; + entityId?: EntityId; entityRemove?: boolean; } -export function entityMeta( - type: string, - id?: string | string[] | null -): EntityMeta { +export function entityMeta(type: string, id?: EntityId): EntityMeta { return { entityType: type, entityId: id, }; } -export function entityRemoveMeta( - type: string, - id: string | string[] | null -): EntityMeta { +export function entityRemoveMeta(type: string, id: EntityId): EntityMeta { return { entityId: id, entityType: type, @@ -52,7 +48,7 @@ export interface EntityAction extends Action { export class EntityRemoveAction implements EntityAction { type = ENTITY_REMOVE_ACTION; readonly meta: EntityMeta; - constructor(entityType: string, id: string | string[] | null) { + constructor(entityType: string, id: EntityId) { this.meta = entityRemoveMeta(entityType, id); } } From 4ca9969cc841c089797a5b882fb16c1bbaadb1d3 Mon Sep 17 00:00:00 2001 From: kpawelczak <42094017+kpawelczak@users.noreply.github.com> Date: Tue, 5 Sep 2023 15:54:26 +0200 Subject: [PATCH 06/19] fix: PostProduct review error is now normalized (#17810) --- .../assets/src/translations/en/product.ts | 2 + .../actions/product-references.action.ts | 2 +- .../store/actions/product-reviews.action.ts | 6 +-- .../effects/product-references.effect.ts | 14 ++++--- .../effects/product-reviews.effect.spec.ts | 38 ++++++++++--------- .../store/effects/product-reviews.effect.ts | 36 ++++++++++++++---- 6 files changed, 63 insertions(+), 35 deletions(-) diff --git a/projects/assets/src/translations/en/product.ts b/projects/assets/src/translations/en/product.ts index a22582bfd6d..3e324c5b76a 100644 --- a/projects/assets/src/translations/en/product.ts +++ b/projects/assets/src/translations/en/product.ts @@ -80,6 +80,8 @@ export const product = { less: 'Show Less Reviews', thankYouForReview: 'Thank you for the review! Note that reviews may require review before appearing here.', + postReviewFail: + 'Something went wrong while posting your review. Please try again later.', }, productCarousel: { carouselLabel: 'Carousel, {{title}}', diff --git a/projects/core/src/product/store/actions/product-references.action.ts b/projects/core/src/product/store/actions/product-references.action.ts index a823d671b1f..78feecbdfca 100644 --- a/projects/core/src/product/store/actions/product-references.action.ts +++ b/projects/core/src/product/store/actions/product-references.action.ts @@ -28,7 +28,7 @@ export class LoadProductReferences implements Action { export class LoadProductReferencesFail implements Action { readonly type = LOAD_PRODUCT_REFERENCES_FAIL; - constructor(public payload: ErrorModel) {} + constructor(public payload?: ErrorModel) {} } export class LoadProductReferencesSuccess implements Action { diff --git a/projects/core/src/product/store/actions/product-reviews.action.ts b/projects/core/src/product/store/actions/product-reviews.action.ts index a40d3851578..a2cd3e0234b 100644 --- a/projects/core/src/product/store/actions/product-reviews.action.ts +++ b/projects/core/src/product/store/actions/product-reviews.action.ts @@ -5,7 +5,7 @@ */ import { Action } from '@ngrx/store'; -import { ErrorModel } from '../../../model/misc.model'; +import { ErrorModel, HttpErrorModel } from '../../../model/misc.model'; import { Review } from '../../../model/product.model'; export const LOAD_PRODUCT_REVIEWS = '[Product] Load Product Reviews Data'; @@ -25,7 +25,7 @@ export class LoadProductReviews implements Action { export class LoadProductReviewsFail implements Action { readonly type = LOAD_PRODUCT_REVIEWS_FAIL; - constructor(public payload: ErrorModel) {} + constructor(public payload?: ErrorModel) {} } export class LoadProductReviewsSuccess implements Action { @@ -40,7 +40,7 @@ export class PostProductReview implements Action { export class PostProductReviewFail implements Action { readonly type = POST_PRODUCT_REVIEW_FAIL; - constructor(public payload: string) {} + constructor(public payload?: HttpErrorModel) {} } export class PostProductReviewSuccess implements Action { diff --git a/projects/core/src/product/store/effects/product-references.effect.ts b/projects/core/src/product/store/effects/product-references.effect.ts index 630a755d639..01f026fa708 100644 --- a/projects/core/src/product/store/effects/product-references.effect.ts +++ b/projects/core/src/product/store/effects/product-references.effect.ts @@ -4,16 +4,18 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Injectable } from '@angular/core'; +import { inject, Injectable } from '@angular/core'; import { Actions, createEffect, ofType } from '@ngrx/effects'; import { Observable, of } from 'rxjs'; import { catchError, map, mergeMap } from 'rxjs/operators'; -import { ErrorModel } from '../../../model/misc.model'; import { ProductReferencesConnector } from '../../connectors/references/product-references.connector'; import { ProductActions } from '../actions/index'; +import { normalizeHttpError } from '../../../util/normalize-http-error'; +import { LoggerService } from '../../../logger'; @Injectable() export class ProductReferencesEffects { + protected logger = inject(LoggerService); loadProductReferences$: Observable< | ProductActions.LoadProductReferencesSuccess | ProductActions.LoadProductReferencesFail @@ -31,11 +33,11 @@ export class ProductReferencesEffects { list: data, }); }), - catchError((_error) => + catchError((error) => of( - new ProductActions.LoadProductReferencesFail({ - message: payload.productCode, - } as ErrorModel) + new ProductActions.LoadProductReferencesFail( + normalizeHttpError(error, this.logger) + ) ) ) ); diff --git a/projects/core/src/product/store/effects/product-reviews.effect.spec.ts b/projects/core/src/product/store/effects/product-reviews.effect.spec.ts index b2f0cc81c6c..ec8ac6a5bd9 100644 --- a/projects/core/src/product/store/effects/product-reviews.effect.spec.ts +++ b/projects/core/src/product/store/effects/product-reviews.effect.spec.ts @@ -9,12 +9,12 @@ import { import { cold, hot } from 'jasmine-marbles'; import { Observable, of } from 'rxjs'; import { Review } from '../../../model/product.model'; -import { defaultOccProductConfig } from '../../../occ/adapters/product/default-occ-product-config'; -import { OccConfig } from '../../../occ/config/occ-config'; import { ProductActions } from '../actions/index'; import * as fromEffects from '../effects/product-reviews.effect'; -import { ProductReviewsConnector } from '../../connectors/index'; +import { defaultOccProductConfig } from '../../../occ/adapters/product/default-occ-product-config'; import createSpy = jasmine.createSpy; +import { OccConfig } from '../../../occ/config/occ-config'; +import { ProductReviewsConnector } from '../../connectors/reviews/product-reviews.connector'; const reviewData: Review[] = [ { @@ -27,21 +27,13 @@ const reviewData: Review[] = [ }, ]; -const MockOccModuleConfig: OccConfig = { - backend: { - occ: { - baseUrl: '', - prefix: '', - }, - }, -}; +class GlobalMessageServiceMock { + add(_message: GlobalMessage): void {} +} class MockProductReviewsConnector { get = createSpy('getList').and.returnValue(of(reviewData)); -} - -class GlobalMessageServiceMock { - add(_message: GlobalMessage): void {} + add = createSpy('addReview').and.returnValue(of({})); } describe('Product reviews effect', () => { @@ -56,7 +48,6 @@ describe('Product reviews effect', () => { provide: ProductReviewsConnector, useClass: MockProductReviewsConnector, }, - { provide: OccConfig, useValue: MockOccModuleConfig }, { provide: OccConfig, useValue: defaultOccProductConfig }, fromEffects.ProductReviewsEffects, provideMockActions(() => actions$), @@ -68,7 +59,7 @@ describe('Product reviews effect', () => { }); describe('loadProductReviews$', () => { - it('should return specified product reviews', () => { + it('should return specified product reviews on success', () => { const productCode = '12345'; const action = new ProductActions.LoadProductReviews(productCode); const completion = new ProductActions.LoadProductReviewsSuccess({ @@ -82,4 +73,17 @@ describe('Product reviews effect', () => { expect(effects.loadProductReviews$).toBeObservable(expected); }); }); + + describe('postProductReview', () => { + it('should post a product review and return success action on success', () => { + const reviewPayload = { productCode: '12345', review: {} }; + const action = new ProductActions.PostProductReview(reviewPayload); + const completion = new ProductActions.PostProductReviewSuccess({}); + + actions$ = hot('-a', { a: action }); + const expected = cold('-b', { b: completion }); + + expect(effects.postProductReview).toBeObservable(expected); + }); + }); }); diff --git a/projects/core/src/product/store/effects/product-reviews.effect.ts b/projects/core/src/product/store/effects/product-reviews.effect.ts index c9aad4da941..81b1cfdd3bf 100644 --- a/projects/core/src/product/store/effects/product-reviews.effect.ts +++ b/projects/core/src/product/store/effects/product-reviews.effect.ts @@ -4,20 +4,22 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Injectable } from '@angular/core'; +import { inject, Injectable } from '@angular/core'; import { Actions, createEffect, ofType } from '@ngrx/effects'; import { Observable, of } from 'rxjs'; import { catchError, map, mergeMap, tap } from 'rxjs/operators'; -import { ErrorModel } from '../../../model/misc.model'; import { ProductReviewsConnector } from '../../connectors/reviews/product-reviews.connector'; import { ProductActions } from '../actions/index'; import { GlobalMessageService, GlobalMessageType, } from '../../../global-message/index'; +import { normalizeHttpError } from '../../../util/normalize-http-error'; +import { LoggerService } from '../../../logger'; @Injectable() export class ProductReviewsEffects { + protected logger = inject(LoggerService); loadProductReviews$: Observable< | ProductActions.LoadProductReviewsSuccess | ProductActions.LoadProductReviewsFail @@ -33,11 +35,11 @@ export class ProductReviewsEffects { list: data, }); }), - catchError((_error) => + catchError((error) => of( - new ProductActions.LoadProductReviewsFail({ - message: productCode, - } as ErrorModel) + new ProductActions.LoadProductReviewsFail( + normalizeHttpError(error, this.logger) + ) ) ) ); @@ -61,8 +63,12 @@ export class ProductReviewsEffects { reviewResponse ); }), - catchError((_error) => - of(new ProductActions.PostProductReviewFail(payload.productCode)) + catchError((error) => + of( + new ProductActions.PostProductReviewFail( + normalizeHttpError(error, this.logger) + ) + ) ) ); }) @@ -83,6 +89,20 @@ export class ProductReviewsEffects { { dispatch: false } ); + showGlobalMessageOnPostProductReviewFail$ = createEffect( + () => + this.actions$.pipe( + ofType(ProductActions.POST_PRODUCT_REVIEW_FAIL), + tap(() => { + this.globalMessageService.add( + { key: 'productReview.postReviewFail' }, + GlobalMessageType.MSG_TYPE_ERROR + ); + }) + ), + { dispatch: false } + ); + constructor( private actions$: Actions, private productReviewsConnector: ProductReviewsConnector, From 880ab6323d6429fd8069b23093667376346e3e18 Mon Sep 17 00:00:00 2001 From: kpawelczak <42094017+kpawelczak@users.noreply.github.com> Date: Wed, 6 Sep 2023 16:11:29 +0200 Subject: [PATCH 07/19] feat: Default rendering strategy resolver (#17801) --- core-libs/setup/ssr/optimized-engine/index.ts | 2 + .../optimized-ssr-engine.spec.ts | 37 ++++++----- .../rendering-strategy-resolver-options.ts | 16 +++++ .../rendering-strategy-resolver.spec.ts | 62 ++++++++++++++++++ .../rendering-strategy-resolver.ts | 64 +++++++++++++++++++ .../ssr-optimization-options.ts | 10 ++- 6 files changed, 175 insertions(+), 16 deletions(-) create mode 100644 core-libs/setup/ssr/optimized-engine/rendering-strategy-resolver-options.ts create mode 100644 core-libs/setup/ssr/optimized-engine/rendering-strategy-resolver.spec.ts create mode 100644 core-libs/setup/ssr/optimized-engine/rendering-strategy-resolver.ts diff --git a/core-libs/setup/ssr/optimized-engine/index.ts b/core-libs/setup/ssr/optimized-engine/index.ts index e3d0af3c739..b162debc6c5 100644 --- a/core-libs/setup/ssr/optimized-engine/index.ts +++ b/core-libs/setup/ssr/optimized-engine/index.ts @@ -7,3 +7,5 @@ export * from './optimized-ssr-engine'; export * from './rendering-cache'; export * from './ssr-optimization-options'; +export * from './rendering-strategy-resolver'; +export * from './rendering-strategy-resolver-options'; diff --git a/core-libs/setup/ssr/optimized-engine/optimized-ssr-engine.spec.ts b/core-libs/setup/ssr/optimized-engine/optimized-ssr-engine.spec.ts index ac97df28ba5..02b175d50df 100644 --- a/core-libs/setup/ssr/optimized-engine/optimized-ssr-engine.spec.ts +++ b/core-libs/setup/ssr/optimized-engine/optimized-ssr-engine.spec.ts @@ -1194,6 +1194,7 @@ describe('OptimizedSsrEngine', () => { "maxRenderTime": 300000, "reuseCurrentRendering": true, "debug": false, + "renderingStrategyResolver": "(request) => {\\n return shouldFallbackToCsr(request, options)\\n ? ssr_optimization_options_1.RenderingStrategy.ALWAYS_CSR\\n : ssr_optimization_options_1.RenderingStrategy.DEFAULT;\\n}", "logger": true } } @@ -1206,20 +1207,25 @@ describe('OptimizedSsrEngine', () => { logger: new MockExpressServerLogger() as ExpressServerLogger, }); expect(consoleLogSpy.mock.lastCall).toMatchInlineSnapshot(` - [ - "[spartacus] SSR optimization engine initialized", - { - "options": { - "concurrency": 10, - "debug": false, - "forcedSsrTimeout": 60000, - "logger": "MockExpressServerLogger", - "maxRenderTime": 300000, - "reuseCurrentRendering": true, - "timeout": 3000, - }, - }, - ] + [ + "[spartacus] SSR optimization engine initialized", + { + "options": { + "concurrency": 10, + "debug": false, + "forcedSsrTimeout": 60000, + "logger": "MockExpressServerLogger", + "maxRenderTime": 300000, + "renderingStrategyResolver": "(request) => { + return shouldFallbackToCsr(request, options) + ? ssr_optimization_options_1.RenderingStrategy.ALWAYS_CSR + : ssr_optimization_options_1.RenderingStrategy.DEFAULT; + }", + "reuseCurrentRendering": true, + "timeout": 3000, + }, + }, + ] `); }); it('should use the legacy server logger, if logger option not specified', () => { @@ -1232,7 +1238,8 @@ describe('OptimizedSsrEngine', () => { "forcedSsrTimeout": 60000, "maxRenderTime": 300000, "reuseCurrentRendering": true, - "debug": false + "debug": false, + "renderingStrategyResolver": "(request) => {\\n return shouldFallbackToCsr(request, options)\\n ? ssr_optimization_options_1.RenderingStrategy.ALWAYS_CSR\\n : ssr_optimization_options_1.RenderingStrategy.DEFAULT;\\n}" }", ] `); diff --git a/core-libs/setup/ssr/optimized-engine/rendering-strategy-resolver-options.ts b/core-libs/setup/ssr/optimized-engine/rendering-strategy-resolver-options.ts new file mode 100644 index 00000000000..90035dd14c8 --- /dev/null +++ b/core-libs/setup/ssr/optimized-engine/rendering-strategy-resolver-options.ts @@ -0,0 +1,16 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export interface RenderingStrategyResolverOptions { + excludedUrls?: string[]; + excludedParams?: string[]; +} + +export const defaultRenderingStrategyResolverOptions: RenderingStrategyResolverOptions = + { + excludedUrls: ['checkout', 'my-account'], + excludedParams: ['asm'], + }; diff --git a/core-libs/setup/ssr/optimized-engine/rendering-strategy-resolver.spec.ts b/core-libs/setup/ssr/optimized-engine/rendering-strategy-resolver.spec.ts new file mode 100644 index 00000000000..fa5b6a11977 --- /dev/null +++ b/core-libs/setup/ssr/optimized-engine/rendering-strategy-resolver.spec.ts @@ -0,0 +1,62 @@ +/// + +import { RenderingStrategy } from './ssr-optimization-options'; +import { Request } from 'express'; + +import { defaultRenderingStrategyResolver } from './rendering-strategy-resolver'; + +describe('RenderingStrategyResolver', () => { + let resolver: (req: Request) => RenderingStrategy = + defaultRenderingStrategyResolver({ + excludedUrls: ['checkout', 'my-account'], + excludedParams: ['asm'], + }); + + it('should return DEFAULT rendering strategy if no excluded parameters or URLs match', () => { + const request: Partial = { + query: {}, + url: '/some-page', + }; + + const strategy = resolver(request as Request); + + expect(strategy).toBe(RenderingStrategy.DEFAULT); + }); + + it('should return ALWAYS_CSR rendering strategy if an excluded parameter matches', () => { + const request: Partial = { + query: { + asm: 'true', + }, + url: '/some-page', + }; + + const strategy = resolver(request as Request); + + expect(strategy).toBe(RenderingStrategy.ALWAYS_CSR); + }); + + it('should return ALWAYS_CSR rendering strategy if the URL matches an excluded URL', () => { + const request: Partial = { + query: {}, + url: '/checkout/confirm', + }; + + const strategy = resolver(request as Request); + + expect(strategy).toBe(RenderingStrategy.ALWAYS_CSR); + }); + + it('should return ALWAYS_CSR rendering strategy if both excluded parameters and URLs match', () => { + const request: Partial = { + query: { + asm: 'true', + }, + url: '/checkout/confirm', + }; + + const strategy = resolver(request as Request); + + expect(strategy).toBe(RenderingStrategy.ALWAYS_CSR); + }); +}); diff --git a/core-libs/setup/ssr/optimized-engine/rendering-strategy-resolver.ts b/core-libs/setup/ssr/optimized-engine/rendering-strategy-resolver.ts new file mode 100644 index 00000000000..4253b92a17a --- /dev/null +++ b/core-libs/setup/ssr/optimized-engine/rendering-strategy-resolver.ts @@ -0,0 +1,64 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Request } from 'express'; +import { RenderingStrategy } from './ssr-optimization-options'; +import { RenderingStrategyResolverOptions } from './rendering-strategy-resolver-options'; + +const hasExcludedParams = ( + request: Request, + excludedParams: string[] | undefined +): boolean => { + const params: string[] = request.query + ? Object.getOwnPropertyNames(request.query) + : []; + + if (!excludedParams) { + return false; + } + + return excludedParams.some((excludedParam: string) => + params.some((param: string): boolean => excludedParam === param) + ); +}; + +const hasExcludedUrl = ( + request: Request, + excludedUrls: string[] | undefined +) => { + return request.url && excludedUrls + ? excludedUrls.some((url) => request.url.search(url) > -1) + : false; +}; + +const shouldFallbackToCsr = ( + request: Request, + { excludedParams, excludedUrls }: RenderingStrategyResolverOptions +) => { + return ( + hasExcludedParams(request, excludedParams) || + hasExcludedUrl(request, excludedUrls) + ); +}; + +/** + * Creates a rendering strategy resolver function with the specified options. + * + * @function + * @param options - The options to configure the rendering strategy resolver. + * @param [options.excludedUrls] - An optional array of URLs for which server-side rendering (SSR) should be disabled. + * @param [options.excludedParams] - An optional array of Query parameters for which SSR should be disabled. + * @returns A rendering strategy resolver function that takes a Request object + * as a parameter and returns the rendering strategy to be applied for the request, which can be either + * `RenderingStrategy.ALWAYS_CSR` or `RenderingStrategy.DEFAULT`. + */ +export const defaultRenderingStrategyResolver = + (options: RenderingStrategyResolverOptions) => + (request: Request): RenderingStrategy => { + return shouldFallbackToCsr(request, options) + ? RenderingStrategy.ALWAYS_CSR + : RenderingStrategy.DEFAULT; + }; diff --git a/core-libs/setup/ssr/optimized-engine/ssr-optimization-options.ts b/core-libs/setup/ssr/optimized-engine/ssr-optimization-options.ts index c63159bab8e..4dbdcc5b620 100644 --- a/core-libs/setup/ssr/optimized-engine/ssr-optimization-options.ts +++ b/core-libs/setup/ssr/optimized-engine/ssr-optimization-options.ts @@ -6,6 +6,8 @@ import { Request } from 'express'; import { ExpressServerLogger } from '../logger'; +import { defaultRenderingStrategyResolver } from './rendering-strategy-resolver'; +import { defaultRenderingStrategyResolverOptions } from './rendering-strategy-resolver-options'; export interface SsrOptimizationOptions { /** @@ -54,7 +56,10 @@ export interface SsrOptimizationOptions { renderKeyResolver?: (req: Request) => string; /** - * Allows defining custom rendering strategy per request + * This function allows for the definition of a custom rendering strategy on a per-request basis. + * By default, we provide a defaultRenderingStrategyResolver, + * which has a default parameter defaultRenderingStrategyResolverOptions. + * This default option disables server-side rendering (SSR) on pages such as 'checkout' and 'my-account'. * * @param req */ @@ -139,6 +144,9 @@ export const defaultSsrOptimizationOptions: SsrOptimizationOptions = { maxRenderTime: 300_000, reuseCurrentRendering: true, debug: false, + renderingStrategyResolver: defaultRenderingStrategyResolver( + defaultRenderingStrategyResolverOptions + ), //CXSPA-3680 - set ExpressServerLogger as default //logger: new ExpressServerLogger(), }; From 5d9976a78872a5ac6808fcf1ea9b79993b3c7748 Mon Sep 17 00:00:00 2001 From: Sherwin Varghese Date: Tue, 12 Sep 2023 11:02:08 +0530 Subject: [PATCH 08/19] CXINT-2325: Allow Register Org with empty phone number (#17822) --- .../root/config/default-cdc-routing-config.ts | 9 +- .../cdc/root/service/cdc-js.service.spec.ts | 136 ++++++++++++++++++ .../cdc/root/service/cdc-js.service.ts | 31 ++-- .../cdc/b2b/b2b-register-org.core-e2e.cy.ts | 41 ++++-- .../helpers/b2b/b2b-user-registration.ts | 4 +- 5 files changed, 199 insertions(+), 22 deletions(-) diff --git a/integration-libs/cdc/root/config/default-cdc-routing-config.ts b/integration-libs/cdc/root/config/default-cdc-routing-config.ts index dbce5a577ae..0dc857d4663 100644 --- a/integration-libs/cdc/root/config/default-cdc-routing-config.ts +++ b/integration-libs/cdc/root/config/default-cdc-routing-config.ts @@ -9,12 +9,17 @@ import { RoutesConfig, RoutingConfig } from '@spartacus/core'; export const cdcRoutesConfig: RoutesConfig = { cdcLogin: { paths: ['/cdc/login'], - protected: true, + protected: false, authFlow: true, }, cdcCheckoutLogin: { paths: ['/cdc/checkout-login'], - protected: true, + protected: false, + authFlow: true, + }, + cdcOrgRegistration: { + paths: ['/cdc/register-org'], + protected: false, authFlow: true, }, }; diff --git a/integration-libs/cdc/root/service/cdc-js.service.spec.ts b/integration-libs/cdc/root/service/cdc-js.service.spec.ts index fe6ce38d4b2..b14609491e9 100644 --- a/integration-libs/cdc/root/service/cdc-js.service.spec.ts +++ b/integration-libs/cdc/root/service/cdc-js.service.spec.ts @@ -10,6 +10,7 @@ import { User, WindowRef, } from '@spartacus/core'; +import { OrganizationUserRegistrationForm } from '@spartacus/organization/user-registration/root'; import { UserProfileFacade } from '@spartacus/user/profile/root'; import { EMPTY, Observable, of, Subscription } from 'rxjs'; import { take } from 'rxjs/operators'; @@ -97,6 +98,7 @@ class MockSubscription { const b2b = { getOrganizationContext: () => {}, openDelegatedAdminLogin: () => {}, + registerOrganization: () => {}, }; const gigya = { @@ -1208,4 +1210,138 @@ describe('CdcJsService', () => { expect(service.getSiteConsentDetails).toBeTruthy(); }); }); + + describe('registerOrganisationWithoutScreenSet', () => { + it('should not call accounts.b2b.registerOrganization', (done) => { + spyOn( + service['gigyaSDK'].accounts.b2b, + 'registerOrganization' + ).and.callFake((options: { callback: Function }) => { + options.callback({ status: 'OK' }); + }); + expect(service.registerOrganisationWithoutScreenSet).toBeTruthy(); + const wrongOrgInfo: OrganizationUserRegistrationForm = { + companyName: '', + email: '', + firstName: '', + lastName: '', + }; + service.registerOrganisationWithoutScreenSet(wrongOrgInfo).subscribe({ + error: (error) => { + expect(error).toEqual('Organization details not provided'); + done(); + }, + }); + expect( + service['gigyaSDK'].accounts.b2b.registerOrganization + ).not.toHaveBeenCalled(); + }); + + it('should call accounts.b2b.registerOrganization', (done) => { + spyOn( + service['gigyaSDK'].accounts.b2b, + 'registerOrganization' + ).and.callFake((options: { callback: Function }) => { + options.callback({ status: 'OK' }); + }); + + expect(service.registerOrganisationWithoutScreenSet).toBeTruthy(); + const correctOrgInfo: OrganizationUserRegistrationForm = { + companyName: 'ABC', + email: 'abc@mail.com', + firstName: 'A', + lastName: 'User', + addressLine1: 'Line 1', + addressLine2: 'Line 2', + postalCode: '12312', + town: 'town', + region: 'region', + country: 'India', + phoneNumber: '+911234567890', + message: 'department: Dept;\nposition: Pos', + }; + + service + .registerOrganisationWithoutScreenSet(correctOrgInfo) + .subscribe(() => { + expect( + service['gigyaSDK'].accounts.b2b.registerOrganization + ).toHaveBeenCalledWith({ + organization: { + name: correctOrgInfo.companyName, + street_address: + correctOrgInfo.addressLine1 + ' ' + correctOrgInfo.addressLine2, + city: correctOrgInfo.town, + state: correctOrgInfo.region, + zip_code: correctOrgInfo.postalCode, + country: correctOrgInfo.country, + }, + requester: { + firstName: correctOrgInfo.firstName, + lastName: correctOrgInfo.lastName, + email: correctOrgInfo.email, + phone: correctOrgInfo.phoneNumber, + department: 'Dept', + jobFunction: 'Pos', + }, + regSource: 'https://spartacus.cx', + callback: jasmine.any(Function), + }); + done(); + }); + }); + + it('should call accounts.b2b.registerOrganization and not pass phone number if empty', (done) => { + spyOn( + service['gigyaSDK'].accounts.b2b, + 'registerOrganization' + ).and.callFake((options: { callback: Function }) => { + options.callback({ status: 'OK' }); + }); + + expect(service.registerOrganisationWithoutScreenSet).toBeTruthy(); + const correctOrgInfo: OrganizationUserRegistrationForm = { + companyName: 'ABC', + email: 'abc@mail.com', + firstName: 'A', + lastName: 'User', + addressLine1: 'Line 1', + addressLine2: 'Line 2', + postalCode: '12312', + town: 'town', + region: 'region', + country: 'India', + phoneNumber: '', + message: 'department: Dept;\nposition: Pos', + }; + + service + .registerOrganisationWithoutScreenSet(correctOrgInfo) + .subscribe(() => { + expect( + service['gigyaSDK'].accounts.b2b.registerOrganization + ).toHaveBeenCalledWith({ + organization: { + name: correctOrgInfo.companyName, + street_address: + correctOrgInfo.addressLine1 + ' ' + correctOrgInfo.addressLine2, + city: correctOrgInfo.town, + state: correctOrgInfo.region, + zip_code: correctOrgInfo.postalCode, + country: correctOrgInfo.country, + }, + requester: { + firstName: correctOrgInfo.firstName, + lastName: correctOrgInfo.lastName, + email: correctOrgInfo.email, + department: 'Dept', + jobFunction: 'Pos', + }, + regSource: 'https://spartacus.cx', + callback: jasmine.any(Function), + }); + done(); + }); + }); + }); }); diff --git a/integration-libs/cdc/root/service/cdc-js.service.ts b/integration-libs/cdc/root/service/cdc-js.service.ts index a86e511b464..abfb2de8e7e 100644 --- a/integration-libs/cdc/root/service/cdc-js.service.ts +++ b/integration-libs/cdc/root/service/cdc-js.service.ts @@ -305,21 +305,14 @@ export class CdcJsService implements OnDestroy { !orgInfo?.firstName || !orgInfo?.lastName ) { - return throwError(null); + return throwError('Organization details not provided'); } else { const regSource: string = this.winRef.nativeWindow?.location?.href || ''; const message = orgInfo.message; let department = null; let position = null; if (message) { - const msgList = message.replace('\n', '').split(';'); - for (const msg of msgList) { - if (msg.trim().toLowerCase().search('department') === 0) { - department = msg.split(':')[1].trim(); - } else if (msg.trim().toLowerCase().search('position') === 0) { - position = msg.split(':')[1].trim(); - } - } + ({ department, position } = this.parseMessage(message)); } return this.invokeAPI('accounts.b2b.registerOrganization', { @@ -335,7 +328,8 @@ export class CdcJsService implements OnDestroy { firstName: orgInfo.firstName, lastName: orgInfo.lastName, email: orgInfo.email, - phone: orgInfo.phoneNumber, + ...(orgInfo.phoneNumber && + orgInfo.phoneNumber.length > 0 && { phone: orgInfo.phoneNumber }), department: department, jobFunction: position, }, @@ -422,6 +416,23 @@ export class CdcJsService implements OnDestroy { return of(defaultSessionTimeOut); } + private parseMessage(message: string): { + department: string; + position: string; + } { + const msgList = message.replace('\n', '').split(';'); + let department = ''; + let position = ''; + for (const msg of msgList) { + if (msg.trim().toLowerCase().search('department') === 0) { + department = msg.split(':')[1].trim(); + } else if (msg.trim().toLowerCase().search('position') === 0) { + position = msg.split(':')[1].trim(); + } + } + return { department, position }; + } + private getCurrentBaseSite(): string { let baseSite: string = ''; this.baseSiteService diff --git a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/cdc/b2b/b2b-register-org.core-e2e.cy.ts b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/cdc/b2b/b2b-register-org.core-e2e.cy.ts index 216ba80a3d4..73362483372 100644 --- a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/cdc/b2b/b2b-register-org.core-e2e.cy.ts +++ b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/cdc/b2b/b2b-register-org.core-e2e.cy.ts @@ -4,22 +4,20 @@ * SPDX-License-Identifier: Apache-2.0 */ -import * as cdc from '../../../../helpers/vendor/cdc/cdc'; -import { - user, - organisation, - getSampleUser, -} from '../../../../sample-data/checkout-flow'; -import { isolateTests } from '../../../../support/utils/test-isolation'; import { fillOrganizationUserRegistrationForm, navigateToOrganizationUserRegisterPage, - submitOrganizationUserRegistrationForm, verifyFormErrors, verifyGlobalMessageAfterRegistration, - verifyRedirectionToLoginPage, verifyTabbingOrder, } from '../../../../helpers/b2b/b2b-user-registration'; +import * as cdc from '../../../../helpers/vendor/cdc/cdc'; +import { + getSampleUser, + organisation, + user, +} from '../../../../sample-data/checkout-flow'; +import { isolateTests } from '../../../../support/utils/test-isolation'; describe('Register B2B Organisation when CDC enabled', () => { describe('Register B2B Organisation with Screenset', () => { @@ -74,6 +72,31 @@ describe('Register B2B Organisation when CDC enabled', () => { // cdc.verifyOrgRegistrationRequestReceived(); }); + describe('Register Organization without phone number (CXINT-2325)', () => { + before(() => { + cy.window().then((win) => win.sessionStorage.clear()); + cy.visit('/'); + }); + + it('should display validation errors if form is empty', () => { + navigateToOrganizationUserRegisterPage(); + let sampleB2BUser = getSampleUser(); + sampleB2BUser.phone = ''; + fillOrganizationUserRegistrationForm( + sampleB2BUser, + 'Please register my account' + ); + + cy.get('cx-user-registration-form').within(() => { + cy.get('button[type=submit]').click(); + }); + + const message = + 'Thank you for registering! A representative will contact you shortly and confirm your access information.'; + verifyGlobalMessageAfterRegistration(message); + }); + }); + describe('Form errors', () => { before(() => { cy.window().then((win) => win.sessionStorage.clear()); diff --git a/projects/storefrontapp-e2e-cypress/cypress/helpers/b2b/b2b-user-registration.ts b/projects/storefrontapp-e2e-cypress/cypress/helpers/b2b/b2b-user-registration.ts index 4f8e9d0c873..fca268aed94 100644 --- a/projects/storefrontapp-e2e-cypress/cypress/helpers/b2b/b2b-user-registration.ts +++ b/projects/storefrontapp-e2e-cypress/cypress/helpers/b2b/b2b-user-registration.ts @@ -54,7 +54,9 @@ export function fillOrganizationUserRegistrationForm( cy.get('#region-select').ngSelect(address?.state); } - cy.get('[formcontrolname="phoneNumber"]').type(phone); + if (phone) { + cy.get('[formcontrolname="phoneNumber"]').type(phone); + } if (message) { cy.get('[formcontrolname="message"]').type(message); From 4246b614510f900f66c52e617c873d7741bac097 Mon Sep 17 00:00:00 2001 From: Sherwin Varghese Date: Thu, 14 Sep 2023 17:30:36 +0530 Subject: [PATCH 09/19] fix: CXINT-2321 and CXINT-2322 Bug fixes (#17832) --- ...elivery-mode-date-picker.component.spec.ts | 71 +++++++++++++++++++ .../delivery-mode-date-picker.component.ts | 15 ++-- .../shared/date-validation.service.spec.ts | 42 +++++++++-- .../shared/date-validation.service.ts | 26 ++++++- .../requested-delivery-date.e2e.cy.ts | 2 +- .../requested-delivery-date.ts | 4 +- 6 files changed, 145 insertions(+), 15 deletions(-) diff --git a/feature-libs/requested-delivery-date/root/components/delivery-mode-date-picker/delivery-mode-date-picker.component.spec.ts b/feature-libs/requested-delivery-date/root/components/delivery-mode-date-picker/delivery-mode-date-picker.component.spec.ts index 2341afccc78..0fdab67fe5c 100644 --- a/feature-libs/requested-delivery-date/root/components/delivery-mode-date-picker/delivery-mode-date-picker.component.spec.ts +++ b/feature-libs/requested-delivery-date/root/components/delivery-mode-date-picker/delivery-mode-date-picker.component.spec.ts @@ -229,6 +229,77 @@ describe('DeliveryModeDatePickerComponent', () => { }); }); + it('should NOT call setRequestedDeliveryDate when a date less than earliestRetrievalAt is provided', () => { + spyOn(component, 'setRequestedDeliveryDate'); + + component['requestedDelDateFacade'].setRequestedDeliveryDate = jasmine + .createSpy('setRequestedDeliveryDate') + .and.returnValue(of({})); + + const requestedRetrievalAt = '2023-05-03'; + const earliestRetrievalAt = '2023-09-15'; + const data = TestBed.inject(OutletContextData); + data.context$ = of({ + item: { + requestedRetrievalAt, + earliestRetrievalAt, + code: '123', + user: { + uid: 'current', + }, + }, + readonly: false, + }); + + component.ngOnInit(); + fixture.detectChanges(); + const newRequestedRetrievalAt = '2023-01-01'; + component['form'].patchValue({ + requestDeliveryDate: newRequestedRetrievalAt, + }); + + //Manually trigger change event for date picker. + const event = new Event('update'); + const datePickerEl: HTMLInputElement = fixture.debugElement.query( + By.css('cx-date-picker') + )?.nativeElement; + datePickerEl.dispatchEvent(event); + + expect(component['setRequestedDeliveryDate']).toHaveBeenCalled(); + expect( + component['requestedDelDateFacade'].setRequestedDeliveryDate + ).not.toHaveBeenCalled(); + }); + + it('should NOT show the date picker when the component outlet value is read only', () => { + spyOn(component, 'setRequestedDeliveryDate'); + const requestedRetrievalAt = '2023-05-03'; + const earliestRetrievalAt = '2023-09-15'; + const data = TestBed.inject(OutletContextData); + data.context$ = of({ + item: { + requestedRetrievalAt, + earliestRetrievalAt, + code: '123', + user: { + uid: 'current', + }, + }, + readonly: true, + }); + + component.ngOnInit(); + fixture.detectChanges(); + const datePickerEl: HTMLInputElement = fixture.debugElement.query( + By.css('cx-date-picker') + )?.nativeElement; + expect(datePickerEl).toBeUndefined(); + const datePickerReadOnlyEl: HTMLInputElement = fixture.debugElement.query( + By.css('cx-card') + )?.nativeElement; + expect(datePickerReadOnlyEl.innerHTML).not.toBeNull(); + }); + it('should show error message when backend OCC API returns UnknownResourceError', (done) => { spyOn(component['globalMessageService'], 'add'); diff --git a/feature-libs/requested-delivery-date/root/components/delivery-mode-date-picker/delivery-mode-date-picker.component.ts b/feature-libs/requested-delivery-date/root/components/delivery-mode-date-picker/delivery-mode-date-picker.component.ts index 5911eedb6fa..853008fd95f 100644 --- a/feature-libs/requested-delivery-date/root/components/delivery-mode-date-picker/delivery-mode-date-picker.component.ts +++ b/feature-libs/requested-delivery-date/root/components/delivery-mode-date-picker/delivery-mode-date-picker.component.ts @@ -67,6 +67,9 @@ export class DeliveryModeDatePickerComponent implements OnInit, OnDestroy { } else { //set the value of requestedRetrievalAt as earliestRetrievalAt and update occ. this.requestedRetrievalAt = this.earliestRetrievalAt; + this.form.patchValue({ + requestDeliveryDate: this.requestedRetrievalAt, + }); this.setRequestedDeliveryDate(); } this.form.patchValue({ @@ -104,15 +107,17 @@ export class DeliveryModeDatePickerComponent implements OnInit, OnDestroy { setRequestedDeliveryDate() { const userId = this.cartEntry?.user?.uid || ''; const cartId = this.cartEntry?.code || ''; - const requestedDate = - this.form?.get('requestDeliveryDate')?.value || - this.requestedRetrievalAt || - ''; + const requestedDate = this.form?.get('requestDeliveryDate')?.value || ''; if ( userId.length === 0 || cartId.length === 0 || - requestedDate.length === 0 + requestedDate.length === 0 || + !this.dateValidationService.isDateStringValid(requestedDate) || + !this.dateValidationService.isDateGreaterOrEqual( + requestedDate, + this.earliestRetrievalAt || '' + ) ) { return; } diff --git a/feature-libs/requested-delivery-date/root/components/shared/date-validation.service.spec.ts b/feature-libs/requested-delivery-date/root/components/shared/date-validation.service.spec.ts index 5e947fcaca0..f23ff8db9e9 100644 --- a/feature-libs/requested-delivery-date/root/components/shared/date-validation.service.spec.ts +++ b/feature-libs/requested-delivery-date/root/components/shared/date-validation.service.spec.ts @@ -6,6 +6,8 @@ const mockInvalidDate1 = '32-09-2023'; const mockInvalidDate2 = '29-02-rddo'; const mockInvalidDate3 = ''; const mockInvalidDate4 = 'abcd'; +const mockValidGreaterDate = '31-12-2023'; +const mockValidLesserDate = '01-01-2023'; describe('DateValidationService', () => { let service: DateValidationService; @@ -22,14 +24,40 @@ describe('DateValidationService', () => { expect(service).toBeTruthy(); }); - it('should validate correct Dates', () => { - expect(service.isDateStringValid(mockValidDate)).toBeTruthy(); + describe('isDateStringValid', () => { + it('should validate correct Dates', () => { + expect(service.isDateStringValid(mockValidDate)).toBeTruthy(); + }); + + it('should invalidate wrong Dates', () => { + expect(service.isDateStringValid(mockInvalidDate1)).toBeFalsy(); + expect(service.isDateStringValid(mockInvalidDate2)).toBeFalsy(); + expect(service.isDateStringValid(mockInvalidDate3)).toBeFalsy(); + expect(service.isDateStringValid(mockInvalidDate4)).toBeFalsy(); + }); }); - it('should invalidate wrong Dates', () => { - expect(service.isDateStringValid(mockInvalidDate1)).toBeFalsy(); - expect(service.isDateStringValid(mockInvalidDate2)).toBeFalsy(); - expect(service.isDateStringValid(mockInvalidDate3)).toBeFalsy(); - expect(service.isDateStringValid(mockInvalidDate4)).toBeFalsy(); + describe('isDateGreaterOrEqual', () => { + it('should return false for invalid dates', () => { + expect(service.isDateGreaterOrEqual(mockValidDate, '')).toBeFalsy(); + }); + + it('should return false when source date is less than target', () => { + expect( + service.isDateGreaterOrEqual(mockValidLesserDate, mockValidDate) + ).toBeFalsy(); + }); + + it('should return true for equal dates', () => { + expect( + service.isDateGreaterOrEqual(mockValidDate, mockValidDate) + ).toBeTruthy(); + }); + + it('should return true when source date is greater than target', () => { + expect( + service.isDateGreaterOrEqual(mockValidGreaterDate, mockValidDate) + ).toBeTruthy(); + }); }); }); diff --git a/feature-libs/requested-delivery-date/root/components/shared/date-validation.service.ts b/feature-libs/requested-delivery-date/root/components/shared/date-validation.service.ts index 2410013bd29..e6b9bd681cf 100644 --- a/feature-libs/requested-delivery-date/root/components/shared/date-validation.service.ts +++ b/feature-libs/requested-delivery-date/root/components/shared/date-validation.service.ts @@ -21,8 +21,32 @@ export class DateValidationService { value !== undefined && value.length > 0 && !isNaN( - new Date(value.replace(/(\d{2})-(\d{2})-(\d{4})/, '$2/$1/$3')).getDate() //convert 'dd-mm-yyyy' into 'mm/dd/yyyy' + this.getDateFromDateString(value).getDate() //convert 'dd-mm-yyyy' into 'mm/dd/yyyy' ) ); } + + /** + * Returns a Date object from a date string in the format 'dd-mm-yyy' + * @param value Date string in the format 'dd-mm-yyy' + */ + getDateFromDateString(value: string): Date { + return new Date(value.replace(/(\d{2})-(\d{2})-(\d{4})/, '$2/$1/$3')); + } + + /** + * Checks if the source date is greater than or equal to the target + * @param source Date string in the format 'dd-mm-yyy' + * @param target Date string in the format 'dd-mm-yyy' + * @returns true if `source` date is greater than or equal to `target` date + */ + isDateGreaterOrEqual(source: string, target: string): boolean { + if (source.length === 0 || target.length === 0) { + return false; + } + const d1 = this.getDateFromDateString(source); + const d2 = this.getDateFromDateString(target); + + return d1 < d2 ? false : true; + } } diff --git a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/requested-delivery-date/requested-delivery-date.e2e.cy.ts b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/requested-delivery-date/requested-delivery-date.e2e.cy.ts index 21aa07b32f4..d430d0c141a 100644 --- a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/requested-delivery-date/requested-delivery-date.e2e.cy.ts +++ b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/requested-delivery-date/requested-delivery-date.e2e.cy.ts @@ -74,7 +74,7 @@ describe('Requested Delivery Date', { testIsolation: false }, () => { }); it('should show an error when an invalid delivery date is provided', () => { - rddHelper.updateRequestedDeliveryDate('1000-01-01'); + rddHelper.updateRequestedDeliveryDate('10000-01-01'); rddHelper.verifyDeliveryDateErrorMessage(); }); diff --git a/projects/storefrontapp-e2e-cypress/cypress/helpers/vendor/requested-delivery-date/requested-delivery-date.ts b/projects/storefrontapp-e2e-cypress/cypress/helpers/vendor/requested-delivery-date/requested-delivery-date.ts index c3f8432f38b..a074c5f26c9 100644 --- a/projects/storefrontapp-e2e-cypress/cypress/helpers/vendor/requested-delivery-date/requested-delivery-date.ts +++ b/projects/storefrontapp-e2e-cypress/cypress/helpers/vendor/requested-delivery-date/requested-delivery-date.ts @@ -99,8 +99,10 @@ export function verifyRDDDatePickerExists() { export function updateRequestedDeliveryDate(date: string) { interceptPutRequestedRetrievalAtEndpoint(); cy.get('cx-date-picker').within(() => { - cy.get('input[type="date"]', { timeout: 3000 }) + cy.get('input', { timeout: 3000 }) .should('not.be.disabled') + .invoke('removeAttr', 'type') + .clear() .type(date) .trigger('update'); }); From b519cbcabcc03e967b4bee7a16af3a1228a6ab60 Mon Sep 17 00:00:00 2001 From: Sherwin Varghese Date: Thu, 14 Sep 2023 22:35:20 +0530 Subject: [PATCH 10/19] feat: CXINT-1851: PDF Invoices feature library (#17807) Co-authored-by: github-actions[bot] --- .env-cmdrc | 7 +- core-libs/setup/tsconfig.spec.json | 16 + extra-webpack.config.js | 4 + feature-libs/asm/tsconfig.schematics.json | 16 + feature-libs/cart/tsconfig.schematics.json | 16 + .../checkout/tsconfig.schematics.json | 16 + .../tsconfig.schematics.json | 16 + feature-libs/order/tsconfig.schematics.json | 16 + .../organization/tsconfig.schematics.json | 16 + feature-libs/pdf-invoices/.eslintrc.json | 4 + feature-libs/pdf-invoices/README.md | 4 + feature-libs/pdf-invoices/_index.scss | 2 + .../pdf-invoices/assets/ng-package.json | 6 + .../pdf-invoices/assets/public_api.ts | 7 + .../assets/translations/en/index.ts | 11 + .../assets/translations/en/pdf-invoices.ts | 39 ++ .../assets/translations/translations.ts | 16 + feature-libs/pdf-invoices/components/index.ts | 7 + .../invoices-list.component.html | 191 ++++++ .../invoices-list.component.spec.ts | 474 +++++++++++++++ .../invoices-list/invoices-list.component.ts | 195 ++++++ .../pdf-invoices/components/ng-package.json | 6 + .../pdf-invoices-components.module.ts | 51 ++ .../pdf-invoices/components/public_api.ts | 8 + .../core/connectors/converters.ts | 13 + .../pdf-invoices/core/connectors/index.ts | 9 + .../core/connectors/pdf-invoices.adapter.ts | 39 ++ .../connectors/pdf-invoices.connector.spec.ts | 121 ++++ .../core/connectors/pdf-invoices.connector.ts | 42 ++ .../pdf-invoices-badrequest.handler.spec.ts | 96 +++ .../pdf-invoices-badrequest.handler.ts | 91 +++ .../core/http-interceptors/index.ts | 7 + .../pdf-invoices/core/ng-package.json | 6 + .../core/pdf-invoices-core.module.ts | 30 + feature-libs/pdf-invoices/core/public_api.ts | 10 + .../pdf-invoices/core/services/index.ts | 7 + .../services/pdf-invoices.service.spec.ts | 186 ++++++ .../core/services/pdf-invoices.service.ts | 81 +++ .../pdf-invoices/jest.schematics.config.js | 35 ++ feature-libs/pdf-invoices/karma.conf.js | 47 ++ feature-libs/pdf-invoices/ng-package.json | 8 + .../pdf-invoices/occ/adapters/index.ts | 7 + .../adapters/occ-pdf-invoices.adapter.spec.ts | 251 ++++++++ .../occ/adapters/occ-pdf-invoices.adapter.ts | 97 +++ .../config/default-occ-pdf-invoices-config.ts | 19 + feature-libs/pdf-invoices/occ/model/index.ts | 8 + .../occ/model/occ-pdf-invoices.model.ts | 27 + feature-libs/pdf-invoices/occ/ng-package.json | 6 + .../occ/pdf-invoices-occ.module.ts | 24 + feature-libs/pdf-invoices/occ/public_api.ts | 9 + feature-libs/pdf-invoices/package.json | 42 ++ .../pdf-invoices/pdf-invoices.module.ts | 20 + feature-libs/pdf-invoices/project.json | 40 ++ feature-libs/pdf-invoices/public_api.ts | 10 + .../pdf-invoices/root/facade/index.ts | 7 + .../root/facade/pdf-invoices.facade.ts | 54 ++ .../pdf-invoices/root/feature-name.ts | 8 + feature-libs/pdf-invoices/root/model/index.ts | 7 + .../root/model/pdf-invoices.model.ts | 50 ++ .../pdf-invoices/root/ng-package.json | 6 + .../root/pdf-invoices-root.module.ts | 34 ++ feature-libs/pdf-invoices/root/public_api.ts | 10 + .../pdf-invoices/schematics/.gitignore | 18 + .../__snapshots__/index_spec.ts.snap | 130 ++++ .../schematics/add-pdf-invoices/index.ts | 46 ++ .../schematics/add-pdf-invoices/index_spec.ts | 174 ++++++ .../schematics/add-pdf-invoices/schema.json | 31 + .../pdf-invoices/schematics/collection.json | 18 + feature-libs/pdf-invoices/setup-jest.ts | 8 + feature-libs/pdf-invoices/styles/_index.scss | 1 + .../pdf-invoices/styles/_pdf-invoices.scss | 237 ++++++++ feature-libs/pdf-invoices/test.ts | 22 + feature-libs/pdf-invoices/tsconfig.lib.json | 33 ++ .../pdf-invoices/tsconfig.lib.prod.json | 11 + .../pdf-invoices/tsconfig.schematics.json | 557 ++++++++++++++++++ feature-libs/pdf-invoices/tsconfig.spec.json | 14 + .../pickup-in-store/tsconfig.schematics.json | 16 + .../tsconfig.schematics.json | 16 + feature-libs/product/tsconfig.schematics.json | 16 + .../qualtrics/tsconfig.schematics.json | 16 + .../requested-delivery-date/tsconfig.lib.json | 2 +- .../tsconfig.schematics.json | 16 + .../smartedit/tsconfig.schematics.json | 16 + .../storefinder/tsconfig.schematics.json | 16 + .../tracking/tsconfig.schematics.json | 16 + feature-libs/user/tsconfig.schematics.json | 16 + integration-libs/cdc/tsconfig.schematics.json | 16 + integration-libs/cds/tsconfig.schematics.json | 16 + .../digital-payments/tsconfig.schematics.json | 16 + .../tsconfig.schematics.json | 16 + integration-libs/s4om/README.md | 7 +- integration-libs/s4om/package.json | 1 + .../s4om/root/s4om-root.module.ts | 2 + .../s4om/schematics/add-s4om/schema.json | 4 + integration-libs/s4om/tsconfig.lib.json | 10 +- .../s4om/tsconfig.schematics.json | 16 + .../segment-refs/tsconfig.schematics.json | 16 + package.json | 5 +- projects/schematics/package.json | 1 + .../schematics/src/add-spartacus/schema.json | 5 + projects/schematics/src/dependencies.json | 12 + .../s4om-schematics-config.ts | 9 +- .../pdf-invoices-schematics-config.ts | 57 ++ .../schematics/src/shared/libs-constants.ts | 6 + .../src/shared/schematics-config-mappings.ts | 3 + .../src/shared/utils/graph-utils_spec.ts | 5 +- .../schematics/src/shared/utils/test-utils.ts | 2 + .../pdf-invoices/pdf-invoices.e2e.cy.ts | 142 +++++ .../requested-delivery-date.e2e.cy.ts | 24 +- .../vendor/s4om/s4om-schedule-lines.e2e.cy.ts | 22 +- .../vendor/pdf-invoices/pdf-invoices.ts | 474 +++++++++++++++ projects/storefrontapp/project.json | 4 + .../pdf-invoices-feature.module.ts | 38 ++ .../spartacus/spartacus-features.module.ts | 4 + .../src/environments/environment.prod.ts | 1 + .../src/environments/environment.ts | 1 + .../models/build.process.env.d.ts | 1 + .../environments/models/environment.model.ts | 1 + .../src/styles/lib-pdf-invoices.scss | 2 + projects/storefrontapp/tsconfig.app.prod.json | 6 + projects/storefrontapp/tsconfig.server.json | 16 + .../storefrontapp/tsconfig.server.prod.json | 8 + scripts/install/functions.sh | 28 + tools/schematics/testing.ts | 3 + tsconfig.compodoc.json | 18 + tsconfig.json | 18 + 126 files changed, 5157 insertions(+), 33 deletions(-) create mode 100644 feature-libs/pdf-invoices/.eslintrc.json create mode 100644 feature-libs/pdf-invoices/README.md create mode 100644 feature-libs/pdf-invoices/_index.scss create mode 100644 feature-libs/pdf-invoices/assets/ng-package.json create mode 100644 feature-libs/pdf-invoices/assets/public_api.ts create mode 100644 feature-libs/pdf-invoices/assets/translations/en/index.ts create mode 100644 feature-libs/pdf-invoices/assets/translations/en/pdf-invoices.ts create mode 100644 feature-libs/pdf-invoices/assets/translations/translations.ts create mode 100644 feature-libs/pdf-invoices/components/index.ts create mode 100644 feature-libs/pdf-invoices/components/invoices-list/invoices-list.component.html create mode 100644 feature-libs/pdf-invoices/components/invoices-list/invoices-list.component.spec.ts create mode 100644 feature-libs/pdf-invoices/components/invoices-list/invoices-list.component.ts create mode 100644 feature-libs/pdf-invoices/components/ng-package.json create mode 100644 feature-libs/pdf-invoices/components/pdf-invoices-components.module.ts create mode 100644 feature-libs/pdf-invoices/components/public_api.ts create mode 100644 feature-libs/pdf-invoices/core/connectors/converters.ts create mode 100644 feature-libs/pdf-invoices/core/connectors/index.ts create mode 100644 feature-libs/pdf-invoices/core/connectors/pdf-invoices.adapter.ts create mode 100644 feature-libs/pdf-invoices/core/connectors/pdf-invoices.connector.spec.ts create mode 100644 feature-libs/pdf-invoices/core/connectors/pdf-invoices.connector.ts create mode 100644 feature-libs/pdf-invoices/core/http-interceptors/bad-request/pdf-invoices-badrequest.handler.spec.ts create mode 100644 feature-libs/pdf-invoices/core/http-interceptors/bad-request/pdf-invoices-badrequest.handler.ts create mode 100644 feature-libs/pdf-invoices/core/http-interceptors/index.ts create mode 100644 feature-libs/pdf-invoices/core/ng-package.json create mode 100644 feature-libs/pdf-invoices/core/pdf-invoices-core.module.ts create mode 100644 feature-libs/pdf-invoices/core/public_api.ts create mode 100644 feature-libs/pdf-invoices/core/services/index.ts create mode 100644 feature-libs/pdf-invoices/core/services/pdf-invoices.service.spec.ts create mode 100644 feature-libs/pdf-invoices/core/services/pdf-invoices.service.ts create mode 100644 feature-libs/pdf-invoices/jest.schematics.config.js create mode 100644 feature-libs/pdf-invoices/karma.conf.js create mode 100644 feature-libs/pdf-invoices/ng-package.json create mode 100644 feature-libs/pdf-invoices/occ/adapters/index.ts create mode 100644 feature-libs/pdf-invoices/occ/adapters/occ-pdf-invoices.adapter.spec.ts create mode 100644 feature-libs/pdf-invoices/occ/adapters/occ-pdf-invoices.adapter.ts create mode 100644 feature-libs/pdf-invoices/occ/config/default-occ-pdf-invoices-config.ts create mode 100644 feature-libs/pdf-invoices/occ/model/index.ts create mode 100644 feature-libs/pdf-invoices/occ/model/occ-pdf-invoices.model.ts create mode 100644 feature-libs/pdf-invoices/occ/ng-package.json create mode 100644 feature-libs/pdf-invoices/occ/pdf-invoices-occ.module.ts create mode 100644 feature-libs/pdf-invoices/occ/public_api.ts create mode 100644 feature-libs/pdf-invoices/package.json create mode 100644 feature-libs/pdf-invoices/pdf-invoices.module.ts create mode 100644 feature-libs/pdf-invoices/project.json create mode 100644 feature-libs/pdf-invoices/public_api.ts create mode 100644 feature-libs/pdf-invoices/root/facade/index.ts create mode 100644 feature-libs/pdf-invoices/root/facade/pdf-invoices.facade.ts create mode 100644 feature-libs/pdf-invoices/root/feature-name.ts create mode 100644 feature-libs/pdf-invoices/root/model/index.ts create mode 100644 feature-libs/pdf-invoices/root/model/pdf-invoices.model.ts create mode 100644 feature-libs/pdf-invoices/root/ng-package.json create mode 100644 feature-libs/pdf-invoices/root/pdf-invoices-root.module.ts create mode 100644 feature-libs/pdf-invoices/root/public_api.ts create mode 100644 feature-libs/pdf-invoices/schematics/.gitignore create mode 100644 feature-libs/pdf-invoices/schematics/add-pdf-invoices/__snapshots__/index_spec.ts.snap create mode 100644 feature-libs/pdf-invoices/schematics/add-pdf-invoices/index.ts create mode 100644 feature-libs/pdf-invoices/schematics/add-pdf-invoices/index_spec.ts create mode 100644 feature-libs/pdf-invoices/schematics/add-pdf-invoices/schema.json create mode 100644 feature-libs/pdf-invoices/schematics/collection.json create mode 100644 feature-libs/pdf-invoices/setup-jest.ts create mode 100644 feature-libs/pdf-invoices/styles/_index.scss create mode 100644 feature-libs/pdf-invoices/styles/_pdf-invoices.scss create mode 100644 feature-libs/pdf-invoices/test.ts create mode 100644 feature-libs/pdf-invoices/tsconfig.lib.json create mode 100644 feature-libs/pdf-invoices/tsconfig.lib.prod.json create mode 100644 feature-libs/pdf-invoices/tsconfig.schematics.json create mode 100644 feature-libs/pdf-invoices/tsconfig.spec.json create mode 100644 projects/schematics/src/shared/lib-configs/pdf-invoices-schematics-config.ts create mode 100644 projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/pdf-invoices/pdf-invoices.e2e.cy.ts create mode 100644 projects/storefrontapp-e2e-cypress/cypress/helpers/vendor/pdf-invoices/pdf-invoices.ts create mode 100644 projects/storefrontapp/src/app/spartacus/features/pdf-invoices/pdf-invoices-feature.module.ts create mode 100644 projects/storefrontapp/src/styles/lib-pdf-invoices.scss diff --git a/.env-cmdrc b/.env-cmdrc index a8bec18cc0b..21292fe4220 100644 --- a/.env-cmdrc +++ b/.env-cmdrc @@ -49,10 +49,15 @@ "CX_BASE_URL": "https://api.cg79x9wuu9-eccommerc1-s8-public.model-t.myhybris.cloud", "CX_B2B": "true", "CX_S4OM": "true", - "CX_REQUESTED_DELIVERY_DATE": "true" + "CX_REQUESTED_DELIVERY_DATE": "true", + "CX_PDF_INVOICES": "true" }, "requested-delivery-date": { "CX_BASE_URL": "https://api.cg79x9wuu9-eccommerc1-s8-public.model-t.myhybris.cloud", "CX_REQUESTED_DELIVERY_DATE": "true" + }, + "pdf-invoices": { + "CX_BASE_URL": "https://api.cg79x9wuu9-eccommerc1-s5-public.model-t.myhybris.cloud", + "CX_PDF_INVOICES": "true" } } diff --git a/core-libs/setup/tsconfig.spec.json b/core-libs/setup/tsconfig.spec.json index a186e6ab397..87b97044e31 100644 --- a/core-libs/setup/tsconfig.spec.json +++ b/core-libs/setup/tsconfig.spec.json @@ -262,6 +262,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/extra-webpack.config.js b/extra-webpack.config.js index 663f036087e..ebf83056b8c 100644 --- a/extra-webpack.config.js +++ b/extra-webpack.config.js @@ -29,6 +29,10 @@ module.exports = { __dirname, 'feature-libs/organization' ), + '@spartacus/pdf-invoices': path.join( + __dirname, + 'feature-libs/pdf-invoices' + ), '@spartacus/product': path.join(__dirname, 'feature-libs/product'), '@spartacus/product-configurator': path.join( __dirname, diff --git a/feature-libs/asm/tsconfig.schematics.json b/feature-libs/asm/tsconfig.schematics.json index 1652ce2b588..f737af1f63b 100644 --- a/feature-libs/asm/tsconfig.schematics.json +++ b/feature-libs/asm/tsconfig.schematics.json @@ -259,6 +259,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/feature-libs/cart/tsconfig.schematics.json b/feature-libs/cart/tsconfig.schematics.json index 1652ce2b588..f737af1f63b 100644 --- a/feature-libs/cart/tsconfig.schematics.json +++ b/feature-libs/cart/tsconfig.schematics.json @@ -259,6 +259,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/feature-libs/checkout/tsconfig.schematics.json b/feature-libs/checkout/tsconfig.schematics.json index 1652ce2b588..f737af1f63b 100644 --- a/feature-libs/checkout/tsconfig.schematics.json +++ b/feature-libs/checkout/tsconfig.schematics.json @@ -259,6 +259,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/feature-libs/customer-ticketing/tsconfig.schematics.json b/feature-libs/customer-ticketing/tsconfig.schematics.json index bc2b2041ba7..125e28e522d 100644 --- a/feature-libs/customer-ticketing/tsconfig.schematics.json +++ b/feature-libs/customer-ticketing/tsconfig.schematics.json @@ -272,6 +272,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/feature-libs/order/tsconfig.schematics.json b/feature-libs/order/tsconfig.schematics.json index 1652ce2b588..f737af1f63b 100644 --- a/feature-libs/order/tsconfig.schematics.json +++ b/feature-libs/order/tsconfig.schematics.json @@ -259,6 +259,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/feature-libs/organization/tsconfig.schematics.json b/feature-libs/organization/tsconfig.schematics.json index 1652ce2b588..f737af1f63b 100644 --- a/feature-libs/organization/tsconfig.schematics.json +++ b/feature-libs/organization/tsconfig.schematics.json @@ -259,6 +259,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/feature-libs/pdf-invoices/.eslintrc.json b/feature-libs/pdf-invoices/.eslintrc.json new file mode 100644 index 00000000000..862b5a870b0 --- /dev/null +++ b/feature-libs/pdf-invoices/.eslintrc.json @@ -0,0 +1,4 @@ +{ + "extends": "../../.eslintrc.json", + "ignorePatterns": ["schematics/**/*.d.ts"] +} diff --git a/feature-libs/pdf-invoices/README.md b/feature-libs/pdf-invoices/README.md new file mode 100644 index 00000000000..b1cac7c8742 --- /dev/null +++ b/feature-libs/pdf-invoices/README.md @@ -0,0 +1,4 @@ +# PDF Invoices + +This feature allows users to view invoices for their orders and download PDF invoices using `Invoices` APIs. +When the user selects an invoice, the backend returns a byte array, which is converted to PDF and downloaded. \ No newline at end of file diff --git a/feature-libs/pdf-invoices/_index.scss b/feature-libs/pdf-invoices/_index.scss new file mode 100644 index 00000000000..86f72a0df42 --- /dev/null +++ b/feature-libs/pdf-invoices/_index.scss @@ -0,0 +1,2 @@ +@import '@spartacus/styles/scss/core'; +@import './styles/index'; diff --git a/feature-libs/pdf-invoices/assets/ng-package.json b/feature-libs/pdf-invoices/assets/ng-package.json new file mode 100644 index 00000000000..38e01ac17de --- /dev/null +++ b/feature-libs/pdf-invoices/assets/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "./public_api.ts" + } +} diff --git a/feature-libs/pdf-invoices/assets/public_api.ts b/feature-libs/pdf-invoices/assets/public_api.ts new file mode 100644 index 00000000000..f3d8f426ab4 --- /dev/null +++ b/feature-libs/pdf-invoices/assets/public_api.ts @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './translations/translations'; diff --git a/feature-libs/pdf-invoices/assets/translations/en/index.ts b/feature-libs/pdf-invoices/assets/translations/en/index.ts new file mode 100644 index 00000000000..702a8063b58 --- /dev/null +++ b/feature-libs/pdf-invoices/assets/translations/en/index.ts @@ -0,0 +1,11 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { pdfInvoices } from './pdf-invoices'; + +export const en = { + pdfInvoices, +}; diff --git a/feature-libs/pdf-invoices/assets/translations/en/pdf-invoices.ts b/feature-libs/pdf-invoices/assets/translations/en/pdf-invoices.ts new file mode 100644 index 00000000000..808a173b3bc --- /dev/null +++ b/feature-libs/pdf-invoices/assets/translations/en/pdf-invoices.ts @@ -0,0 +1,39 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export const pdfInvoices = { + pdfInvoices: { + featureNotEnabled: + 'Unable to obtain invoices, ensure that SAP Invoice and API for Invoices are enabled.', + invoicesLoadingError: + 'Something went wrong. Unable to display invoices for the order', + invoicesTable: { + header: 'Invoices', + label: 'Invoices Table', + invoiceId: 'Invoice #', + createdAt: 'Date', + netAmount: 'Net Amount', + totalAmount: 'Total Amount', + attachment: 'Download Invoice', + download: 'Download', + attachmentDescription: 'Download PDF for invoice {{id}}.', + noneFound: 'No Invoices Found', + }, + downloadPDFError: 'Something went wrong. Unable to obtain the invoice PDF.', + sortBy: 'Sort by', + sortInvoices: 'Sort invoices', + sorts: { + byCreatedAtAsc: 'Date Ascending', + byCreatedAtDesc: 'Date Descending', + byInvoiceIdAsc: 'Invoice Number Ascending', + byInvoiceIdDesc: 'Invoice Number Descending', + byNetAmountAsc: 'Net Amount Ascending', + byNetAmountDesc: 'Net Amount Descending', + byTotalAmountAsc: 'Total Amount Ascending', + byTotalAmountDesc: 'Total Amount Descending', + }, + }, +}; diff --git a/feature-libs/pdf-invoices/assets/translations/translations.ts b/feature-libs/pdf-invoices/assets/translations/translations.ts new file mode 100644 index 00000000000..5c3d46cc2b6 --- /dev/null +++ b/feature-libs/pdf-invoices/assets/translations/translations.ts @@ -0,0 +1,16 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { TranslationChunksConfig, TranslationResources } from '@spartacus/core'; +import { en } from './en/index'; + +export const pdfInvoicesTranslations: TranslationResources = { + en, +}; + +export const pdfInvoicesTranslationChunksConfig: TranslationChunksConfig = { + pdfInvoices: ['pdfInvoices'], +}; diff --git a/feature-libs/pdf-invoices/components/index.ts b/feature-libs/pdf-invoices/components/index.ts new file mode 100644 index 00000000000..8da193365a3 --- /dev/null +++ b/feature-libs/pdf-invoices/components/index.ts @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './pdf-invoices-components.module'; diff --git a/feature-libs/pdf-invoices/components/invoices-list/invoices-list.component.html b/feature-libs/pdf-invoices/components/invoices-list/invoices-list.component.html new file mode 100644 index 00000000000..823bd4d5cd1 --- /dev/null +++ b/feature-libs/pdf-invoices/components/invoices-list/invoices-list.component.html @@ -0,0 +1,191 @@ + + +
+ +
+

+ {{ 'pdfInvoices.invoicesTable.header' | cxTranslate }} +

+
+ + +
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + +
+ {{ 'pdfInvoices.invoicesTable.invoiceId' | cxTranslate }} + + {{ 'pdfInvoices.invoicesTable.createdAt' | cxTranslate }} + + {{ 'pdfInvoices.invoicesTable.netAmount' | cxTranslate }} + + {{ 'pdfInvoices.invoicesTable.totalAmount' | cxTranslate }} + + +
+
+ {{ 'pdfInvoices.invoicesTable.invoiceId' | cxTranslate }} +
+
+ {{ invoice.invoiceId }} +
+
+
+ {{ 'pdfInvoices.invoicesTable.createdAt' | cxTranslate }} +
+
+ {{ invoice.createdAt | cxDate: 'longDate' }} +
+
+
+ {{ 'pdfInvoices.invoicesTable.netAmount' | cxTranslate }} +
+
+ {{ + invoice.netAmount?.formattedValue + ? invoice.netAmount?.formattedValue + : invoice.netAmount?.currencyIso + + ' ' + + invoice.netAmount?.value + }} +
+
+
+ {{ 'pdfInvoices.invoicesTable.totalAmount' | cxTranslate }} +
+
+ {{ + invoice.totalAmount?.formattedValue + ? invoice.totalAmount?.formattedValue + : invoice.totalAmount?.currencyIso + + ' ' + + invoice.totalAmount?.value + }} +
+
+
+ {{ 'pdfInvoices.invoicesTable.attachment' | cxTranslate }} +
+
+ +
+
+ + +
+
+ +
+
+
+
+
+
diff --git a/feature-libs/pdf-invoices/components/invoices-list/invoices-list.component.spec.ts b/feature-libs/pdf-invoices/components/invoices-list/invoices-list.component.spec.ts new file mode 100644 index 00000000000..04848888b74 --- /dev/null +++ b/feature-libs/pdf-invoices/components/invoices-list/invoices-list.component.spec.ts @@ -0,0 +1,474 @@ +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { + GlobalMessageEntities, + GlobalMessageService, + GlobalMessageType, + HttpErrorModel, + I18nTestingModule, + LanguageService, + Translatable, + TranslationService, +} from '@spartacus/core'; +import { + InvoiceQueryParams, + InvoicesFields, + OrderInvoiceList, + PDFInvoicesFacade, +} from '@spartacus/pdf-invoices/root'; +import { FileDownloadService, IconTestingModule } from '@spartacus/storefront'; +import { EMPTY, Observable, of, throwError } from 'rxjs'; +import { take } from 'rxjs/operators'; +import { InvoicesListComponent } from './invoices-list.component'; +import createSpy = jasmine.createSpy; + +const blob = new Blob(); + +const mockOrderInvoiceList: OrderInvoiceList = { + invoices: [ + { + createdAt: new Date('2023-09-15T18:29:59+0000'), + invoiceId: '200000a', + netAmount: { + currencyIso: 'USD', + value: 115, + }, + totalAmount: { + currencyIso: 'USD', + value: 117, + }, + }, + { + createdAt: new Date('2023-08-31T18:29:59+0000'), + invoiceId: '200000b', + netAmount: { + currencyIso: 'USD', + value: 118, + formattedValue: '$118', //to test formatted value in UI + }, + totalAmount: { + currencyIso: 'USD', + value: 120, + formattedValue: '$120', //to test formatted value in UI + }, + }, + { + createdAt: new Date('2023-07-20T18:29:59+0000'), + invoiceId: '200000c', + netAmount: { + currencyIso: 'USD', + value: 398, + }, + totalAmount: { + currencyIso: 'USD', + value: 400, + }, + }, + { + createdAt: new Date('2023-06-22T18:29:59+0000'), + externalSystemId: 'S4SALES', //to test external id being passed for download + invoiceId: '200000d', + netAmount: { + currencyIso: 'USD', + value: 115, + }, + totalAmount: { + currencyIso: 'USD', + value: 117, + }, + }, + { + createdAt: new Date('2023-05-11T18:29:59+0000'), + invoiceId: '200000e', + netAmount: { + currencyIso: 'USD', + value: 118, + }, + totalAmount: { + currencyIso: 'USD', + value: 120, + }, + }, + ], + pagination: { + count: 5, + page: 0, + totalCount: 16, + totalPages: 4, + }, + sorts: [ + { + asc: true, + code: 'invoiceId', + }, + ], +}; + +@Component({ + template: '', + selector: 'cx-pagination', +}) +class MockPaginationComponent { + @Input() pagination: any; + @Output() viewPageEvent = new EventEmitter(); +} +@Component({ + template: '', + selector: 'cx-sorting', +}) +class MockSortingComponent { + @Input() sortOptions: any; + @Input() sortLabels: any; + @Input() selectedOption: any; + @Input() placeholder: any; + @Output() sortListEvent = new EventEmitter(); +} + +class MockPDFInvoicesFacade implements Partial { + getInvoicesForOrder( + params: InvoiceQueryParams, + _userId?: string, + _orderId?: string + ): Observable { + return of(params ? mockOrderInvoiceList : {}); + } + getInvoicePDF( + invoiceId: string, + _externalSystemId?: string, + _userId?: string, + _orderId?: string + ): Observable { + if (invoiceId) { + return of(blob); + } else { + return EMPTY; + } + } +} + +class MockFileDownloadService { + download = createSpy('MockFileDownloadService.download Spy'); +} + +class MockLanguageService { + getActive(): Observable { + return of('en'); + } +} + +class MockTranslationService implements Partial { + translate(value: string, options: any) { + return of(value + Object.values(options)); + } +} + +class MockGlobalMessageService implements Partial { + get(): Observable { + return of({}); + } + add(_: string | Translatable, __: GlobalMessageType, ___?: number): void {} + remove(_: GlobalMessageType, __?: number): void {} +} + +const mockInvoicesNotEnabledError: HttpErrorModel = { + details: [ + { + message: + 'There is no resource for path /occ/v2/powertools-spa/users/userId1/orders/15092023/invoices', + type: 'UnknownResourceError', + }, + ], +}; + +describe('InvoicesListComponent', () => { + let component: InvoicesListComponent; + let fixture: ComponentFixture; + let pdfInvoicesFacade: PDFInvoicesFacade; + let translationService: TranslationService; + let downloadService: FileDownloadService; + let globalMessageService: GlobalMessageService; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [I18nTestingModule, IconTestingModule], + declarations: [ + InvoicesListComponent, + MockPaginationComponent, + MockSortingComponent, + ], + providers: [ + { provide: PDFInvoicesFacade, useClass: MockPDFInvoicesFacade }, + { provide: FileDownloadService, useClass: MockFileDownloadService }, + { provide: LanguageService, useClass: MockLanguageService }, + { provide: TranslationService, useClass: MockTranslationService }, + { provide: GlobalMessageService, useClass: MockGlobalMessageService }, + ], + }).compileComponents(); + pdfInvoicesFacade = TestBed.inject(PDFInvoicesFacade); + translationService = TestBed.inject(TranslationService); + downloadService = TestBed.inject(FileDownloadService); + globalMessageService = TestBed.inject(GlobalMessageService); + + spyOn(globalMessageService, 'add').and.callThrough(); + spyOn(translationService, 'translate').and.returnValue(of('test')); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(InvoicesListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should show feature not enabled error when the API returns error', () => { + spyOn(pdfInvoicesFacade, 'getInvoicesForOrder').and.returnValue( + throwError(mockInvoicesNotEnabledError) + ); + spyOn(component, 'getNotEnabledError').and.callThrough(); + + // Change the page + const newPage = 3; + component.pageChange(newPage); + expect(component.getNotEnabledError).toHaveBeenCalled(); + expect(globalMessageService.add).toHaveBeenCalledWith( + { key: 'pdfInvoices.featureNotEnabled' }, + GlobalMessageType.MSG_TYPE_ERROR + ); + }); + + it('should read document list', (done) => { + let orderInvoiceList: OrderInvoiceList = {}; + let queryParams: InvoiceQueryParams = {}; + component.invoicesList$ + .pipe(take(1)) + .subscribe((value: OrderInvoiceList) => { + orderInvoiceList = value; + }); + expect(orderInvoiceList).toEqual(mockOrderInvoiceList); + expect(component.pagination).toEqual({ + currentPage: 0, + pageSize: 5, + totalPages: 4, + totalResults: 16, + sort: 'invoiceId:asc', + }); + component.queryParams$ + .pipe(take(1)) + .subscribe((value: InvoiceQueryParams) => { + queryParams = value; + done(); + }); + expect(queryParams).toEqual({ + currentPage: 0, + pageSize: 5, + fields: InvoicesFields.FULL, + sort: 'invoiceId:asc', + }); + }); + + it('Should change page and invoke the API', () => { + // Spy functions to ensure new invoices are being fetched + spyOn(component, 'updateQueryParams').and.callThrough(); + spyOn(pdfInvoicesFacade, 'getInvoicesForOrder').and.callThrough(); + + // By default currentPage will be 0 + expect(component._initQueryParams.currentPage).toEqual(0); + + // Change the page + const newPage = 3; + component.pageChange(newPage); + + // The query params should be updated with the new page + expect(component['updateQueryParams']).toHaveBeenCalled(); + expect(component._initQueryParams.currentPage).toEqual(newPage); + + // A new call with updated parameters is made to PDF Invoices Facade + expect(pdfInvoicesFacade.getInvoicesForOrder).toHaveBeenCalledWith({ + ...component._initQueryParams, + currentPage: newPage, + fields: InvoicesFields.DEFAULT, + }); + }); + + it('Should change sort and invoke the API', () => { + // Spy functions to ensure new invoices are being fetched + spyOn(component, 'updateQueryParams').and.callThrough(); + spyOn(pdfInvoicesFacade, 'getInvoicesForOrder').and.callThrough(); + // Getting ready to change sort, make sure that current sort is different and should be one of the sortOptions key + const newSortCode = 'byTotalAmountAsc'; + expect(component._initQueryParams.sort).not.toEqual(newSortCode); + + // Change the sort + component.sortChange(newSortCode); + + // Expect sort to be updated and currentPage to be set back to 0 + expect(component._initQueryParams.sort).toEqual( + component['sortMapping'][newSortCode] + ); + const newPage = 3; + expect(component._initQueryParams.currentPage).not.toEqual(newPage); + expect(component._initQueryParams.currentPage).toEqual(0); + + expect(pdfInvoicesFacade.getInvoicesForOrder).toHaveBeenCalledWith({ + ...component._initQueryParams, + sort: component['sortMapping'][newSortCode], + currentPage: 0, + fields: InvoicesFields.DEFAULT, + }); + }); + + it('Should populate sort options with translations', () => { + // By default there are 8 sort options + expect(component.sortOptions?.length).toEqual(8); + + // Expect that translate was called for each of the sort Mappings + expect(component.sortOptions?.length).toEqual(8); + // Expect that the length of sortOptions is 2 + expect(translationService['translate']).toHaveBeenCalledTimes(8); + // Expect that names have been assigned + component.sortOptions.forEach((sort) => { + expect(sort?.code && component['sortMapping'][sort?.code]).not.toBeNull(); + expect(sort.name).toEqual('test'); + }); + }); + + it('Should have table headers', () => { + const tableElement = fixture.debugElement.query( + By.css('.cx-invoices-list-table') + ); + + const tableHeaders = tableElement.queryAll(By.css('th')); + expect(tableHeaders?.length).toEqual(5); + expect(tableHeaders[0].properties.innerText).toEqual( + 'pdfInvoices.invoicesTable.invoiceId' + ); + expect(tableHeaders[1].properties.innerText).toEqual( + 'pdfInvoices.invoicesTable.createdAt' + ); + expect(tableHeaders[2].properties.innerText).toEqual( + 'pdfInvoices.invoicesTable.netAmount' + ); + expect(tableHeaders[3].properties.innerText).toEqual( + 'pdfInvoices.invoicesTable.totalAmount' + ); + expect(tableHeaders[4].children[0].attributes.title).toEqual( + 'pdfInvoices.invoicesTable.attachment' + ); + }); + + it('Should have populated table data', () => { + const isDate = (formattedDate: string): boolean => + /[a-zA-Z]+ \d{1,2}, \d{4}/gm.test(formattedDate); + + const tableElement = fixture.debugElement.query( + By.css('.cx-invoices-list-table') + ); + + const tableRows = tableElement.queryAll(By.css('tr')); + expect(tableRows?.length).toEqual(5); + + tableRows?.forEach((row, rowNumber) => { + const tableCells = row.queryAll(By.css('.cx-invoices-list-value')); + + expect(tableCells?.length).toEqual(5); + + expect(tableCells[0].nativeElement.innerText).toEqual( + mockOrderInvoiceList.invoices?.[rowNumber]?.invoiceId + ); + + expect(isDate(tableCells[1].nativeElement.innerText)).toEqual( + !!mockOrderInvoiceList.invoices?.[rowNumber]?.createdAt + ); + + if ( + mockOrderInvoiceList.invoices?.[rowNumber]?.netAmount?.formattedValue + ) { + expect(tableCells[2].nativeElement.innerText).toEqual( + mockOrderInvoiceList.invoices?.[rowNumber]?.netAmount?.formattedValue + ); + } else { + expect(tableCells[2].nativeElement.innerHTML).toEqual( + ` ${mockOrderInvoiceList.invoices?.[rowNumber]?.netAmount?.currencyIso} ${mockOrderInvoiceList.invoices?.[rowNumber]?.netAmount?.value} ` + ); + } + + if ( + mockOrderInvoiceList.invoices?.[rowNumber]?.totalAmount?.formattedValue + ) { + expect(tableCells[3].nativeElement.innerText).toEqual( + mockOrderInvoiceList.invoices?.[rowNumber]?.totalAmount + ?.formattedValue + ); + } else { + expect(tableCells[3].nativeElement.innerHTML).toEqual( + ` ${mockOrderInvoiceList.invoices?.[rowNumber]?.totalAmount?.currencyIso} ${mockOrderInvoiceList.invoices?.[rowNumber]?.totalAmount?.value} ` + ); + } + + expect(!!tableCells[4].query(By.css('cx-icon'))).toEqual( + !!mockOrderInvoiceList.invoices?.[rowNumber] + ); + }); + }); + + it('should download the invoice file', async () => { + const invoicePDF = (mockOrderInvoiceList.invoices && + mockOrderInvoiceList.invoices[0]) || { + invoiceId: '', + externalSystemId: '', + }; + + spyOn(pdfInvoicesFacade, 'getInvoicePDF').and.returnValue(of(blob)); + const fakeUrl = 'blob:http://localhost:4321/15-09-2023-1234'; + spyOn(URL, 'createObjectURL').and.returnValue(fakeUrl); + + expect(invoicePDF).not.toBeUndefined(); + component.downloadPDFInvoice( + invoicePDF.invoiceId || '', + invoicePDF.externalSystemId + ); + fixture.detectChanges(); + + expect(pdfInvoicesFacade.getInvoicePDF).toHaveBeenCalledWith( + invoicePDF.invoiceId, + undefined + ); + + expect(downloadService.download).toHaveBeenCalledWith( + fakeUrl, + `${invoicePDF.invoiceId}.pdf` + ); + }); + + it('should download the attachment file with external system id', async () => { + const invoicePDF = (mockOrderInvoiceList.invoices && + mockOrderInvoiceList.invoices[0]) || { + invoiceId: '', + externalSystemId: '', + }; + + spyOn(pdfInvoicesFacade, 'getInvoicePDF').and.returnValue(of(blob)); + const fakeUrl = 'blob:http://localhost:4321/15-09-2023-1234'; + spyOn(URL, 'createObjectURL').and.returnValue(fakeUrl); + + component.downloadPDFInvoice( + invoicePDF.invoiceId || '', + invoicePDF.externalSystemId + ); + fixture.detectChanges(); + + expect(pdfInvoicesFacade.getInvoicePDF).toHaveBeenCalledWith( + invoicePDF.invoiceId, + invoicePDF.externalSystemId + ); + + expect(downloadService.download).toHaveBeenCalledWith( + fakeUrl, + `${invoicePDF.invoiceId}.pdf` + ); + }); +}); diff --git a/feature-libs/pdf-invoices/components/invoices-list/invoices-list.component.ts b/feature-libs/pdf-invoices/components/invoices-list/invoices-list.component.ts new file mode 100644 index 00000000000..59df4a89e1e --- /dev/null +++ b/feature-libs/pdf-invoices/components/invoices-list/invoices-list.component.ts @@ -0,0 +1,195 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + ChangeDetectionStrategy, + Component, + OnDestroy, + OnInit, +} from '@angular/core'; +import { + ErrorModel, + GlobalMessageService, + GlobalMessageType, + HttpErrorModel, + LanguageService, + PaginationModel, + SortModel, + TranslationService, +} from '@spartacus/core'; +import { + InvoiceQueryParams, + InvoicesFields, + OrderInvoiceList, + PDFInvoicesFacade, +} from '@spartacus/pdf-invoices/root'; +import { FileDownloadService, ICON_TYPE } from '@spartacus/storefront'; +import { + BehaviorSubject, + combineLatest, + EMPTY, + Observable, + Subscription, +} from 'rxjs'; +import { catchError, skip, switchMap, take, tap } from 'rxjs/operators'; + +@Component({ + selector: 'cx-invoices-list', + templateUrl: './invoices-list.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class InvoicesListComponent implements OnInit, OnDestroy { + /* For Enum use in HTML */ + ICON_TYPE = ICON_TYPE; + + protected PAGE_SIZE = 5; //Default page size + + sortOptions: SortModel[]; + sort = 'byInvoiceIdAsc'; + + protected sortMapping: { [key: string]: string } = { + byCreatedAtAsc: 'invoiceDate:asc', //TODO: (CXINT-2438) update the sort code after the API is changed + byCreatedAtDesc: 'invoiceDate:desc', //TODO: (CXINT-2438) update the sort code after the API is changed + byInvoiceIdAsc: 'invoiceId:asc', + byInvoiceIdDesc: 'invoiceId:desc', + byNetAmountAsc: 'netAmount:asc', + byNetAmountDesc: 'netAmount:desc', + byTotalAmountAsc: 'totalAmount:asc', + byTotalAmountDesc: 'totalAmount:desc', + }; + pagination: PaginationModel; + + // Contains the initial query parameters and will be updated with current state of filters + _initQueryParams: InvoiceQueryParams = { + currentPage: 0, + pageSize: this.PAGE_SIZE, + fields: InvoicesFields.FULL, + sort: this.sortMapping[this.sort], //backend supports sort codes like invoiceId:asc + }; + + // Triggers events on chaning the page, sort options + queryParams$ = new BehaviorSubject(this._initQueryParams); + + // Used by template to subscribe to data from documents api + invoicesList$: Observable = this.queryParams$.pipe( + switchMap((param) => this.pdfInvoicesFacade.getInvoicesForOrder(param)), + tap( + (invoicesList) => + (this.pagination = { + currentPage: invoicesList.pagination?.page, + pageSize: invoicesList.pagination?.count, + totalPages: invoicesList.pagination?.totalPages, + totalResults: invoicesList.pagination?.totalCount, + sort: this.sortMapping[this.sort], + }) + ), + catchError((error) => { + if (error && this.getNotEnabledError(error)?.length) { + this.globalMessageService.add( + { key: 'pdfInvoices.featureNotEnabled' }, + GlobalMessageType.MSG_TYPE_ERROR + ); + } + return EMPTY; + }) + ); + + protected subscription = new Subscription(); + + constructor( + protected pdfInvoicesFacade: PDFInvoicesFacade, + protected translationService: TranslationService, + protected downloadService: FileDownloadService, + protected languageService: LanguageService, + protected globalMessageService: GlobalMessageService + ) {} + + ngOnInit() { + this.subscription.add( + this.languageService + .getActive() + .pipe(skip(1)) + .subscribe(() => + this.updateQueryParams({ fields: InvoicesFields.FULL }) + ) + ); + + this.getSortOptions(); + } + + protected updateQueryParams(partialParams: InvoiceQueryParams) { + // Overwrite each value present in partialParams to _queryParams + Object.keys(partialParams).forEach( + (key) => + ((this._initQueryParams as any)[key] = (partialParams as any)[key]) + ); + + // Every request that doesn't specify fields should be set to DEFAULT + if (!partialParams.fields) { + this._initQueryParams.fields = InvoicesFields.DEFAULT; + } + + this.queryParams$.next(this._initQueryParams); + } + + pageChange(currentPage: number): void { + this.updateQueryParams({ + currentPage: currentPage, + }); + } + + sortChange(sortCode: string): void { + this.sort = sortCode; + this.updateQueryParams({ + sort: this.sortMapping[sortCode], //backend supports sort codes like invoiceId:asc + currentPage: 0, + }); + } + + downloadPDFInvoice(invoiceId: string, externalSystemId?: string): void { + this.pdfInvoicesFacade + .getInvoicePDF(invoiceId, externalSystemId) + .pipe(take(1)) + .subscribe({ + next: (data) => { + const file = new Blob([data], { type: data.type }); + const url = URL.createObjectURL(file); + this.downloadService.download(url, `${invoiceId}.pdf`); + }, + }); + } + + getSortOptions() { + this.sortOptions = []; + Object.keys(this.sortMapping).forEach((sortKey) => + this.sortOptions.push({ code: sortKey, selected: false }) + ); + + const translations = this.sortOptions.map((sort) => + this.translationService.translate(`pdfInvoices.sorts.${sort.code}`) + ); + + combineLatest(translations) + .pipe(take(1)) + .subscribe((translated) => + this.sortOptions.forEach( + (sort, index) => (sort.name = translated[index]) + ) + ); + } + + getNotEnabledError(response: HttpErrorModel): ErrorModel[] { + return response?.details + ? response.details.filter( + (error: any) => error?.type === 'UnknownResourceError' + ) + : []; + } + + ngOnDestroy(): void { + this.subscription.unsubscribe(); + } +} diff --git a/feature-libs/pdf-invoices/components/ng-package.json b/feature-libs/pdf-invoices/components/ng-package.json new file mode 100644 index 00000000000..38e01ac17de --- /dev/null +++ b/feature-libs/pdf-invoices/components/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "./public_api.ts" + } +} diff --git a/feature-libs/pdf-invoices/components/pdf-invoices-components.module.ts b/feature-libs/pdf-invoices/components/pdf-invoices-components.module.ts new file mode 100644 index 00000000000..a287b23521e --- /dev/null +++ b/feature-libs/pdf-invoices/components/pdf-invoices-components.module.ts @@ -0,0 +1,51 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { + AuthGuard, + CmsConfig, + I18nModule, + provideDefaultConfig, + UrlModule, +} from '@spartacus/core'; +import { + DatePickerModule, + IconModule, + ListNavigationModule, + MediaModule, + SpinnerModule, +} from '@spartacus/storefront'; +import { InvoicesListComponent } from './invoices-list/invoices-list.component'; + +@NgModule({ + imports: [ + CommonModule, + DatePickerModule, + I18nModule, + ReactiveFormsModule, + ListNavigationModule, + UrlModule, + IconModule, + MediaModule, + SpinnerModule, + ], + declarations: [InvoicesListComponent], + exports: [InvoicesListComponent], + providers: [ + provideDefaultConfig({ + cmsComponents: { + AccountOrderDetailsPDFInvoicesComponent: { + component: InvoicesListComponent, + guards: [AuthGuard], + }, + }, + }), + ], +}) +export class PDFInvoicesComponentsModule {} diff --git a/feature-libs/pdf-invoices/components/public_api.ts b/feature-libs/pdf-invoices/components/public_api.ts new file mode 100644 index 00000000000..cf302ad77cc --- /dev/null +++ b/feature-libs/pdf-invoices/components/public_api.ts @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './invoices-list/invoices-list.component'; +export * from './pdf-invoices-components.module'; diff --git a/feature-libs/pdf-invoices/core/connectors/converters.ts b/feature-libs/pdf-invoices/core/connectors/converters.ts new file mode 100644 index 00000000000..5edf9d429d6 --- /dev/null +++ b/feature-libs/pdf-invoices/core/connectors/converters.ts @@ -0,0 +1,13 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { InjectionToken } from '@angular/core'; +import { Converter } from '@spartacus/core'; +import { OrderInvoiceList } from '@spartacus/pdf-invoices/root'; + +export const PDF_INVOICES_LIST_INVOICES_NORMALIZER = new InjectionToken< + Converter +>('PDFInvoicesListInvoices'); diff --git a/feature-libs/pdf-invoices/core/connectors/index.ts b/feature-libs/pdf-invoices/core/connectors/index.ts new file mode 100644 index 00000000000..d9d500d499a --- /dev/null +++ b/feature-libs/pdf-invoices/core/connectors/index.ts @@ -0,0 +1,9 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './converters'; +export * from './pdf-invoices.adapter'; +export * from './pdf-invoices.connector'; diff --git a/feature-libs/pdf-invoices/core/connectors/pdf-invoices.adapter.ts b/feature-libs/pdf-invoices/core/connectors/pdf-invoices.adapter.ts new file mode 100644 index 00000000000..a9659b4fda8 --- /dev/null +++ b/feature-libs/pdf-invoices/core/connectors/pdf-invoices.adapter.ts @@ -0,0 +1,39 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + InvoiceQueryParams, + OrderInvoiceList, +} from '@spartacus/pdf-invoices/root'; +import { Observable } from 'rxjs'; + +export abstract class PDFInvoicesAdapter { + /** + * Abstract method used to get the PDF invoices for an order + * @param userId Logged in user id + * @param orderId If provided, it will be used, otherwise it will use orderId from router state. + * @param queryParams Additional query parameters used in the API request + */ + abstract getInvoicesForOrder( + userId: string, + orderId: string, + queryParams: InvoiceQueryParams + ): Observable; + + /** + * Returns the document blob for given invoiceId, orderId and externalSystemId + * @param userId Logged in user id + * @param orderId If provided, it will be used, otherwise it will use orderId from router state. + * @param invoiceId The id of the invoice to be downloaded + * @param externalSystemId External system that provides the invoice PDF + */ + abstract getInvoicePDF( + userId: string, + orderId: string, + invoiceId: string, + externalSystemId?: string + ): Observable; +} diff --git a/feature-libs/pdf-invoices/core/connectors/pdf-invoices.connector.spec.ts b/feature-libs/pdf-invoices/core/connectors/pdf-invoices.connector.spec.ts new file mode 100644 index 00000000000..33dca995e83 --- /dev/null +++ b/feature-libs/pdf-invoices/core/connectors/pdf-invoices.connector.spec.ts @@ -0,0 +1,121 @@ +import { TestBed } from '@angular/core/testing'; +import { + InvoiceQueryParams, + InvoicesFields, +} from '@spartacus/pdf-invoices/root'; +import { of } from 'rxjs'; +import { take } from 'rxjs/operators'; +import { PDFInvoicesAdapter } from './pdf-invoices.adapter'; +import { PDFInvoicesConnector } from './pdf-invoices.connector'; + +import createSpy = jasmine.createSpy; + +const mockUserId = 'userId1'; +const mockOrderId = '15092023'; +const mockExternalSystemId = 'IMPERIAL'; +const mockInvoiceId = 'Invoice-15-09-2023'; +const mockInvoiceQueryParams: InvoiceQueryParams = { + currentPage: 0, + pageSize: 10, + sort: 'invoiceID:asc', + fields: InvoicesFields.FULL, +}; + +class MockPDFInvoicesAdapter implements Partial { + getInvoicesForOrder = createSpy( + 'PDFInvoicesAdapter.getInvoicesForOrder' + ).and.callFake( + (_userId: string, _orderId: string, _queryParams: InvoiceQueryParams) => + of({}) + ); + getInvoicePDF = createSpy('PDFInvoicesAdapter.getInvoicePDF').and.callFake( + ( + _userId: string, + _orderId: string, + _invoiceId: string, + _externalSystemId?: string + ) => of({}) + ); +} + +describe('PDFInvoicesConnector', () => { + let pdfInvoicesConnector: PDFInvoicesConnector; + let adapter: PDFInvoicesAdapter; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + providers: [ + PDFInvoicesConnector, + { + provide: PDFInvoicesAdapter, + useClass: MockPDFInvoicesAdapter, + }, + ], + }); + + pdfInvoicesConnector = TestBed.inject(PDFInvoicesConnector); + adapter = TestBed.inject(PDFInvoicesAdapter); + }); + + it('should be created', () => { + expect(pdfInvoicesConnector).toBeTruthy(); + }); + + it('should call adapter when getInvoicesForOrder is invoked', (done) => { + let result; + pdfInvoicesConnector + .getInvoicesForOrder(mockUserId, mockOrderId, mockInvoiceQueryParams) + .pipe(take(1)) + .subscribe((res: any) => { + result = res; + expect(result).toEqual({}); + done(); + }); + expect(adapter.getInvoicesForOrder).toHaveBeenCalledWith( + mockUserId, + mockOrderId, + mockInvoiceQueryParams + ); + }); + + it('should call adapter when getInvoicePDF is invoked', (done) => { + let result; + pdfInvoicesConnector + .getInvoicePDF( + mockUserId, + mockOrderId, + mockInvoiceId, + mockExternalSystemId + ) + .pipe(take(1)) + .subscribe((res: any) => { + result = res; + expect(result).toEqual({}); + done(); + }); + expect(adapter.getInvoicePDF).toHaveBeenCalledWith( + mockUserId, + mockOrderId, + mockInvoiceId, + mockExternalSystemId + ); + }); + + it('should call adapter when getInvoicePDF is invoked without externalSystemId', (done) => { + let result; + pdfInvoicesConnector + .getInvoicePDF(mockUserId, mockOrderId, mockInvoiceId) + .pipe(take(1)) + .subscribe((res: any) => { + result = res; + expect(result).toEqual({}); + done(); + }); + expect(adapter.getInvoicePDF).toHaveBeenCalledWith( + mockUserId, + mockOrderId, + mockInvoiceId, + undefined + ); + }); +}); diff --git a/feature-libs/pdf-invoices/core/connectors/pdf-invoices.connector.ts b/feature-libs/pdf-invoices/core/connectors/pdf-invoices.connector.ts new file mode 100644 index 00000000000..f9493eacc6b --- /dev/null +++ b/feature-libs/pdf-invoices/core/connectors/pdf-invoices.connector.ts @@ -0,0 +1,42 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Injectable } from '@angular/core'; +import { + InvoiceQueryParams, + OrderInvoiceList, +} from '@spartacus/pdf-invoices/root'; +import { Observable } from 'rxjs'; +import { PDFInvoicesAdapter } from './pdf-invoices.adapter'; + +@Injectable({ + providedIn: 'root', +}) +export class PDFInvoicesConnector { + constructor(protected adapter: PDFInvoicesAdapter) {} + + public getInvoicesForOrder( + userId: string, + orderId: string, + queryParams: InvoiceQueryParams + ): Observable { + return this.adapter.getInvoicesForOrder(userId, orderId, queryParams); + } + + public getInvoicePDF( + userId: string, + orderId: string, + invoiceId: string, + externalSystemId?: string + ): Observable { + return this.adapter.getInvoicePDF( + userId, + orderId, + invoiceId, + externalSystemId + ); + } +} diff --git a/feature-libs/pdf-invoices/core/http-interceptors/bad-request/pdf-invoices-badrequest.handler.spec.ts b/feature-libs/pdf-invoices/core/http-interceptors/bad-request/pdf-invoices-badrequest.handler.spec.ts new file mode 100644 index 00000000000..dcb34f903fa --- /dev/null +++ b/feature-libs/pdf-invoices/core/http-interceptors/bad-request/pdf-invoices-badrequest.handler.spec.ts @@ -0,0 +1,96 @@ +import { HttpErrorResponse, HttpRequest } from '@angular/common/http'; +import { TestBed } from '@angular/core/testing'; +import { + GlobalMessageService, + GlobalMessageType, + HttpResponseStatus, +} from '@spartacus/core'; +import { PDFInvoicesBadRequestHandler } from './pdf-invoices-badrequest.handler'; + +class MockGlobalMessageService { + add() {} +} + +const MockRequest = {} as HttpRequest; + +const MockNoOrderIdBadRequestResponse = { + error: { + errors: [ + { + message: + 'Order with guid [15092023] not found for current user in current BaseStore', + type: 'UnknownIdentifierError', + }, + ], + }, +} as HttpErrorResponse; + +const MockDownloadPDFBadRequestResponse = { + error: { + errors: [ + { + message: 'Invoice with id [Imperial] not found for order [15092023]', + type: 'UnknownIdentifierError', + }, + ], + }, +} as HttpErrorResponse; + +describe('PDFInvoicesDateBadRequestHandler', () => { + let pdfInvoicesBRHandler: PDFInvoicesBadRequestHandler; + let globalMessageService: GlobalMessageService; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ + PDFInvoicesBadRequestHandler, + { + provide: GlobalMessageService, + useClass: MockGlobalMessageService, + }, + ], + }); + pdfInvoicesBRHandler = TestBed.inject(PDFInvoicesBadRequestHandler); + globalMessageService = TestBed.inject(GlobalMessageService); + }); + + it('should be created', () => { + expect(pdfInvoicesBRHandler).toBeTruthy(); + }); + + it('should register 400 responseStatus ', () => { + expect(pdfInvoicesBRHandler.responseStatus).toEqual( + HttpResponseStatus.BAD_REQUEST + ); + }); + + it('should handle invalid order id bad request', () => { + spyOn(globalMessageService, 'add'); + pdfInvoicesBRHandler.handleError( + MockRequest, + MockNoOrderIdBadRequestResponse + ); + + expect(globalMessageService.add).toHaveBeenCalledWith( + { + key: 'pdfInvoices.invoicesLoadingError', + }, + GlobalMessageType.MSG_TYPE_ERROR + ); + }); + + it('should handle invoice download bad request', () => { + spyOn(globalMessageService, 'add'); + pdfInvoicesBRHandler.handleError( + MockRequest, + MockDownloadPDFBadRequestResponse + ); + + expect(globalMessageService.add).toHaveBeenCalledWith( + { + key: 'pdfInvoices.downloadPDFError', + }, + GlobalMessageType.MSG_TYPE_ERROR + ); + }); +}); diff --git a/feature-libs/pdf-invoices/core/http-interceptors/bad-request/pdf-invoices-badrequest.handler.ts b/feature-libs/pdf-invoices/core/http-interceptors/bad-request/pdf-invoices-badrequest.handler.ts new file mode 100644 index 00000000000..7451ae27146 --- /dev/null +++ b/feature-libs/pdf-invoices/core/http-interceptors/bad-request/pdf-invoices-badrequest.handler.ts @@ -0,0 +1,91 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { HttpErrorResponse, HttpRequest } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { + ErrorModel, + GlobalMessageType, + HttpErrorHandler, + HttpResponseStatus, + Priority, +} from '@spartacus/core'; + +@Injectable({ + providedIn: 'root', +}) +export class PDFInvoicesBadRequestHandler extends HttpErrorHandler { + responseStatus = HttpResponseStatus.BAD_REQUEST; + + hasMatch(errorResponse: HttpErrorResponse): boolean { + return ( + super.hasMatch(errorResponse) && this.getErrors(errorResponse)?.length > 0 + ); + } + + handleError(request: HttpRequest, response: HttpErrorResponse): void { + this.handleInvoicesListError(request, response); + this.handlePDFDownloadError(request, response); + } + + protected handleInvoicesListError( + _request: HttpRequest, + response: HttpErrorResponse + ) { + this.getErrors(response) + .filter((e) => this.isInvoicesListNotFoundError(e)) + .forEach(() => { + this.globalMessageService.add( + { key: 'pdfInvoices.invoicesLoadingError' }, + GlobalMessageType.MSG_TYPE_ERROR + ); + }); + } + + protected handlePDFDownloadError( + _request: HttpRequest, + response: HttpErrorResponse + ) { + this.getErrors(response) + .filter((e) => this.isDownloadInvoiceError(e)) + .forEach(() => { + this.globalMessageService.add( + { + key: 'pdfInvoices.downloadPDFError', + }, + GlobalMessageType.MSG_TYPE_ERROR + ); + }); + } + + protected isInvoicesListNotFoundError(error: ErrorModel): boolean { + return ( + error?.type === 'UnknownIdentifierError' && + error?.message != null && + error?.message.includes('Order') + ); + } + + protected isDownloadInvoiceError(error: ErrorModel): boolean { + return ( + error?.type === 'UnknownIdentifierError' && + error?.message != null && + error?.message.includes('Invoice') + ); + } + + protected getErrors(response: HttpErrorResponse): ErrorModel[] { + return (response.error?.errors).filter( + (error: any) => + this.isInvoicesListNotFoundError(error) || + this.isDownloadInvoiceError(error) + ); + } + + getPriority(): Priority { + return Priority.NORMAL; + } +} diff --git a/feature-libs/pdf-invoices/core/http-interceptors/index.ts b/feature-libs/pdf-invoices/core/http-interceptors/index.ts new file mode 100644 index 00000000000..90d44b0abd5 --- /dev/null +++ b/feature-libs/pdf-invoices/core/http-interceptors/index.ts @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './bad-request/pdf-invoices-badrequest.handler'; diff --git a/feature-libs/pdf-invoices/core/ng-package.json b/feature-libs/pdf-invoices/core/ng-package.json new file mode 100644 index 00000000000..38e01ac17de --- /dev/null +++ b/feature-libs/pdf-invoices/core/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "./public_api.ts" + } +} diff --git a/feature-libs/pdf-invoices/core/pdf-invoices-core.module.ts b/feature-libs/pdf-invoices/core/pdf-invoices-core.module.ts new file mode 100644 index 00000000000..ba1d175d054 --- /dev/null +++ b/feature-libs/pdf-invoices/core/pdf-invoices-core.module.ts @@ -0,0 +1,30 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { NgModule } from '@angular/core'; +import { HttpErrorHandler } from '@spartacus/core'; +import { PDFInvoicesFacade } from '@spartacus/pdf-invoices/root'; +import { PDFInvoicesConnector } from './connectors/pdf-invoices.connector'; +import { PDFInvoicesBadRequestHandler } from './http-interceptors/bad-request/pdf-invoices-badrequest.handler'; +import { PDFInvoicesService } from './services'; + +@NgModule({ + imports: [], + providers: [ + PDFInvoicesService, + { + provide: PDFInvoicesFacade, + useExisting: PDFInvoicesService, + }, + { + provide: HttpErrorHandler, + useExisting: PDFInvoicesBadRequestHandler, + multi: true, + }, + PDFInvoicesConnector, + ], +}) +export class PDFInvoicesCoreModule {} diff --git a/feature-libs/pdf-invoices/core/public_api.ts b/feature-libs/pdf-invoices/core/public_api.ts new file mode 100644 index 00000000000..210f757f8dd --- /dev/null +++ b/feature-libs/pdf-invoices/core/public_api.ts @@ -0,0 +1,10 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './connectors/index'; +export * from './http-interceptors/index'; +export * from './pdf-invoices-core.module'; +export * from './services/index'; diff --git a/feature-libs/pdf-invoices/core/services/index.ts b/feature-libs/pdf-invoices/core/services/index.ts new file mode 100644 index 00000000000..7eb1d8cce75 --- /dev/null +++ b/feature-libs/pdf-invoices/core/services/index.ts @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './pdf-invoices.service'; diff --git a/feature-libs/pdf-invoices/core/services/pdf-invoices.service.spec.ts b/feature-libs/pdf-invoices/core/services/pdf-invoices.service.spec.ts new file mode 100644 index 00000000000..4901d71386a --- /dev/null +++ b/feature-libs/pdf-invoices/core/services/pdf-invoices.service.spec.ts @@ -0,0 +1,186 @@ +import { TestBed } from '@angular/core/testing'; +import { RoutingService, UserIdService } from '@spartacus/core'; +import { + InvoiceQueryParams, + InvoicesFields, +} from '@spartacus/pdf-invoices/root'; +import { of } from 'rxjs'; +import { take } from 'rxjs/operators'; +import { PDFInvoicesConnector } from '../connectors/pdf-invoices.connector'; +import { PDFInvoicesService } from './pdf-invoices.service'; + +import createSpy = jasmine.createSpy; + +const mockUserId = 'userId1'; +const mockOrderId = '15092023'; +const mockExternalSystemId = 'IMPERIAL'; +const mockInvoiceId = 'Invoice-15-09-2023'; +const mockInvoiceQueryParams: InvoiceQueryParams = { + currentPage: 0, + pageSize: 10, + sort: 'invoiceID:asc', + fields: InvoicesFields.FULL, +}; + +const blob = new Blob(); + +class MockPDFInvoicesConnector implements Partial { + getInvoicesForOrder = createSpy( + 'PDFInvoicesConnector.getInvoicesForOrder' + ).and.callFake( + (_userId: string, _orderId: string, _queryParams: InvoiceQueryParams) => + of({}) + ); + getInvoicePDF = createSpy('PDFInvoicesConnector.getInvoicePDF').and.callFake( + ( + _userId: string, + _orderId: string, + _invoiceId: string, + _externalSystemId?: string + ) => of(blob) + ); +} + +class MockUserIdService implements Partial { + takeUserId = createSpy('UserIdService.takeUserId').and.returnValue( + of(mockUserId) + ); +} + +class MockRoutingService implements Partial { + getRouterState = createSpy('RoutingService.getRouterState').and.returnValue( + of({ + state: { + semanticRoute: 'orders', + params: { orderCode: mockOrderId }, + }, + }) + ); +} + +describe('PDFInvoicesService', () => { + let pdfInvoicesService: PDFInvoicesService; + let connector: PDFInvoicesConnector; + + describe('Current user', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ + PDFInvoicesService, + { + provide: PDFInvoicesConnector, + useClass: MockPDFInvoicesConnector, + }, + { + provide: UserIdService, + useClass: MockUserIdService, + }, + { + provide: RoutingService, + useClass: MockRoutingService, + }, + ], + }); + + pdfInvoicesService = TestBed.inject(PDFInvoicesService); + connector = TestBed.inject(PDFInvoicesConnector); + }); + + it('should be created', () => { + expect(pdfInvoicesService).toBeTruthy(); + }); + + it('should call connector when getInvoicesForOrder is invoked', (done) => { + let result; + pdfInvoicesService + .getInvoicesForOrder(mockInvoiceQueryParams, mockUserId, mockOrderId) + .pipe(take(1)) + .subscribe((res: any) => { + result = res; + expect(result).toEqual({}); + done(); + }); + expect(connector.getInvoicesForOrder).toHaveBeenCalledWith( + mockUserId, + mockOrderId, + mockInvoiceQueryParams + ); + }); + + it('should set userId, orderId and call connector when getInvoicesForOrder is invoked without userId and orderId', (done) => { + let result; + pdfInvoicesService + .getInvoicesForOrder(mockInvoiceQueryParams) + .pipe(take(1)) + .subscribe((res: any) => { + result = res; + expect(result).toEqual({}); + done(); + }); + expect(connector.getInvoicesForOrder).toHaveBeenCalledWith( + mockUserId, + mockOrderId, + mockInvoiceQueryParams + ); + }); + + it('should call connector when getInvoicePDF is invoked', (done) => { + let result; + pdfInvoicesService + .getInvoicePDF( + mockInvoiceId, + mockExternalSystemId, + mockUserId, + mockOrderId + ) + .pipe(take(1)) + .subscribe((res: any) => { + result = res; + expect(result).toEqual(blob); + done(); + }); + expect(connector.getInvoicePDF).toHaveBeenCalledWith( + mockUserId, + mockOrderId, + mockInvoiceId, + mockExternalSystemId + ); + }); + + it('should call connector when getInvoicePDF is invoked without externalSystemId', (done) => { + let result; + pdfInvoicesService + .getInvoicePDF(mockInvoiceId, undefined, mockUserId, mockOrderId) + .pipe(take(1)) + .subscribe((res: any) => { + result = res; + expect(result).toEqual(blob); + done(); + }); + expect(connector.getInvoicePDF).toHaveBeenCalledWith( + mockUserId, + mockOrderId, + mockInvoiceId, + undefined + ); + }); + + it('should set userId, orderId and call connector when getInvoicePDF is invoked without userId, orderId, externalSystemId', (done) => { + let result; + pdfInvoicesService + .getInvoicePDF(mockInvoiceId) + .pipe(take(1)) + .subscribe((res: any) => { + result = res; + expect(result).toEqual(blob); + done(); + }); + expect(connector.getInvoicePDF).toHaveBeenCalledWith( + mockUserId, + mockOrderId, + mockInvoiceId, + undefined + ); + }); + }); +}); diff --git a/feature-libs/pdf-invoices/core/services/pdf-invoices.service.ts b/feature-libs/pdf-invoices/core/services/pdf-invoices.service.ts new file mode 100644 index 00000000000..d643db7d05a --- /dev/null +++ b/feature-libs/pdf-invoices/core/services/pdf-invoices.service.ts @@ -0,0 +1,81 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Injectable, OnDestroy } from '@angular/core'; +import { RoutingService, UserIdService } from '@spartacus/core'; +import { + InvoiceQueryParams, + OrderInvoiceList, + PDFInvoicesFacade, +} from '@spartacus/pdf-invoices/root'; +import { Observable, Subscription } from 'rxjs'; +import { distinctUntilChanged, map, shareReplay } from 'rxjs/operators'; +import { PDFInvoicesConnector } from '../connectors/pdf-invoices.connector'; + +@Injectable() +export class PDFInvoicesService implements PDFInvoicesFacade, OnDestroy { + protected subscriptions = new Subscription(); + + userId: string; + orderId: string; + + constructor( + private routingService: RoutingService, + private userIdService: UserIdService, + protected pdfInvoicesConnector: PDFInvoicesConnector + ) { + this.subscriptions.add( + this.userIdService + .takeUserId() + .subscribe((userId) => (this.userId = userId)) + ); + this.subscriptions.add( + this.getOrderId().subscribe((orderId) => (this.orderId = orderId)) + ); + } + + getInvoicesForOrder( + queryParams: InvoiceQueryParams, + userId?: string, + orderId?: string + ): Observable { + return this.pdfInvoicesConnector + .getInvoicesForOrder( + userId || this.userId, + orderId || this.orderId, + queryParams + ) + .pipe(shareReplay(1)); + } + + getInvoicePDF( + invoiceId: string, + externalSystemId?: string, + userId?: string, + orderId?: string + ): Observable { + return this.pdfInvoicesConnector + .getInvoicePDF( + userId || this.userId, + orderId || this.orderId, + invoiceId, + externalSystemId + ) + .pipe(shareReplay(1)); + } + + protected getOrderId(): Observable { + return this.routingService.getRouterState().pipe( + map((routingData) => routingData.state.params), + distinctUntilChanged(), + map((params) => params.orderCode) + ); + } + + ngOnDestroy(): void { + this.subscriptions.unsubscribe(); + } +} diff --git a/feature-libs/pdf-invoices/jest.schematics.config.js b/feature-libs/pdf-invoices/jest.schematics.config.js new file mode 100644 index 00000000000..85a061c3966 --- /dev/null +++ b/feature-libs/pdf-invoices/jest.schematics.config.js @@ -0,0 +1,35 @@ +const { pathsToModuleNameMapper } = require('ts-jest'); +const { compilerOptions } = require('./tsconfig.schematics.json'); +const { defaultTransformerOptions } = require('jest-preset-angular/presets'); + +/** @type {import('ts-jest/dist/types').JestConfigWithTsJest} */ +module.exports = { + preset: 'jest-preset-angular', + globalSetup: 'jest-preset-angular/global-setup', + moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths || {}, { + prefix: '/', + }), + setupFilesAfterEnv: ['/setup-jest.ts'], + testMatch: ['**/+(*_)+(spec).+(ts)'], + transform: { + '^.+\\.(ts|js|mjs|html|svg)$': [ + 'jest-preset-angular', + { + ...defaultTransformerOptions, + tsconfig: '/tsconfig.schematics.json', + }, + ], + }, + + collectCoverage: false, + coverageReporters: ['json', 'lcov', 'text', 'clover'], + coverageDirectory: '/../../coverage/pdf-invoices/schematics', + coverageThreshold: { + global: { + statements: 90, + branches: 90, + functions: 90, + lines: 90, + }, + }, +}; diff --git a/feature-libs/pdf-invoices/karma.conf.js b/feature-libs/pdf-invoices/karma.conf.js new file mode 100644 index 00000000000..aed99ee7cec --- /dev/null +++ b/feature-libs/pdf-invoices/karma.conf.js @@ -0,0 +1,47 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['parallel', 'jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-parallel'), + require('karma-jasmine'), + require('karma-coverage'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('@angular-devkit/build-angular/plugins/karma'), + ], + parallelOptions: { + executors: 2, + shardStrategy: 'round-robin', + }, + client: { + clearContext: false, // leave Jasmine Spec Runner output visible in browser + jasmine: { + random: false, + }, + }, + reporters: ['progress', 'kjhtml', 'dots'], + coverageReporter: { + dir: require('path').join(__dirname, '../../coverage/pdf-invoices'), + reporters: [{ type: 'lcov', subdir: '.' }, { type: 'text-summary' }], + check: { + global: { + statements: 90, + lines: 90, + branches: 75, + functions: 85, + }, + }, + }, + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true, + }); +}; diff --git a/feature-libs/pdf-invoices/ng-package.json b/feature-libs/pdf-invoices/ng-package.json new file mode 100644 index 00000000000..7ba32570a26 --- /dev/null +++ b/feature-libs/pdf-invoices/ng-package.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/pdf-invoices", + "lib": { + "entryFile": "./public_api.ts" + }, + "assets": ["**/*.scss", "schematics/**/*.json", "schematics/**/*.js"] +} diff --git a/feature-libs/pdf-invoices/occ/adapters/index.ts b/feature-libs/pdf-invoices/occ/adapters/index.ts new file mode 100644 index 00000000000..1b932c5c19b --- /dev/null +++ b/feature-libs/pdf-invoices/occ/adapters/index.ts @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './occ-pdf-invoices.adapter'; diff --git a/feature-libs/pdf-invoices/occ/adapters/occ-pdf-invoices.adapter.spec.ts b/feature-libs/pdf-invoices/occ/adapters/occ-pdf-invoices.adapter.spec.ts new file mode 100644 index 00000000000..440d11c68a4 --- /dev/null +++ b/feature-libs/pdf-invoices/occ/adapters/occ-pdf-invoices.adapter.spec.ts @@ -0,0 +1,251 @@ +import { HttpClient, HttpErrorResponse } from '@angular/common/http'; +import { + HttpClientTestingModule, + HttpTestingController, +} from '@angular/common/http/testing'; +import { TestBed } from '@angular/core/testing'; +import { + HttpErrorModel, + normalizeHttpError, + OccConfig, + OccEndpoints, +} from '@spartacus/core'; +import { + InvoiceQueryParams, + InvoicesFields, + OrderInvoiceList, +} from '@spartacus/pdf-invoices/root'; +import { throwError } from 'rxjs'; +import { take } from 'rxjs/operators'; +import { OccPDFInvoicesAdapter } from './occ-pdf-invoices.adapter'; + +const mockUserId = 'userId1'; +const mockOrderId = '15092023'; +const mockExternalSystemId = 'IMPERIAL'; +const mockInvoiceId = 'Invoice-15-09-2023'; +const mockInvoiceQueryParams: InvoiceQueryParams = { + currentPage: 0, + pageSize: 10, + sort: 'invoiceID:asc', + fields: InvoicesFields.FULL, +}; + +const mockInvoicesList: OrderInvoiceList = { + invoices: [ + { + invoiceId: '123', + externalSystemId: mockExternalSystemId, + createdAt: new Date(), + netAmount: { + currencyIso: 'USD', + value: 123, + }, + totalAmount: { + currencyIso: 'USD', + value: 123, + }, + }, + ], +}; + +const MockOccModuleConfig: OccConfig = { + backend: { + occ: { + baseUrl: '', + prefix: '', + endpoints: { + pdfInvoicesListInvoices: 'users/${userId}/orders/${orderId}/invoices', + pdfInvoicesDownloadInvoicePDF: + 'users/${userId}/orders/${orderId}/invoices/${invoiceId}/download', + } as OccEndpoints, + }, + }, + context: { + baseSite: [''], + }, +}; + +const mockNoOrderIdBadRequestResponse = new HttpErrorResponse({ + error: { + errors: [ + { + message: + 'Order with guid [15092023] not found for current user in current BaseStore', + type: 'UnknownIdentifierError', + }, + ], + }, +}); + +const mockDownloadPDFBadRequestResponse = new HttpErrorResponse({ + error: { + errors: [ + { + message: 'Invoice with id [Imperial] not found for order [15092023]', + type: 'UnknownIdentifierError', + }, + ], + }, +}); + +describe('OccPDFInvoicesAdapter', () => { + let occPDFInvoicesAdapter: OccPDFInvoicesAdapter; + let httpClient: HttpClient; + let httpMock: HttpTestingController; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [ + OccPDFInvoicesAdapter, + { provide: OccConfig, useValue: MockOccModuleConfig }, + ], + }); + occPDFInvoicesAdapter = TestBed.inject(OccPDFInvoicesAdapter); + httpClient = TestBed.inject(HttpClient); + httpMock = TestBed.inject(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + it('should be created', () => { + expect(occPDFInvoicesAdapter).toBeTruthy(); + }); + + describe(`get invoices for an order`, () => { + it(`should show PDF Invoices for given user id, order id`, (done) => { + occPDFInvoicesAdapter + .getInvoicesForOrder(mockUserId, mockOrderId, mockInvoiceQueryParams) + .pipe(take(1)) + .subscribe((result) => { + expect(result).toEqual(mockInvoicesList); + done(); + }); + + const mockReq = httpMock.expectOne((req) => { + return ( + req.method === 'GET' && + req.url === + `users/${mockUserId}/orders/${mockOrderId}/invoices?currentPage=${ + mockInvoiceQueryParams.currentPage + }&pageSize=${ + mockInvoiceQueryParams.pageSize + }&sort=${encodeURIComponent(mockInvoiceQueryParams.sort)}&fields=${ + mockInvoiceQueryParams.fields + }` + ); + }); + + expect(mockReq.cancelled).toBeFalsy(); + mockReq.flush(mockInvoicesList); + expect(mockReq.request.responseType).toEqual('json'); + }); + + it(`should result in error when Error is thrown`, (done) => { + spyOn(httpClient, 'get').and.returnValue( + throwError(mockNoOrderIdBadRequestResponse) + ); + + let result: HttpErrorModel | undefined; + const subscription = occPDFInvoicesAdapter + .getInvoicesForOrder(mockUserId, mockOrderId, mockInvoiceQueryParams) + .pipe(take(1)) + .subscribe({ + error: (err: any) => { + result = err; + done(); + }, + }); + + expect(result).toEqual( + normalizeHttpError(mockNoOrderIdBadRequestResponse) + ); + + subscription.unsubscribe(); + }); + }); + + describe(`get invoice PDF for an invoice id`, () => { + const mockFile: File = new File([], 'MockOrderInvoice', { + type: 'application/pdf', + }); + it(`should download PDF Invoices for given user id, order id`, (done) => { + occPDFInvoicesAdapter + .getInvoicePDF(mockUserId, mockOrderId, mockInvoiceId) + .pipe(take(1)) + .subscribe((result) => { + expect(result).toEqual(mockFile); + done(); + }); + + const mockReq = httpMock.expectOne((req) => { + return ( + req.method === 'GET' && + req.url === + `users/${mockUserId}/orders/${mockOrderId}/invoices/${mockInvoiceId}/download` + ); + }); + + expect(mockReq.cancelled).toBeFalsy(); + expect(mockReq.request.responseType).toEqual('blob'); + mockReq.flush(mockFile); + }); + + it(`should download PDF Invoices for given user id, order id and external system id`, (done) => { + occPDFInvoicesAdapter + .getInvoicePDF( + mockUserId, + mockOrderId, + mockInvoiceId, + mockExternalSystemId + ) + .pipe(take(1)) + .subscribe((result) => { + expect(result).toEqual(mockFile); + done(); + }); + + const mockReq = httpMock.expectOne((req) => { + return ( + req.method === 'GET' && + req.url === + `users/${mockUserId}/orders/${mockOrderId}/invoices/${mockInvoiceId}/download?externalSystemId=${mockExternalSystemId}` + ); + }); + + expect(mockReq.cancelled).toBeFalsy(); + mockReq.flush(mockFile); + expect(mockReq.request.responseType).toEqual('blob'); + }); + + it(`should result in error when Invoice download Error is thrown`, (done) => { + spyOn(httpClient, 'get').and.returnValue( + throwError(mockDownloadPDFBadRequestResponse) + ); + + let result: HttpErrorModel | undefined; + const subscription = occPDFInvoicesAdapter + .getInvoicePDF( + mockUserId, + mockOrderId, + mockInvoiceId, + mockExternalSystemId + ) + .pipe(take(1)) + .subscribe({ + error: (err: any) => { + result = err; + done(); + }, + }); + + expect(result).toEqual( + normalizeHttpError(mockDownloadPDFBadRequestResponse) + ); + + subscription.unsubscribe(); + }); + }); +}); diff --git a/feature-libs/pdf-invoices/occ/adapters/occ-pdf-invoices.adapter.ts b/feature-libs/pdf-invoices/occ/adapters/occ-pdf-invoices.adapter.ts new file mode 100644 index 00000000000..6655d21bd5a --- /dev/null +++ b/feature-libs/pdf-invoices/occ/adapters/occ-pdf-invoices.adapter.ts @@ -0,0 +1,97 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { HttpClient, HttpErrorResponse } from '@angular/common/http'; +import { inject, Injectable } from '@angular/core'; +import { + ConverterService, + LoggerService, + normalizeHttpError, + OccEndpointsService, +} from '@spartacus/core'; +import { + PDFInvoicesAdapter, + PDF_INVOICES_LIST_INVOICES_NORMALIZER, +} from '@spartacus/pdf-invoices/core'; +import { + InvoiceQueryParams, + OrderInvoiceList, +} from '@spartacus/pdf-invoices/root'; +import { Observable, throwError } from 'rxjs'; +import { catchError } from 'rxjs/operators'; + +@Injectable() +export class OccPDFInvoicesAdapter implements PDFInvoicesAdapter { + protected logger = inject(LoggerService); + + constructor( + protected http: HttpClient, + protected occEndpoints: OccEndpointsService, + protected converter: ConverterService + ) {} + + getInvoicesForOrder( + userId: string, + orderId: string, + queryParams: InvoiceQueryParams + ): Observable { + return this.http + .get( + this.buildInvoiceListUrl(userId, orderId, queryParams) + ) + .pipe( + catchError((error: HttpErrorResponse) => + throwError(normalizeHttpError(error, this.logger)) + ), + this.converter.pipeable(PDF_INVOICES_LIST_INVOICES_NORMALIZER) + ); + } + + getInvoicePDF( + userId: string, + orderId: string, + invoiceId: string, + externalSystemId?: string + ): Observable { + const options = { + responseType: 'blob' as 'json', + }; + + return this.http + .get( + this.buildInvoicePDFUrl(userId, orderId, invoiceId, externalSystemId), + options + ) + .pipe( + catchError((error: HttpErrorResponse) => + throwError(normalizeHttpError(error, this.logger)) + ) + ); + } + + private buildInvoiceListUrl( + userId: string, + orderId: string, + queryParams: InvoiceQueryParams + ): string { + return this.occEndpoints.buildUrl('pdfInvoicesListInvoices', { + urlParams: { userId, orderId }, + queryParams, + }); + } + + private buildInvoicePDFUrl( + userId: string, + orderId: string, + invoiceId: string, + externalSystemId?: string + ): string { + return this.occEndpoints.buildUrl('pdfInvoicesDownloadInvoicePDF', { + urlParams: { userId, orderId, invoiceId }, + queryParams: externalSystemId ? { externalSystemId } : undefined, + }); + } +} diff --git a/feature-libs/pdf-invoices/occ/config/default-occ-pdf-invoices-config.ts b/feature-libs/pdf-invoices/occ/config/default-occ-pdf-invoices-config.ts new file mode 100644 index 00000000000..8bd3af1fd8d --- /dev/null +++ b/feature-libs/pdf-invoices/occ/config/default-occ-pdf-invoices-config.ts @@ -0,0 +1,19 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { OccConfig } from '@spartacus/core'; + +export const defaultOccPDFInvoicesConfig: OccConfig = { + backend: { + occ: { + endpoints: { + pdfInvoicesListInvoices: 'users/${userId}/orders/${orderId}/invoices', + pdfInvoicesDownloadInvoicePDF: + 'users/${userId}/orders/${orderId}/invoices/${invoiceId}/download', + }, + }, + }, +}; diff --git a/feature-libs/pdf-invoices/occ/model/index.ts b/feature-libs/pdf-invoices/occ/model/index.ts new file mode 100644 index 00000000000..7627afce6a4 --- /dev/null +++ b/feature-libs/pdf-invoices/occ/model/index.ts @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +// Imported for side effects (module augmentation) +import './occ-pdf-invoices.model'; diff --git a/feature-libs/pdf-invoices/occ/model/occ-pdf-invoices.model.ts b/feature-libs/pdf-invoices/occ/model/occ-pdf-invoices.model.ts new file mode 100644 index 00000000000..c7665f3fdaa --- /dev/null +++ b/feature-libs/pdf-invoices/occ/model/occ-pdf-invoices.model.ts @@ -0,0 +1,27 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { OccEndpoint } from '@spartacus/core'; + +declare module '@spartacus/core' { + interface OccEndpoints { + /** + * Get the list of invoices for an order + * + * @member {string} [pdfInvoicesListInvoices] + */ + + pdfInvoicesListInvoices?: string | OccEndpoint; + + /** + * Get the invoice document as a PDF file + * + * @member {string} [pdfInvoicesDownloadInvoicePDF] + */ + + pdfInvoicesDownloadInvoicePDF?: string | OccEndpoint; + } +} diff --git a/feature-libs/pdf-invoices/occ/ng-package.json b/feature-libs/pdf-invoices/occ/ng-package.json new file mode 100644 index 00000000000..38e01ac17de --- /dev/null +++ b/feature-libs/pdf-invoices/occ/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "./public_api.ts" + } +} diff --git a/feature-libs/pdf-invoices/occ/pdf-invoices-occ.module.ts b/feature-libs/pdf-invoices/occ/pdf-invoices-occ.module.ts new file mode 100644 index 00000000000..11568e8402e --- /dev/null +++ b/feature-libs/pdf-invoices/occ/pdf-invoices-occ.module.ts @@ -0,0 +1,24 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { provideDefaultConfig } from '@spartacus/core'; +import { PDFInvoicesAdapter } from '@spartacus/pdf-invoices/core'; +import { OccPDFInvoicesAdapter } from './adapters/occ-pdf-invoices.adapter'; +import { defaultOccPDFInvoicesConfig } from './config/default-occ-pdf-invoices-config'; + +@NgModule({ + imports: [CommonModule], + providers: [ + provideDefaultConfig(defaultOccPDFInvoicesConfig), + { + provide: PDFInvoicesAdapter, + useClass: OccPDFInvoicesAdapter, + }, + ], +}) +export class PDFInvoicesOccModule {} diff --git a/feature-libs/pdf-invoices/occ/public_api.ts b/feature-libs/pdf-invoices/occ/public_api.ts new file mode 100644 index 00000000000..a2e4710de7a --- /dev/null +++ b/feature-libs/pdf-invoices/occ/public_api.ts @@ -0,0 +1,9 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './adapters/index'; +export * from './model/index'; +export * from './pdf-invoices-occ.module'; diff --git a/feature-libs/pdf-invoices/package.json b/feature-libs/pdf-invoices/package.json new file mode 100644 index 00000000000..18aa684ce24 --- /dev/null +++ b/feature-libs/pdf-invoices/package.json @@ -0,0 +1,42 @@ +{ + "name": "@spartacus/pdf-invoices", + "version": "6.3.0-1", + "description": "Invoices library for Spartacus", + "keywords": [ + "spartacus", + "framework", + "storefront", + "pdf-invoices" + ], + "homepage": "https://github.com/SAP/spartacus", + "repository": "https://github.com/SAP/spartacus/tree/develop/feature-libs/pdf-invoices", + "license": "Apache-2.0", + "exports": { + ".": { + "sass": "./_index.scss" + } + }, + "scripts": { + "build:schematics": "npm run clean:schematics && ../../node_modules/.bin/tsc -p ./tsconfig.schematics.json", + "clean:schematics": "../../node_modules/.bin/rimraf --glob \"schematics/**/*.js\" \"schematics/**/*.js.map\" \"schematics/**/*.d.ts\"", + "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" + }, + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@angular-devkit/schematics": "^15.2.4", + "@angular/common": "^15.2.4", + "@angular/core": "^15.2.4", + "@angular/forms": "^15.2.4", + "@spartacus/core": "6.3.0-1", + "@spartacus/schematics": "6.3.0-1", + "@spartacus/storefront": "6.3.0-1", + "@spartacus/styles": "6.3.0-1", + "rxjs": "^6.6.0" + }, + "publishConfig": { + "access": "public" + }, + "schematics": "./schematics/collection.json" +} diff --git a/feature-libs/pdf-invoices/pdf-invoices.module.ts b/feature-libs/pdf-invoices/pdf-invoices.module.ts new file mode 100644 index 00000000000..db2440d4336 --- /dev/null +++ b/feature-libs/pdf-invoices/pdf-invoices.module.ts @@ -0,0 +1,20 @@ +/* + * SPDX-FileCopyrightText: 2022 SAP Spartacus team + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { NgModule } from '@angular/core'; +import { PDFInvoicesComponentsModule } from '@spartacus/pdf-invoices/components'; +import { PDFInvoicesCoreModule } from '@spartacus/pdf-invoices/core'; +import { PDFInvoicesOccModule } from '@spartacus/pdf-invoices/occ'; + +@NgModule({ + imports: [ + PDFInvoicesComponentsModule, + PDFInvoicesCoreModule, + PDFInvoicesOccModule, + ], +}) +export class PDFInvoicesModule {} diff --git a/feature-libs/pdf-invoices/project.json b/feature-libs/pdf-invoices/project.json new file mode 100644 index 00000000000..1221fe4d75d --- /dev/null +++ b/feature-libs/pdf-invoices/project.json @@ -0,0 +1,40 @@ +{ + "name": "pdf-invoices", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "library", + "sourceRoot": "feature-libs/pdf-invoices", + "prefix": "cx", + "targets": { + "build": { + "executor": "./tools/build-lib:augmented-types", + "options": { + "tsConfig": "feature-libs/pdf-invoices/tsconfig.lib.json", + "project": "feature-libs/pdf-invoices/ng-package.json" + }, + "configurations": { + "production": { + "tsConfig": "feature-libs/pdf-invoices/tsconfig.lib.prod.json" + } + } + }, + "test": { + "executor": "@angular-devkit/build-angular:karma", + "options": { + "main": "feature-libs/pdf-invoices/test.ts", + "tsConfig": "feature-libs/pdf-invoices/tsconfig.spec.json", + "polyfills": ["zone.js", "zone.js/testing"], + "karmaConfig": "feature-libs/pdf-invoices/karma.conf.js" + } + }, + "lint": { + "executor": "@angular-eslint/builder:lint", + "options": { + "lintFilePatterns": [ + "feature-libs/pdf-invoices/**/*.ts", + "feature-libs/pdf-invoices/**/*.html" + ] + } + } + }, + "tags": ["type:feature"] +} diff --git a/feature-libs/pdf-invoices/public_api.ts b/feature-libs/pdf-invoices/public_api.ts new file mode 100644 index 00000000000..6ee849cfe47 --- /dev/null +++ b/feature-libs/pdf-invoices/public_api.ts @@ -0,0 +1,10 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/* + * Public API Surface of pdf-invoices + */ +export * from './pdf-invoices.module'; diff --git a/feature-libs/pdf-invoices/root/facade/index.ts b/feature-libs/pdf-invoices/root/facade/index.ts new file mode 100644 index 00000000000..8cadd659ae0 --- /dev/null +++ b/feature-libs/pdf-invoices/root/facade/index.ts @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './pdf-invoices.facade'; diff --git a/feature-libs/pdf-invoices/root/facade/pdf-invoices.facade.ts b/feature-libs/pdf-invoices/root/facade/pdf-invoices.facade.ts new file mode 100644 index 00000000000..140f23fd448 --- /dev/null +++ b/feature-libs/pdf-invoices/root/facade/pdf-invoices.facade.ts @@ -0,0 +1,54 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Injectable } from '@angular/core'; +import { facadeFactory } from '@spartacus/core'; +import { Observable } from 'rxjs'; +import { PDF_INVOICES_FEATURE } from '../feature-name'; +import { + InvoiceQueryParams, + OrderInvoiceList, +} from '../model/pdf-invoices.model'; + +export function pdfInvoicesFacadeFactory() { + return facadeFactory({ + facade: PDFInvoicesFacade, + feature: PDF_INVOICES_FEATURE, + methods: ['getInvoicesForOrder', 'getInvoicePDF'], + }); +} + +@Injectable({ + providedIn: 'root', + useFactory: pdfInvoicesFacadeFactory, +}) +export abstract class PDFInvoicesFacade { + /** + * Abstract method used to get the PDF invoices for an order + * @param userId Logged in user id + * @param orderId If provided, it will be used, otherwise it will use orderId from router state. + * @param queryParams Additional query parameters used in the API request + */ + abstract getInvoicesForOrder( + queryParams: InvoiceQueryParams, + userId?: string, + orderId?: string + ): Observable; + + /** + * Returns the document blob for given invoiceId, orderId and externalSystemId + * @param userId Logged in user id + * @param orderId If provided, it will be used, otherwise it will use orderId from router state. + * @param invoiceId The id of the invoice to be downloaded + * @param externalSystemId External system that provides the invoice PDF + */ + abstract getInvoicePDF( + invoiceId: string, + externalSystemId?: string, + userId?: string, + orderId?: string + ): Observable; +} diff --git a/feature-libs/pdf-invoices/root/feature-name.ts b/feature-libs/pdf-invoices/root/feature-name.ts new file mode 100644 index 00000000000..d2a42807361 --- /dev/null +++ b/feature-libs/pdf-invoices/root/feature-name.ts @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export const PDF_INVOICES_FEATURE = 'pdfInvoices'; +export const PDF_INVOICES_CORE_FEATURE = 'pdfInvoicesCore'; diff --git a/feature-libs/pdf-invoices/root/model/index.ts b/feature-libs/pdf-invoices/root/model/index.ts new file mode 100644 index 00000000000..d81983e9057 --- /dev/null +++ b/feature-libs/pdf-invoices/root/model/index.ts @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './pdf-invoices.model'; diff --git a/feature-libs/pdf-invoices/root/model/pdf-invoices.model.ts b/feature-libs/pdf-invoices/root/model/pdf-invoices.model.ts new file mode 100644 index 00000000000..dfede29f369 --- /dev/null +++ b/feature-libs/pdf-invoices/root/model/pdf-invoices.model.ts @@ -0,0 +1,50 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +interface Amount { + currencyIso?: string; + value?: number; + formattedValue?: string; +} + +export enum InvoicesFields { + BASIC = 'BASIC', + DEFAULT = 'DEFAULT', + FULL = 'FULL', +} + +export interface OrderInvoice { + invoiceId: string; + externalSystemId?: string; + createdAt: Date; + netAmount: Amount; + totalAmount: Amount; +} + +export interface OrderInvoiceList { + invoices?: OrderInvoice[]; + pagination?: Pagination; + sorts?: Sort[]; +} + +export interface InvoiceQueryParams { + currentPage?: number; + pageSize?: number; + sort?: string; + fields?: InvoicesFields; +} + +interface Sort { + asc?: boolean; + code?: string; +} + +interface Pagination { + count?: number; + page?: number; + totalCount?: number; + totalPages?: number; +} diff --git a/feature-libs/pdf-invoices/root/ng-package.json b/feature-libs/pdf-invoices/root/ng-package.json new file mode 100644 index 00000000000..38e01ac17de --- /dev/null +++ b/feature-libs/pdf-invoices/root/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "lib": { + "entryFile": "./public_api.ts" + } +} diff --git a/feature-libs/pdf-invoices/root/pdf-invoices-root.module.ts b/feature-libs/pdf-invoices/root/pdf-invoices-root.module.ts new file mode 100644 index 00000000000..b5d80f34844 --- /dev/null +++ b/feature-libs/pdf-invoices/root/pdf-invoices-root.module.ts @@ -0,0 +1,34 @@ +/* + * SPDX-FileCopyrightText: 2022 SAP Spartacus team + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { NgModule } from '@angular/core'; +import { CmsConfig, provideDefaultConfigFactory } from '@spartacus/core'; +import { + PDF_INVOICES_CORE_FEATURE, + PDF_INVOICES_FEATURE, +} from './feature-name'; + +export function defaultRequestedDeliveryDateComponentsConfig(): CmsConfig { + const config: CmsConfig = { + featureModules: { + [PDF_INVOICES_FEATURE]: { + cmsComponents: ['AccountOrderDetailsPDFInvoicesComponent'], + }, + // by default core is bundled together with components + [PDF_INVOICES_CORE_FEATURE]: PDF_INVOICES_FEATURE, + }, + }; + + return config; +} + +@NgModule({ + providers: [ + provideDefaultConfigFactory(defaultRequestedDeliveryDateComponentsConfig), + ], +}) +export class PDFInvoicesRootModule {} diff --git a/feature-libs/pdf-invoices/root/public_api.ts b/feature-libs/pdf-invoices/root/public_api.ts new file mode 100644 index 00000000000..071a714f4b0 --- /dev/null +++ b/feature-libs/pdf-invoices/root/public_api.ts @@ -0,0 +1,10 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './facade/index'; +export * from './feature-name'; +export * from './model/index'; +export * from './pdf-invoices-root.module'; diff --git a/feature-libs/pdf-invoices/schematics/.gitignore b/feature-libs/pdf-invoices/schematics/.gitignore new file mode 100644 index 00000000000..c88f4d69e15 --- /dev/null +++ b/feature-libs/pdf-invoices/schematics/.gitignore @@ -0,0 +1,18 @@ +# Outputs +**/*.js +**/*.js.map +**/*.d.ts + +# IDEs +.idea/ +jsconfig.json +.vscode/ + +# Misc +node_modules/ +npm-debug.log* +yarn-error.log* + +# Mac OSX Finder files. +**/.DS_Store +.DS_Store diff --git a/feature-libs/pdf-invoices/schematics/add-pdf-invoices/__snapshots__/index_spec.ts.snap b/feature-libs/pdf-invoices/schematics/add-pdf-invoices/__snapshots__/index_spec.ts.snap new file mode 100644 index 00000000000..3cd99de4d80 --- /dev/null +++ b/feature-libs/pdf-invoices/schematics/add-pdf-invoices/__snapshots__/index_spec.ts.snap @@ -0,0 +1,130 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Spartacus PDF Invoices schematics: ng-add PDF Invoices feature eager loading should import appropriate modules 1`] = `""`; + +exports[`Spartacus PDF Invoices schematics: ng-add PDF Invoices feature general setup should add the feature using the lazy loading syntax 1`] = `""`; + +exports[`Spartacus PDF Invoices schematics: ng-add PDF Invoices feature general setup styling should create a proper scss file 1`] = ` +"@import "../../styles-config"; +@import "@spartacus/pdf-invoices"; +" +`; + +exports[`Spartacus PDF Invoices schematics: ng-add PDF Invoices feature general setup styling should update angular.json 1`] = ` +"{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "", + "projects": { + "schematics-test": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/schematics-test", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": [ + "zone.js" + ], + "tsConfig": "tsconfig.app.json", + "inlineStyleLanguage": "scss", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "src/styles.scss", + "src/styles/spartacus/pdf-invoices.scss" + ], + "scripts": [], + "stylePreprocessorOptions": { + "includePaths": [ + "node_modules/" + ] + } + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "2.5mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all" + }, + "development": { + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "browserTarget": "schematics-test:build:production" + }, + "development": { + "browserTarget": "schematics-test:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "schematics-test:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "polyfills": [ + "zone.js", + "zone.js/testing" + ], + "tsConfig": "tsconfig.spec.json", + "inlineStyleLanguage": "scss", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "src/styles.scss", + "src/styles/spartacus/pdf-invoices.scss" + ], + "scripts": [], + "stylePreprocessorOptions": { + "includePaths": [ + "node_modules/" + ] + } + } + } + } + } + } +}" +`; diff --git a/feature-libs/pdf-invoices/schematics/add-pdf-invoices/index.ts b/feature-libs/pdf-invoices/schematics/add-pdf-invoices/index.ts new file mode 100644 index 00000000000..5a246702af3 --- /dev/null +++ b/feature-libs/pdf-invoices/schematics/add-pdf-invoices/index.ts @@ -0,0 +1,46 @@ +/* + * SPDX-FileCopyrightText: 2022 SAP Spartacus team + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + chain, + Rule, + SchematicContext, + Tree, +} from '@angular-devkit/schematics'; +import { + addFeatures, + addPackageJsonDependenciesForLibrary, + analyzeApplication, + analyzeCrossFeatureDependencies, + finalizeInstallation, + LibraryOptions as SpartacusPDFInvoicesOptions, + readPackageJson, + validateSpartacusInstallation, +} from '@spartacus/schematics'; +import { peerDependencies } from '../../package.json'; + +export function addPDFInvoicesFeature( + options: SpartacusPDFInvoicesOptions +): Rule { + return (tree: Tree, _context: SchematicContext): Rule => { + const packageJson = readPackageJson(tree); + validateSpartacusInstallation(packageJson); + + const features = analyzeCrossFeatureDependencies( + options.features as string[] + ); + + return chain([ + analyzeApplication(options, features), + + addFeatures(options, features), + addPackageJsonDependenciesForLibrary(peerDependencies, options), + + finalizeInstallation(options, features), + ]); + }; +} diff --git a/feature-libs/pdf-invoices/schematics/add-pdf-invoices/index_spec.ts b/feature-libs/pdf-invoices/schematics/add-pdf-invoices/index_spec.ts new file mode 100644 index 00000000000..2657523862e --- /dev/null +++ b/feature-libs/pdf-invoices/schematics/add-pdf-invoices/index_spec.ts @@ -0,0 +1,174 @@ +/// + +import { + SchematicTestRunner, + UnitTestTree, +} from '@angular-devkit/schematics/testing'; +import { + Schema as ApplicationOptions, + Style, +} from '@schematics/angular/application/schema'; +import { Schema as WorkspaceOptions } from '@schematics/angular/workspace/schema'; +import { + LibraryOptions as PDFInvoicesOptions, + pdfInvoicesFeatureModulePath, + PDF_INVOICES_FEATURE_NAME, + SpartacusOptions, + SPARTACUS_PDF_INVOICES, + SPARTACUS_SCHEMATICS, +} from '@spartacus/schematics'; +import * as path from 'path'; +import { peerDependencies } from '../../package.json'; + +const collectionPath = path.join(__dirname, '../collection.json'); +const scssFilePath = 'src/styles/spartacus/pdf-invoices.scss'; + +describe('Spartacus PDF Invoices schematics: ng-add', () => { + const schematicRunner = new SchematicTestRunner( + SPARTACUS_PDF_INVOICES, + collectionPath + ); + + let appTree: UnitTestTree; + + const workspaceOptions: WorkspaceOptions = { + name: 'workspace', + version: '0.5.0', + }; + + const appOptions: ApplicationOptions = { + name: 'schematics-test', + inlineStyle: false, + inlineTemplate: false, + routing: false, + style: Style.Scss, + skipTests: false, + projectRoot: '', + }; + + const spartacusDefaultOptions: SpartacusOptions = { + project: 'schematics-test', + lazy: true, + features: [], + }; + + const libraryNoFeaturesOptions: PDFInvoicesOptions = { + project: 'schematics-test', + lazy: true, + features: [], + }; + + const rddOptions: PDFInvoicesOptions = { + ...libraryNoFeaturesOptions, + features: [PDF_INVOICES_FEATURE_NAME], + }; + + beforeEach(async () => { + schematicRunner.registerCollection( + SPARTACUS_SCHEMATICS, + '../../projects/schematics/src/collection.json' + ); + + appTree = await schematicRunner.runExternalSchematic( + '@schematics/angular', + 'workspace', + workspaceOptions + ); + + appTree = await schematicRunner.runExternalSchematic( + '@schematics/angular', + 'application', + appOptions, + appTree + ); + + appTree = await schematicRunner.runExternalSchematic( + SPARTACUS_SCHEMATICS, + 'ng-add', + { ...spartacusDefaultOptions, name: 'schematics-test' }, + appTree + ); + }); + + describe('Without features', () => { + beforeEach(async () => { + appTree = await schematicRunner.runSchematic( + 'ng-add', + libraryNoFeaturesOptions, + appTree + ); + }); + + it('should not create any of the feature modules', () => { + expect(appTree.exists(pdfInvoicesFeatureModulePath)).toBeFalsy(); + }); + + it('should install necessary Spartacus libraries', () => { + const packageJson = JSON.parse(appTree.readContent('package.json')); + let dependencies: Record = {}; + dependencies = { ...packageJson.dependencies }; + dependencies = { ...dependencies, ...packageJson.devDependencies }; + + for (const toAdd in peerDependencies) { + // skip the SPARTACUS_SCHEMATICS, as those are added only when running by the Angular CLI, and not in the testing environment + if ( + !peerDependencies.hasOwnProperty(toAdd) || + toAdd === SPARTACUS_SCHEMATICS + ) { + continue; + } + // TODO: after 4.0: use this test, as we'll have synced versions between lib's and root package.json + // const expectedVersion = (peerDependencies as Record< + // string, + // string + // >)[toAdd]; + const expectedDependency = dependencies[toAdd]; + expect(expectedDependency).toBeTruthy(); + } + }); + }); + + describe('PDF Invoices feature', () => { + describe('general setup', () => { + beforeEach(async () => { + appTree = await schematicRunner.runSchematic( + 'ng-add', + rddOptions, + appTree + ); + }); + + it('should add the feature using the lazy loading syntax', async () => { + const module = appTree.readContent(pdfInvoicesFeatureModulePath); + expect(module).toMatchSnapshot(); + }); + + describe('styling', () => { + it('should create a proper scss file', () => { + const scssContent = appTree.readContent(scssFilePath); + expect(scssContent).toMatchSnapshot(); + }); + + it('should update angular.json', async () => { + const content = appTree.readContent('/angular.json'); + expect(content).toMatchSnapshot(); + }); + }); + }); + + describe('eager loading', () => { + beforeEach(async () => { + appTree = await schematicRunner.runSchematic( + 'ng-add', + { ...rddOptions, lazy: false }, + appTree + ); + }); + + it('should import appropriate modules', async () => { + const module = appTree.readContent(pdfInvoicesFeatureModulePath); + expect(module).toMatchSnapshot(); + }); + }); + }); +}); diff --git a/feature-libs/pdf-invoices/schematics/add-pdf-invoices/schema.json b/feature-libs/pdf-invoices/schematics/add-pdf-invoices/schema.json new file mode 100644 index 00000000000..5940aa3c67f --- /dev/null +++ b/feature-libs/pdf-invoices/schematics/add-pdf-invoices/schema.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json-schema.org/schema", + "$id": "PDFInvoicesSchematics", + "title": "PDF Invoices Schematics", + "type": "object", + "properties": { + "project": { + "type": "string", + "description": "The name of the project.", + "$default": { + "$source": "projectName" + } + }, + "debug": { + "description": "Display additional details during the running process.", + "type": "boolean", + "default": false + }, + "lazy": { + "type": "boolean", + "description": "Lazy load the PDF Invoices library.", + "default": true + }, + "features": { + "type": "array", + "uniqueItems": true, + "default": ["PDF-Invoices"] + } + }, + "required": [] +} diff --git a/feature-libs/pdf-invoices/schematics/collection.json b/feature-libs/pdf-invoices/schematics/collection.json new file mode 100644 index 00000000000..a77410d0e50 --- /dev/null +++ b/feature-libs/pdf-invoices/schematics/collection.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../../node_modules/@angular-devkit/schematics/collection-schema.json", + "schematics": { + "ng-add": { + "factory": "./add-pdf-invoices/index#addPDFInvoicesFeature", + "description": "Add PDF Invoices feature", + "schema": "./add-pdf-invoices/schema.json", + "private": true, + "hidden": true, + "aliases": ["install"] + }, + "add": { + "factory": "./add-pdf-invoices/index#addPDFInvoicesFeature", + "description": "Add and configure PDF Invoices feature", + "schema": "./add-pdf-invoices/schema.json" + } + } +} diff --git a/feature-libs/pdf-invoices/setup-jest.ts b/feature-libs/pdf-invoices/setup-jest.ts new file mode 100644 index 00000000000..919fe8743ac --- /dev/null +++ b/feature-libs/pdf-invoices/setup-jest.ts @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import 'jest-preset-angular/setup-jest'; +import 'zone.js'; diff --git a/feature-libs/pdf-invoices/styles/_index.scss b/feature-libs/pdf-invoices/styles/_index.scss new file mode 100644 index 00000000000..17c0aa6bccd --- /dev/null +++ b/feature-libs/pdf-invoices/styles/_index.scss @@ -0,0 +1 @@ +@import './pdf-invoices'; diff --git a/feature-libs/pdf-invoices/styles/_pdf-invoices.scss b/feature-libs/pdf-invoices/styles/_pdf-invoices.scss new file mode 100644 index 00000000000..2c572e9181e --- /dev/null +++ b/feature-libs/pdf-invoices/styles/_pdf-invoices.scss @@ -0,0 +1,237 @@ +cx-invoices-list { + .cx-invoices-list { + @include media-breakpoint-down(md) { + max-width: 100%; + padding: 0; + } + } + + .cx-invoices-list-table { + padding: 1.5rem 0 1.125rem 0; + margin-bottom: 0; + border-top: 1px solid var(--cx-color-light); + border-bottom: 1px solid var(--cx-color-light); + + th { + padding: 1.5rem 0 1.125rem 0; + text-align: start; + + &:last-child { + text-align: end; + } + } + + td { + padding: 1.625rem 0; + + @include media-breakpoint-up(md) { + text-align: start; + } + + @include media-breakpoint-down(md) { + width: 100%; + display: flex; + border-width: 0; + padding: 0 1.25rem; + + &:first-child { + padding-top: 1.25rem; + } + + &:last-child { + padding-bottom: 1.25rem; + } + } + } + } + + .cx-invoices-list-header { + padding: 40px 0 0 0; + color: var(--cx-color-text); + + @include media-breakpoint-down(md) { + padding-top: 40px; + padding-inline-end: 20px; + padding-bottom: 0; + padding-inline-start: 20px; + } + } + + .cx-invoices-list-thead-mobile { + @include media-breakpoint-down(md) { + display: none; + } + } + + .cx-invoices-list-code { + .cx-invoices-list-value { + text-decoration: none; + } + } + + .cx-invoices-list-externalSystem { + .cx-invoices-list-value { + text-decoration: none; + } + } + + .cx-invoices-list-attachment { + .cx-invoices-list-value { + text-decoration: underline; + text-align: end; + color: var(--cx-color-primary); + } + } + + .cx-invoices-list-date { + text-align: center; + + @include media-breakpoint-down(md) { + text-align: start; + } + } + + .cx-invoices-list-status { + text-align: center; + text-transform: capitalize; + + @include media-breakpoint-down(md) { + text-align: start; + } + + .status-open { + color: var(--cx-color-success); + } + + .status-closed { + color: var(--cx-color-secondary); + } + } + + .cx-invoices-list-monetary { + text-align: end; + + @include media-breakpoint-down(md) { + text-align: start; + } + } + + .cx-invoices-list-label { + color: var(--cx-color-secondary); + + @include media-breakpoint-up(lg) { + display: none; + } + + @include media-breakpoint-down(md) { + @include type('8'); + min-width: 200px; + min-height: 48px; + } + } + + .cx-invoices-list-value { + color: var(--cx-color-text); + + @include media-breakpoint-down(md) { + @include type('5'); + font-weight: $font-weight-normal; + } + } + + .cx-invoices-list-form-group { + padding: 0; + margin-bottom: 0; + align-items: center; + display: flex; + width: 40%; + + span { + margin-inline-end: 0.5rem; + flex: none; + } + + cx-sorting { + width: 100%; + } + + @include media-breakpoint-down(md) { + padding: 1.25rem; + width: 100%; + } + } + + .cx-invoices-list-sort { + &.top { + display: flex; + justify-content: space-between; + padding: 1rem 0; + margin: 0; + + @include media-breakpoint-down(md) { + flex-direction: column; + padding-top: 0; + } + } + + &.bottom { + display: flex; + justify-content: flex-end; + padding: 1rem 0 1rem 0; + margin: 0; + + @include media-breakpoint-down(sm) { + flex-direction: column; + } + } + } + + .cx-invoices-list-pagination { + @include media-breakpoint-down(md) { + margin: 0 auto; + } + } + + .cx-invoices-list-no-document { + display: flex; + flex-wrap: wrap; + @include type('5'); + font-weight: $font-weight-normal; + min-height: 415px; + padding-top: 2rem; + border-top: 1px solid var(--cx-color-light); + justify-content: center; + + @include media-breakpoint-down(sm) { + min-height: 474px; + padding-inline-start: 1.25rem; + padding-inline-end: 1.25rem; + } + } + + .cx-invoices-list-row { + &:nth-child(odd) { + @include media-breakpoint-down(md) { + background-color: var(--cx-color-background); + } + } + } + + .cx-invoices-list-attachment-btn { + color: var(--cx-color-primary); + background-color: inherit; + border: 0; + } + + .cx-invoices-list-attachment-icon { + font-size: 1.4rem; + } + + .cx-invoices-list-attachment-text { + font-weight: var(--cx-font-weight-bold); + padding-inline-start: 0.5rem; + @include media-breakpoint-up(lg) { + display: none; + } + } +} diff --git a/feature-libs/pdf-invoices/test.ts b/feature-libs/pdf-invoices/test.ts new file mode 100644 index 00000000000..bd3bae74074 --- /dev/null +++ b/feature-libs/pdf-invoices/test.ts @@ -0,0 +1,22 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting, +} from '@angular/platform-browser-dynamic/testing'; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting(), + { + teardown: { destroyAfterEach: false }, + } +); diff --git a/feature-libs/pdf-invoices/tsconfig.lib.json b/feature-libs/pdf-invoices/tsconfig.lib.json new file mode 100644 index 00000000000..e36a15b522e --- /dev/null +++ b/feature-libs/pdf-invoices/tsconfig.lib.json @@ -0,0 +1,33 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/lib", + "declarationMap": true, + "forceConsistentCasingInFileNames": true, + "target": "es2020", + "module": "es2020", + "moduleResolution": "node", + "declaration": true, + "sourceMap": true, + "inlineSources": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "importHelpers": true, + "types": [], + "lib": ["dom", "esnext"], + "strict": true, + "paths": { + "@spartacus/core": ["dist/core"], + "@spartacus/storefront": ["dist/storefrontlib"] + } + }, + "angularCompilerOptions": { + "skipTemplateCodegen": true, + "strictMetadataEmit": true, + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true, + "enableResourceInlining": true, + "strictInputAccessModifiers": true + }, + "exclude": ["test.ts", "setup-jest.ts", "**/*.spec.ts"] +} diff --git a/feature-libs/pdf-invoices/tsconfig.lib.prod.json b/feature-libs/pdf-invoices/tsconfig.lib.prod.json new file mode 100644 index 00000000000..0d1bf3896fa --- /dev/null +++ b/feature-libs/pdf-invoices/tsconfig.lib.prod.json @@ -0,0 +1,11 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ + +{ + "extends": "./tsconfig.lib.json", + "compilerOptions": { + "declarationMap": false + }, + "angularCompilerOptions": { + "compilationMode": "partial" + } +} diff --git a/feature-libs/pdf-invoices/tsconfig.schematics.json b/feature-libs/pdf-invoices/tsconfig.schematics.json new file mode 100644 index 00000000000..125e28e522d --- /dev/null +++ b/feature-libs/pdf-invoices/tsconfig.schematics.json @@ -0,0 +1,557 @@ +{ + "compilerOptions": { + "baseUrl": "./", + "module": "CommonJs", + "types": ["jest"], + "noEmitOnError": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitThis": true, + "noUnusedParameters": true, + "noUnusedLocals": true, + "skipDefaultLibCheck": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "strictNullChecks": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "paths": { + "@spartacus/schematics": ["../../projects/schematics/index"], + "@spartacus/setup": ["../../core-libs/setup/public_api"], + "@spartacus/setup/ssr": ["../../core-libs/setup/ssr/public_api"], + "@spartacus/asm/assets": ["../../feature-libs/asm/assets/public_api"], + "@spartacus/asm/components": [ + "../../feature-libs/asm/components/public_api" + ], + "@spartacus/asm/core": ["../../feature-libs/asm/core/public_api"], + "@spartacus/asm": ["../../feature-libs/asm/public_api"], + "@spartacus/asm/occ": ["../../feature-libs/asm/occ/public_api"], + "@spartacus/asm/root": ["../../feature-libs/asm/root/public_api"], + "@spartacus/cart/base/assets": [ + "../../feature-libs/cart/base/assets/public_api" + ], + "@spartacus/cart/base/components/add-to-cart": [ + "../../feature-libs/cart/base/components/add-to-cart/public_api" + ], + "@spartacus/cart/base/components/mini-cart": [ + "../../feature-libs/cart/base/components/mini-cart/public_api" + ], + "@spartacus/cart/base/components": [ + "../../feature-libs/cart/base/components/public_api" + ], + "@spartacus/cart/base/core": [ + "../../feature-libs/cart/base/core/public_api" + ], + "@spartacus/cart/base": ["../../feature-libs/cart/base/public_api"], + "@spartacus/cart/base/occ": [ + "../../feature-libs/cart/base/occ/public_api" + ], + "@spartacus/cart/base/root": [ + "../../feature-libs/cart/base/root/public_api" + ], + "@spartacus/cart/import-export/assets": [ + "../../feature-libs/cart/import-export/assets/public_api" + ], + "@spartacus/cart/import-export/components": [ + "../../feature-libs/cart/import-export/components/public_api" + ], + "@spartacus/cart/import-export/core": [ + "../../feature-libs/cart/import-export/core/public_api" + ], + "@spartacus/cart/import-export": [ + "../../feature-libs/cart/import-export/public_api" + ], + "@spartacus/cart/import-export/root": [ + "../../feature-libs/cart/import-export/root/public_api" + ], + "@spartacus/cart": ["../../feature-libs/cart/public_api"], + "@spartacus/cart/quick-order/assets": [ + "../../feature-libs/cart/quick-order/assets/public_api" + ], + "@spartacus/cart/quick-order/components": [ + "../../feature-libs/cart/quick-order/components/public_api" + ], + "@spartacus/cart/quick-order/core": [ + "../../feature-libs/cart/quick-order/core/public_api" + ], + "@spartacus/cart/quick-order": [ + "../../feature-libs/cart/quick-order/public_api" + ], + "@spartacus/cart/quick-order/root": [ + "../../feature-libs/cart/quick-order/root/public_api" + ], + "@spartacus/cart/saved-cart/assets": [ + "../../feature-libs/cart/saved-cart/assets/public_api" + ], + "@spartacus/cart/saved-cart/components": [ + "../../feature-libs/cart/saved-cart/components/public_api" + ], + "@spartacus/cart/saved-cart/core": [ + "../../feature-libs/cart/saved-cart/core/public_api" + ], + "@spartacus/cart/saved-cart": [ + "../../feature-libs/cart/saved-cart/public_api" + ], + "@spartacus/cart/saved-cart/occ": [ + "../../feature-libs/cart/saved-cart/occ/public_api" + ], + "@spartacus/cart/saved-cart/root": [ + "../../feature-libs/cart/saved-cart/root/public_api" + ], + "@spartacus/cart/wish-list/assets": [ + "../../feature-libs/cart/wish-list/assets/public_api" + ], + "@spartacus/cart/wish-list/components/add-to-wishlist": [ + "../../feature-libs/cart/wish-list/components/add-to-wishlist/public_api" + ], + "@spartacus/cart/wish-list/components": [ + "../../feature-libs/cart/wish-list/components/public_api" + ], + "@spartacus/cart/wish-list/core": [ + "../../feature-libs/cart/wish-list/core/public_api" + ], + "@spartacus/cart/wish-list": [ + "../../feature-libs/cart/wish-list/public_api" + ], + "@spartacus/cart/wish-list/root": [ + "../../feature-libs/cart/wish-list/root/public_api" + ], + "@spartacus/checkout/b2b/assets": [ + "../../feature-libs/checkout/b2b/assets/public_api" + ], + "@spartacus/checkout/b2b/components": [ + "../../feature-libs/checkout/b2b/components/public_api" + ], + "@spartacus/checkout/b2b/core": [ + "../../feature-libs/checkout/b2b/core/public_api" + ], + "@spartacus/checkout/b2b": ["../../feature-libs/checkout/b2b/public_api"], + "@spartacus/checkout/b2b/occ": [ + "../../feature-libs/checkout/b2b/occ/public_api" + ], + "@spartacus/checkout/b2b/root": [ + "../../feature-libs/checkout/b2b/root/public_api" + ], + "@spartacus/checkout/base/assets": [ + "../../feature-libs/checkout/base/assets/public_api" + ], + "@spartacus/checkout/base/components": [ + "../../feature-libs/checkout/base/components/public_api" + ], + "@spartacus/checkout/base/core": [ + "../../feature-libs/checkout/base/core/public_api" + ], + "@spartacus/checkout/base": [ + "../../feature-libs/checkout/base/public_api" + ], + "@spartacus/checkout/base/occ": [ + "../../feature-libs/checkout/base/occ/public_api" + ], + "@spartacus/checkout/base/root": [ + "../../feature-libs/checkout/base/root/public_api" + ], + "@spartacus/checkout": ["../../feature-libs/checkout/public_api"], + "@spartacus/checkout/scheduled-replenishment/assets": [ + "../../feature-libs/checkout/scheduled-replenishment/assets/public_api" + ], + "@spartacus/checkout/scheduled-replenishment/components": [ + "../../feature-libs/checkout/scheduled-replenishment/components/public_api" + ], + "@spartacus/checkout/scheduled-replenishment": [ + "../../feature-libs/checkout/scheduled-replenishment/public_api" + ], + "@spartacus/checkout/scheduled-replenishment/root": [ + "../../feature-libs/checkout/scheduled-replenishment/root/public_api" + ], + "@spartacus/customer-ticketing/assets": [ + "../../feature-libs/customer-ticketing/assets/public_api" + ], + "@spartacus/customer-ticketing/components": [ + "../../feature-libs/customer-ticketing/components/public_api" + ], + "@spartacus/customer-ticketing/core": [ + "../../feature-libs/customer-ticketing/core/public_api" + ], + "@spartacus/customer-ticketing": [ + "../../feature-libs/customer-ticketing/public_api" + ], + "@spartacus/customer-ticketing/occ": [ + "../../feature-libs/customer-ticketing/occ/public_api" + ], + "@spartacus/customer-ticketing/root": [ + "../../feature-libs/customer-ticketing/root/public_api" + ], + "@spartacus/order/assets": ["../../feature-libs/order/assets/public_api"], + "@spartacus/order/components": [ + "../../feature-libs/order/components/public_api" + ], + "@spartacus/order/core": ["../../feature-libs/order/core/public_api"], + "@spartacus/order": ["../../feature-libs/order/public_api"], + "@spartacus/order/occ": ["../../feature-libs/order/occ/public_api"], + "@spartacus/order/root": ["../../feature-libs/order/root/public_api"], + "@spartacus/organization/account-summary/assets": [ + "../../feature-libs/organization/account-summary/assets/public_api" + ], + "@spartacus/organization/account-summary/components": [ + "../../feature-libs/organization/account-summary/components/public_api" + ], + "@spartacus/organization/account-summary/core": [ + "../../feature-libs/organization/account-summary/core/public_api" + ], + "@spartacus/organization/account-summary": [ + "../../feature-libs/organization/account-summary/public_api" + ], + "@spartacus/organization/account-summary/occ": [ + "../../feature-libs/organization/account-summary/occ/public_api" + ], + "@spartacus/organization/account-summary/root": [ + "../../feature-libs/organization/account-summary/root/public_api" + ], + "@spartacus/organization/administration/assets": [ + "../../feature-libs/organization/administration/assets/public_api" + ], + "@spartacus/organization/administration/components": [ + "../../feature-libs/organization/administration/components/public_api" + ], + "@spartacus/organization/administration/core": [ + "../../feature-libs/organization/administration/core/public_api" + ], + "@spartacus/organization/administration": [ + "../../feature-libs/organization/administration/public_api" + ], + "@spartacus/organization/administration/occ": [ + "../../feature-libs/organization/administration/occ/public_api" + ], + "@spartacus/organization/administration/root": [ + "../../feature-libs/organization/administration/root/public_api" + ], + "@spartacus/organization": ["../../feature-libs/organization/public_api"], + "@spartacus/organization/order-approval/assets": [ + "../../feature-libs/organization/order-approval/assets/public_api" + ], + "@spartacus/organization/order-approval": [ + "../../feature-libs/organization/order-approval/public_api" + ], + "@spartacus/organization/order-approval/root": [ + "../../feature-libs/organization/order-approval/root/public_api" + ], + "@spartacus/organization/unit-order/assets": [ + "../../feature-libs/organization/unit-order/assets/public_api" + ], + "@spartacus/organization/unit-order/components": [ + "../../feature-libs/organization/unit-order/components/public_api" + ], + "@spartacus/organization/unit-order/core": [ + "../../feature-libs/organization/unit-order/core/public_api" + ], + "@spartacus/organization/unit-order": [ + "../../feature-libs/organization/unit-order/public_api" + ], + "@spartacus/organization/unit-order/occ": [ + "../../feature-libs/organization/unit-order/occ/public_api" + ], + "@spartacus/organization/unit-order/root": [ + "../../feature-libs/organization/unit-order/root/public_api" + ], + "@spartacus/organization/user-registration/assets": [ + "../../feature-libs/organization/user-registration/assets/public_api" + ], + "@spartacus/organization/user-registration/components": [ + "../../feature-libs/organization/user-registration/components/public_api" + ], + "@spartacus/organization/user-registration/core": [ + "../../feature-libs/organization/user-registration/core/public_api" + ], + "@spartacus/organization/user-registration": [ + "../../feature-libs/organization/user-registration/public_api" + ], + "@spartacus/organization/user-registration/occ": [ + "../../feature-libs/organization/user-registration/occ/public_api" + ], + "@spartacus/organization/user-registration/root": [ + "../../feature-libs/organization/user-registration/root/public_api" + ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], + "@spartacus/pickup-in-store/assets": [ + "../../feature-libs/pickup-in-store/assets/public_api" + ], + "@spartacus/pickup-in-store/components": [ + "../../feature-libs/pickup-in-store/components/public_api" + ], + "@spartacus/pickup-in-store/core": [ + "../../feature-libs/pickup-in-store/core/public_api" + ], + "@spartacus/pickup-in-store": [ + "../../feature-libs/pickup-in-store/public_api" + ], + "@spartacus/pickup-in-store/occ": [ + "../../feature-libs/pickup-in-store/occ/public_api" + ], + "@spartacus/pickup-in-store/root": [ + "../../feature-libs/pickup-in-store/root/public_api" + ], + "@spartacus/product-configurator/common/assets": [ + "../../feature-libs/product-configurator/common/assets/public_api" + ], + "@spartacus/product-configurator/common": [ + "../../feature-libs/product-configurator/common/public_api" + ], + "@spartacus/product-configurator": [ + "../../feature-libs/product-configurator/public_api" + ], + "@spartacus/product-configurator/rulebased/cpq": [ + "../../feature-libs/product-configurator/rulebased/cpq/public_api" + ], + "@spartacus/product-configurator/rulebased": [ + "../../feature-libs/product-configurator/rulebased/public_api" + ], + "@spartacus/product-configurator/rulebased/root": [ + "../../feature-libs/product-configurator/rulebased/root/public_api" + ], + "@spartacus/product-configurator/textfield": [ + "../../feature-libs/product-configurator/textfield/public_api" + ], + "@spartacus/product-configurator/textfield/root": [ + "../../feature-libs/product-configurator/textfield/root/public_api" + ], + "@spartacus/product/bulk-pricing/assets": [ + "../../feature-libs/product/bulk-pricing/assets/public_api" + ], + "@spartacus/product/bulk-pricing/components": [ + "../../feature-libs/product/bulk-pricing/components/public_api" + ], + "@spartacus/product/bulk-pricing/core": [ + "../../feature-libs/product/bulk-pricing/core/public_api" + ], + "@spartacus/product/bulk-pricing": [ + "../../feature-libs/product/bulk-pricing/public_api" + ], + "@spartacus/product/bulk-pricing/occ": [ + "../../feature-libs/product/bulk-pricing/occ/public_api" + ], + "@spartacus/product/bulk-pricing/root": [ + "../../feature-libs/product/bulk-pricing/root/public_api" + ], + "@spartacus/product/future-stock/assets": [ + "../../feature-libs/product/future-stock/assets/public_api" + ], + "@spartacus/product/future-stock/components": [ + "../../feature-libs/product/future-stock/components/public_api" + ], + "@spartacus/product/future-stock/core": [ + "../../feature-libs/product/future-stock/core/public_api" + ], + "@spartacus/product/future-stock": [ + "../../feature-libs/product/future-stock/public_api" + ], + "@spartacus/product/future-stock/occ": [ + "../../feature-libs/product/future-stock/occ/public_api" + ], + "@spartacus/product/future-stock/root": [ + "../../feature-libs/product/future-stock/root/public_api" + ], + "@spartacus/product/image-zoom/assets": [ + "../../feature-libs/product/image-zoom/assets/public_api" + ], + "@spartacus/product/image-zoom/components": [ + "../../feature-libs/product/image-zoom/components/public_api" + ], + "@spartacus/product/image-zoom": [ + "../../feature-libs/product/image-zoom/public_api" + ], + "@spartacus/product/image-zoom/root": [ + "../../feature-libs/product/image-zoom/root/public_api" + ], + "@spartacus/product": ["../../feature-libs/product/public_api"], + "@spartacus/product/variants/assets": [ + "../../feature-libs/product/variants/assets/public_api" + ], + "@spartacus/product/variants/components": [ + "../../feature-libs/product/variants/components/public_api" + ], + "@spartacus/product/variants": [ + "../../feature-libs/product/variants/public_api" + ], + "@spartacus/product/variants/occ": [ + "../../feature-libs/product/variants/occ/public_api" + ], + "@spartacus/product/variants/root": [ + "../../feature-libs/product/variants/root/public_api" + ], + "@spartacus/qualtrics/components": [ + "../../feature-libs/qualtrics/components/public_api" + ], + "@spartacus/qualtrics": ["../../feature-libs/qualtrics/public_api"], + "@spartacus/qualtrics/root": [ + "../../feature-libs/qualtrics/root/public_api" + ], + "@spartacus/requested-delivery-date/assets": [ + "../../feature-libs/requested-delivery-date/assets/public_api" + ], + "@spartacus/requested-delivery-date/core": [ + "../../feature-libs/requested-delivery-date/core/public_api" + ], + "@spartacus/requested-delivery-date": [ + "../../feature-libs/requested-delivery-date/public_api" + ], + "@spartacus/requested-delivery-date/occ": [ + "../../feature-libs/requested-delivery-date/occ/public_api" + ], + "@spartacus/requested-delivery-date/root": [ + "../../feature-libs/requested-delivery-date/root/public_api" + ], + "@spartacus/smartedit/core": [ + "../../feature-libs/smartedit/core/public_api" + ], + "@spartacus/smartedit": ["../../feature-libs/smartedit/public_api"], + "@spartacus/smartedit/root": [ + "../../feature-libs/smartedit/root/public_api" + ], + "@spartacus/storefinder/assets": [ + "../../feature-libs/storefinder/assets/public_api" + ], + "@spartacus/storefinder/components": [ + "../../feature-libs/storefinder/components/public_api" + ], + "@spartacus/storefinder/core": [ + "../../feature-libs/storefinder/core/public_api" + ], + "@spartacus/storefinder": ["../../feature-libs/storefinder/public_api"], + "@spartacus/storefinder/occ": [ + "../../feature-libs/storefinder/occ/public_api" + ], + "@spartacus/storefinder/root": [ + "../../feature-libs/storefinder/root/public_api" + ], + "@spartacus/tracking": ["../../feature-libs/tracking/public_api"], + "@spartacus/tracking/personalization/core": [ + "../../feature-libs/tracking/personalization/core/public_api" + ], + "@spartacus/tracking/personalization": [ + "../../feature-libs/tracking/personalization/public_api" + ], + "@spartacus/tracking/personalization/root": [ + "../../feature-libs/tracking/personalization/root/public_api" + ], + "@spartacus/tracking/tms/aep": [ + "../../feature-libs/tracking/tms/aep/public_api" + ], + "@spartacus/tracking/tms/core": [ + "../../feature-libs/tracking/tms/core/public_api" + ], + "@spartacus/tracking/tms/gtm": [ + "../../feature-libs/tracking/tms/gtm/public_api" + ], + "@spartacus/tracking/tms": ["../../feature-libs/tracking/tms/public_api"], + "@spartacus/user/account/assets": [ + "../../feature-libs/user/account/assets/public_api" + ], + "@spartacus/user/account/components": [ + "../../feature-libs/user/account/components/public_api" + ], + "@spartacus/user/account/core": [ + "../../feature-libs/user/account/core/public_api" + ], + "@spartacus/user/account": ["../../feature-libs/user/account/public_api"], + "@spartacus/user/account/occ": [ + "../../feature-libs/user/account/occ/public_api" + ], + "@spartacus/user/account/root": [ + "../../feature-libs/user/account/root/public_api" + ], + "@spartacus/user": ["../../feature-libs/user/public_api"], + "@spartacus/user/profile/assets": [ + "../../feature-libs/user/profile/assets/public_api" + ], + "@spartacus/user/profile/components": [ + "../../feature-libs/user/profile/components/public_api" + ], + "@spartacus/user/profile/core": [ + "../../feature-libs/user/profile/core/public_api" + ], + "@spartacus/user/profile": ["../../feature-libs/user/profile/public_api"], + "@spartacus/user/profile/occ": [ + "../../feature-libs/user/profile/occ/public_api" + ], + "@spartacus/user/profile/root": [ + "../../feature-libs/user/profile/root/public_api" + ], + "@spartacus/cdc/assets": ["../../integration-libs/cdc/assets/public_api"], + "@spartacus/cdc/components": [ + "../../integration-libs/cdc/components/public_api" + ], + "@spartacus/cdc/core": ["../../integration-libs/cdc/core/public_api"], + "@spartacus/cdc": ["../../integration-libs/cdc/public_api"], + "@spartacus/cdc/organization/administration": [ + "../../integration-libs/cdc/organization/administration/public_api" + ], + "@spartacus/cdc/organization/user-registration": [ + "../../integration-libs/cdc/organization/user-registration/public_api" + ], + "@spartacus/cdc/root": ["../../integration-libs/cdc/root/public_api"], + "@spartacus/cdc/user-account": [ + "../../integration-libs/cdc/user-account/public_api" + ], + "@spartacus/cdc/user-profile": [ + "../../integration-libs/cdc/user-profile/public_api" + ], + "@spartacus/cds": ["../../integration-libs/cds/public_api"], + "@spartacus/digital-payments/assets": [ + "../../integration-libs/digital-payments/assets/public_api" + ], + "@spartacus/digital-payments": [ + "../../integration-libs/digital-payments/public_api" + ], + "@spartacus/epd-visualization/assets": [ + "../../integration-libs/epd-visualization/assets/public_api" + ], + "@spartacus/epd-visualization/components": [ + "../../integration-libs/epd-visualization/components/public_api" + ], + "@spartacus/epd-visualization/core": [ + "../../integration-libs/epd-visualization/core/public_api" + ], + "@spartacus/epd-visualization/epd-visualization-api": [ + "../../integration-libs/epd-visualization/epd-visualization-api/public_api" + ], + "@spartacus/epd-visualization": [ + "../../integration-libs/epd-visualization/public_api" + ], + "@spartacus/epd-visualization/root": [ + "../../integration-libs/epd-visualization/root/public_api" + ], + "@spartacus/s4om/assets": [ + "../../integration-libs/s4om/assets/public_api" + ], + "@spartacus/s4om": ["../../integration-libs/s4om/public_api"], + "@spartacus/s4om/root": ["../../integration-libs/s4om/root/public_api"], + "@spartacus/segment-refs": [ + "../../integration-libs/segment-refs/public_api" + ], + "@spartacus/segment-refs/root": [ + "../../integration-libs/segment-refs/root/public_api" + ], + "@spartacus/assets": ["../../projects/assets/src/public_api"], + "@spartacus/core": ["../../projects/core/public_api"], + "@spartacus/storefront": ["../../projects/storefrontlib/public_api"] + } + }, + "include": ["schematics/**/*.ts"], + "exclude": ["schematics/*/files/**/*", "schematics/**/*_spec.ts"] +} diff --git a/feature-libs/pdf-invoices/tsconfig.spec.json b/feature-libs/pdf-invoices/tsconfig.spec.json new file mode 100644 index 00000000000..9f660f8b0a1 --- /dev/null +++ b/feature-libs/pdf-invoices/tsconfig.spec.json @@ -0,0 +1,14 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "strict": false, + "module": "es2020", + "types": ["jasmine", "node"], + "skipLibCheck": true, + "resolveJsonModule": true, + "esModuleInterop": true + }, + "files": ["test.ts"], + "include": ["**/*.spec.ts", "**/*.d.ts"] +} diff --git a/feature-libs/pickup-in-store/tsconfig.schematics.json b/feature-libs/pickup-in-store/tsconfig.schematics.json index a6671c2be12..c911138c2e9 100644 --- a/feature-libs/pickup-in-store/tsconfig.schematics.json +++ b/feature-libs/pickup-in-store/tsconfig.schematics.json @@ -275,6 +275,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/feature-libs/product-configurator/tsconfig.schematics.json b/feature-libs/product-configurator/tsconfig.schematics.json index 1652ce2b588..f737af1f63b 100644 --- a/feature-libs/product-configurator/tsconfig.schematics.json +++ b/feature-libs/product-configurator/tsconfig.schematics.json @@ -259,6 +259,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/feature-libs/product/tsconfig.schematics.json b/feature-libs/product/tsconfig.schematics.json index 1652ce2b588..f737af1f63b 100644 --- a/feature-libs/product/tsconfig.schematics.json +++ b/feature-libs/product/tsconfig.schematics.json @@ -259,6 +259,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/feature-libs/qualtrics/tsconfig.schematics.json b/feature-libs/qualtrics/tsconfig.schematics.json index 1652ce2b588..f737af1f63b 100644 --- a/feature-libs/qualtrics/tsconfig.schematics.json +++ b/feature-libs/qualtrics/tsconfig.schematics.json @@ -259,6 +259,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/feature-libs/requested-delivery-date/tsconfig.lib.json b/feature-libs/requested-delivery-date/tsconfig.lib.json index 78d0becdbd7..6aa05ab39be 100644 --- a/feature-libs/requested-delivery-date/tsconfig.lib.json +++ b/feature-libs/requested-delivery-date/tsconfig.lib.json @@ -64,7 +64,6 @@ "@spartacus/cart/wish-list/core": ["dist/cart/wish-list/core"], "@spartacus/cart/wish-list": ["dist/cart/wish-list"], "@spartacus/cart/wish-list/root": ["dist/cart/wish-list/root"], - "@spartacus/core": ["dist/core"], "@spartacus/checkout/b2b/assets": ["dist/checkout/b2b/assets"], "@spartacus/checkout/b2b/components": ["dist/checkout/b2b/components"], "@spartacus/checkout/b2b/core": ["dist/checkout/b2b/core"], @@ -90,6 +89,7 @@ "@spartacus/checkout/scheduled-replenishment/root": [ "dist/checkout/scheduled-replenishment/root" ], + "@spartacus/core": ["dist/core"], "@spartacus/order/assets": ["dist/order/assets"], "@spartacus/order/components": ["dist/order/components"], "@spartacus/order/core": ["dist/order/core"], diff --git a/feature-libs/requested-delivery-date/tsconfig.schematics.json b/feature-libs/requested-delivery-date/tsconfig.schematics.json index bc2b2041ba7..125e28e522d 100644 --- a/feature-libs/requested-delivery-date/tsconfig.schematics.json +++ b/feature-libs/requested-delivery-date/tsconfig.schematics.json @@ -272,6 +272,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/feature-libs/smartedit/tsconfig.schematics.json b/feature-libs/smartedit/tsconfig.schematics.json index 1652ce2b588..f737af1f63b 100644 --- a/feature-libs/smartedit/tsconfig.schematics.json +++ b/feature-libs/smartedit/tsconfig.schematics.json @@ -259,6 +259,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/feature-libs/storefinder/tsconfig.schematics.json b/feature-libs/storefinder/tsconfig.schematics.json index 1652ce2b588..f737af1f63b 100644 --- a/feature-libs/storefinder/tsconfig.schematics.json +++ b/feature-libs/storefinder/tsconfig.schematics.json @@ -259,6 +259,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/feature-libs/tracking/tsconfig.schematics.json b/feature-libs/tracking/tsconfig.schematics.json index 1652ce2b588..f737af1f63b 100644 --- a/feature-libs/tracking/tsconfig.schematics.json +++ b/feature-libs/tracking/tsconfig.schematics.json @@ -259,6 +259,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/feature-libs/user/tsconfig.schematics.json b/feature-libs/user/tsconfig.schematics.json index 1652ce2b588..f737af1f63b 100644 --- a/feature-libs/user/tsconfig.schematics.json +++ b/feature-libs/user/tsconfig.schematics.json @@ -259,6 +259,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/integration-libs/cdc/tsconfig.schematics.json b/integration-libs/cdc/tsconfig.schematics.json index 1652ce2b588..f737af1f63b 100644 --- a/integration-libs/cdc/tsconfig.schematics.json +++ b/integration-libs/cdc/tsconfig.schematics.json @@ -259,6 +259,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/integration-libs/cds/tsconfig.schematics.json b/integration-libs/cds/tsconfig.schematics.json index 0fbbe795fcc..4749caf728c 100644 --- a/integration-libs/cds/tsconfig.schematics.json +++ b/integration-libs/cds/tsconfig.schematics.json @@ -259,6 +259,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/integration-libs/digital-payments/tsconfig.schematics.json b/integration-libs/digital-payments/tsconfig.schematics.json index 1652ce2b588..f737af1f63b 100644 --- a/integration-libs/digital-payments/tsconfig.schematics.json +++ b/integration-libs/digital-payments/tsconfig.schematics.json @@ -259,6 +259,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/integration-libs/epd-visualization/tsconfig.schematics.json b/integration-libs/epd-visualization/tsconfig.schematics.json index 1652ce2b588..f737af1f63b 100644 --- a/integration-libs/epd-visualization/tsconfig.schematics.json +++ b/integration-libs/epd-visualization/tsconfig.schematics.json @@ -259,6 +259,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/integration-libs/s4om/README.md b/integration-libs/s4om/README.md index 1b3443de9f4..0640be5488a 100644 --- a/integration-libs/s4om/README.md +++ b/integration-libs/s4om/README.md @@ -4,8 +4,11 @@ This library provides S/4 HANA Synchronous Order Management capabilities to Spar The features supported are: -- scheduleLines: Display a table of scheduled delivery dates and product quantity for each item in the B2B Cart using information from S/4 HANA system. +- Schedule Lines: Display a table of scheduled delivery dates and product quantity for each item in the B2B Cart using information from S/4 HANA system. -This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 13.2.0. +- Requested Delivery Date: Allow customers to provide a delivery date for which the item would be needed. The minimum date would be fetched from the S/4 HANA system and used along with the Order. + +- PDF Invoices: View invoices for their orders and download PDF invoices using `Invoices` APIs. When the user selects an invoice, the backend returns a byte array, which is converted to PDF and downloaded. + diff --git a/integration-libs/s4om/package.json b/integration-libs/s4om/package.json index d0ddb7f36b9..505231bebd5 100644 --- a/integration-libs/s4om/package.json +++ b/integration-libs/s4om/package.json @@ -25,6 +25,7 @@ "@angular/core": "^15.2.4", "@spartacus/cart": "6.3.0-1", "@spartacus/core": "6.3.0-1", + "@spartacus/pdf-invoices": "6.3.0-1", "@spartacus/requested-delivery-date": "6.3.0-1", "@spartacus/schematics": "6.3.0-1", "@spartacus/storefront": "6.3.0-1", diff --git a/integration-libs/s4om/root/s4om-root.module.ts b/integration-libs/s4om/root/s4om-root.module.ts index a176a2349d7..be62fe178f1 100644 --- a/integration-libs/s4om/root/s4om-root.module.ts +++ b/integration-libs/s4om/root/s4om-root.module.ts @@ -6,6 +6,7 @@ import { NgModule } from '@angular/core'; import { CartOutlets } from '@spartacus/cart/base/root'; +import { PDFInvoicesComponentsModule } from '@spartacus/pdf-invoices/components'; import { RequestedDeliveryDateComponentsModule } from '@spartacus/requested-delivery-date/root'; import { OutletPosition, provideOutlet } from '@spartacus/storefront'; import { ScheduleLinesComponent } from './components/schedule-lines/schedule-lines.component'; @@ -15,6 +16,7 @@ import { ScheduleLinesModule } from './components/schedule-lines/schedule-lines. imports: [ ScheduleLinesModule, RequestedDeliveryDateComponentsModule, //Adding dependency with Requested Delivery Date so that the library gets installed along with S4OM + PDFInvoicesComponentsModule, //Adding dependency with PDF Invoices so that the library gets installed along with S4OM ], providers: [ provideOutlet({ diff --git a/integration-libs/s4om/schematics/add-s4om/schema.json b/integration-libs/s4om/schematics/add-s4om/schema.json index 19c66cb018b..b9e70316943 100644 --- a/integration-libs/s4om/schematics/add-s4om/schema.json +++ b/integration-libs/s4om/schematics/add-s4om/schema.json @@ -33,6 +33,10 @@ { "value": "Requested-Delivery-Date", "label": "Requested Delivery Date" + }, + { + "value": "PDF-Invoices", + "label": "PDF Invoices" } ] } diff --git a/integration-libs/s4om/tsconfig.lib.json b/integration-libs/s4om/tsconfig.lib.json index 1c370c142e5..9e5cf8bd8b1 100644 --- a/integration-libs/s4om/tsconfig.lib.json +++ b/integration-libs/s4om/tsconfig.lib.json @@ -61,7 +61,6 @@ "@spartacus/cart/wish-list": ["dist/cart/wish-list"], "@spartacus/cart/wish-list/root": ["dist/cart/wish-list/root"], "@spartacus/core": ["dist/core"], - "@spartacus/storefront": ["dist/storefrontlib"], "@spartacus/requested-delivery-date/assets": [ "dist/requested-delivery-date/assets" ], @@ -75,6 +74,7 @@ "@spartacus/requested-delivery-date/root": [ "dist/requested-delivery-date/root" ], + "@spartacus/storefront": ["dist/storefrontlib"], "@spartacus/user/account/assets": ["dist/user/account/assets"], "@spartacus/user/account/components": ["dist/user/account/components"], "@spartacus/user/account/core": ["dist/user/account/core"], @@ -118,7 +118,13 @@ "@spartacus/order/core": ["dist/order/core"], "@spartacus/order": ["dist/order"], "@spartacus/order/occ": ["dist/order/occ"], - "@spartacus/order/root": ["dist/order/root"] + "@spartacus/order/root": ["dist/order/root"], + "@spartacus/pdf-invoices/assets": ["dist/pdf-invoices/assets"], + "@spartacus/pdf-invoices/components": ["dist/pdf-invoices/components"], + "@spartacus/pdf-invoices/core": ["dist/pdf-invoices/core"], + "@spartacus/pdf-invoices": ["dist/pdf-invoices"], + "@spartacus/pdf-invoices/occ": ["dist/pdf-invoices/occ"], + "@spartacus/pdf-invoices/root": ["dist/pdf-invoices/root"] }, "resolveJsonModule": true, "esModuleInterop": true diff --git a/integration-libs/s4om/tsconfig.schematics.json b/integration-libs/s4om/tsconfig.schematics.json index 1652ce2b588..f737af1f63b 100644 --- a/integration-libs/s4om/tsconfig.schematics.json +++ b/integration-libs/s4om/tsconfig.schematics.json @@ -259,6 +259,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/integration-libs/segment-refs/tsconfig.schematics.json b/integration-libs/segment-refs/tsconfig.schematics.json index 1652ce2b588..f737af1f63b 100644 --- a/integration-libs/segment-refs/tsconfig.schematics.json +++ b/integration-libs/segment-refs/tsconfig.schematics.json @@ -259,6 +259,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/package.json b/package.json index cf194e346ae..2997943cf75 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,9 @@ "build:digital-payments": "npm --prefix integration-libs/digital-payments run build:schematics && nx build digital-payments --configuration production", "build:epd-visualization": "npm --prefix integration-libs/epd-visualization run build:schematics && nx build epd-visualization --configuration production", "build:order": "npm --prefix feature-libs/order run build:schematics && nx build order --configuration production", - "build:libs": "nx build core --configuration production && nx build storefrontlib --configuration production && concurrently --kill-others-on-fail npm:build:schematics npm:build:user && npm run build:cart && npm run build:order && concurrently --kill-others-on-fail npm:build:checkout npm:build:asm npm:build:tracking npm:build:customer-ticketing && concurrently --kill-others-on-fail npm:build:organization npm:build:product npm:build:product-configurator npm:build:requested-delivery-date npm:build:storefinder && concurrently --kill-others-on-fail npm:build:smartedit npm:build:qualtrics npm:build:assets npm:build:cds npm:build:cdc npm:build:digital-payments npm:build:epd-visualization npm:build:s4om npm:build:segment-refs npm:build:pickup-in-store && npm run build:setup", + "build:libs": "nx build core --configuration production && nx build storefrontlib --configuration production && concurrently --kill-others-on-fail npm:build:schematics npm:build:user && npm run build:cart && npm run build:order && concurrently --kill-others-on-fail npm:build:checkout npm:build:asm npm:build:tracking npm:build:customer-ticketing && concurrently --kill-others-on-fail npm:build:organization npm:build:pdf-invoices npm:build:product npm:build:product-configurator npm:build:requested-delivery-date npm:build:storefinder && concurrently --kill-others-on-fail npm:build:smartedit npm:build:qualtrics npm:build:assets npm:build:cds npm:build:cdc npm:build:digital-payments npm:build:epd-visualization npm:build:s4om npm:build:segment-refs npm:build:pickup-in-store && npm run build:setup", "build:organization": "npm --prefix feature-libs/organization run build:schematics && nx build organization --configuration production", + "build:pdf-invoices": "npm --prefix feature-libs/pdf-invoices run build:schematics && nx build pdf-invoices --configuration production", "build:pickup-in-store": "npm --prefix feature-libs/pickup-in-store run build:schematics && nx build pickup-in-store --configuration production", "build:product": "npm --prefix feature-libs/product run build:schematics && nx build product --configuration production", "build:product-configurator": "npm --prefix feature-libs/product-configurator run build:schematics && nx build product-configurator --configuration production", @@ -82,7 +83,7 @@ "start:prod": "env-cmd --no-override -e dev,b2c,$SPA_ENV nx serve storefrontapp --configuration=production", "start:pwa": "cd ./dist/storefrontapp/ && http-server --silent --proxy http://localhost:4200? -p 4200", "test": "nx test", - "test:libs": "concurrently \"nx test core --code-coverage\" \"nx test storefrontlib --code-coverage\" \"nx test cart --code-coverage\" \"nx test organization --code-coverage\" \"nx test storefinder --code-coverage\" \"nx test smartedit --code-coverage\" \"nx test asm --code-coverage\" \"nx test qualtrics --code-coverage\" \"nx test product --code-coverage\" \"nx test product-configurator --code-coverage\" \"nx test customer-ticketing --code-coverage\" \"nx test cdc --code-coverage\" \"nx test setup --code-coverage\" \"nx test checkout --code-coverage\" \"nx test order --code-coverage\" \"nx test digital-payments --code-coverage\" \"nx test epd-visualization --code-coverage\" \"nx test pickup-in-store --code-coverage\" \"nx test s4om --code-coverage\" \"nx test requested-delivery-date --code-coverage\"", + "test:libs": "concurrently \"nx test core --code-coverage\" \"nx test storefrontlib --code-coverage\" \"nx test cart --code-coverage\" \"nx test organization --code-coverage\" \"nx test storefinder --code-coverage\" \"nx test smartedit --code-coverage\" \"nx test asm --code-coverage\" \"nx test qualtrics --code-coverage\" \"nx test product --code-coverage\" \"nx test product-configurator --code-coverage\" \"nx test customer-ticketing --code-coverage\" \"nx test cdc --code-coverage\" \"nx test setup --code-coverage\" \"nx test checkout --code-coverage\" \"nx test order --code-coverage\" \"nx test digital-payments --code-coverage\" \"nx test epd-visualization --code-coverage\" \"nx test pickup-in-store --code-coverage\" \"nx test s4om --code-coverage\" \"nx test requested-delivery-date --code-coverage\" \"nx test pdf-invoices --code-coverage\"", "test:storefront:lib": "nx test storefrontlib --source-map --code-coverage", "dev:ssr": "env-cmd --no-override -e dev,b2c,$SPA_ENV cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 nx run storefrontapp:serve-ssr", "serve:ssr": "node dist/storefrontapp-server/main.js", diff --git a/projects/schematics/package.json b/projects/schematics/package.json index 69b9829e9b0..e2cde80e9ed 100644 --- a/projects/schematics/package.json +++ b/projects/schematics/package.json @@ -52,6 +52,7 @@ "@spartacus/checkout", "@spartacus/order", "@spartacus/organization", + "@spartacus/pdf-invoices", "@spartacus/product", "@spartacus/product-configurator", "@spartacus/qualtrics", diff --git a/projects/schematics/src/add-spartacus/schema.json b/projects/schematics/src/add-spartacus/schema.json index f115637f01f..353cb657729 100644 --- a/projects/schematics/src/add-spartacus/schema.json +++ b/projects/schematics/src/add-spartacus/schema.json @@ -39,6 +39,7 @@ "Bulk-Pricing", "Image-Zoom", "Future-Stock", + "PDF-Invoices", "Product-Variants", "VC-Configurator", "Textfield-Configurator", @@ -183,6 +184,10 @@ "value": "CPQ-Configurator", "label": "Product Configurator - CPQ Configurator (b2b feature)" }, + { + "value": "PDF-Invoices", + "label": "PDF Invoices" + }, { "value": "Qualtrics", "label": "Qualtrics" diff --git a/projects/schematics/src/dependencies.json b/projects/schematics/src/dependencies.json index aecd2065dfd..acfb2abaf1e 100644 --- a/projects/schematics/src/dependencies.json +++ b/projects/schematics/src/dependencies.json @@ -152,6 +152,17 @@ "bootstrap": "^4.6.2", "rxjs": "^6.6.0" }, + "@spartacus/pdf-invoices": { + "@angular-devkit/schematics": "^15.2.4", + "@angular/common": "^15.2.4", + "@angular/core": "^15.2.4", + "@angular/forms": "^15.2.4", + "@spartacus/core": "6.3.0-1", + "@spartacus/schematics": "6.3.0-1", + "@spartacus/storefront": "6.3.0-1", + "@spartacus/styles": "6.3.0-1", + "rxjs": "^6.6.0" + }, "@spartacus/pickup-in-store": { "@angular-devkit/schematics": "^15.2.4", "@angular/common": "^15.2.4", @@ -336,6 +347,7 @@ "@angular/core": "^15.2.4", "@spartacus/cart": "6.3.0-1", "@spartacus/core": "6.3.0-1", + "@spartacus/pdf-invoices": "6.3.0-1", "@spartacus/requested-delivery-date": "6.3.0-1", "@spartacus/schematics": "6.3.0-1", "@spartacus/storefront": "6.3.0-1", diff --git a/projects/schematics/src/shared/lib-configs/integration-libs/s4om-schematics-config.ts b/projects/schematics/src/shared/lib-configs/integration-libs/s4om-schematics-config.ts index c6231296800..b6466041d5e 100644 --- a/projects/schematics/src/shared/lib-configs/integration-libs/s4om-schematics-config.ts +++ b/projects/schematics/src/shared/lib-configs/integration-libs/s4om-schematics-config.ts @@ -7,6 +7,8 @@ import { CART_BASE_FEATURE_NAME, ORDER_FEATURE_NAME, + PDF_INVOICES_FEATURE_NAME, + REQUESTED_DELIVERY_DATE_FEATURE_NAME, S4OM_FEATURE_NAME, SPARTACUS_S4OM, SPARTACUS_S4OM_ASSETS, @@ -48,5 +50,10 @@ export const S4OM_SCHEMATICS_CONFIG: SchematicConfig = { chunks: S4OM_TRANSLATION_CHUNKS_CONFIG, importPath: SPARTACUS_S4OM_ASSETS, }, - dependencyFeatures: [CART_BASE_FEATURE_NAME, ORDER_FEATURE_NAME], + dependencyFeatures: [ + CART_BASE_FEATURE_NAME, + ORDER_FEATURE_NAME, + REQUESTED_DELIVERY_DATE_FEATURE_NAME, + PDF_INVOICES_FEATURE_NAME, + ], }; diff --git a/projects/schematics/src/shared/lib-configs/pdf-invoices-schematics-config.ts b/projects/schematics/src/shared/lib-configs/pdf-invoices-schematics-config.ts new file mode 100644 index 00000000000..7e75d23cd1c --- /dev/null +++ b/projects/schematics/src/shared/lib-configs/pdf-invoices-schematics-config.ts @@ -0,0 +1,57 @@ +/* + * SPDX-FileCopyrightText: 2022 SAP Spartacus team + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + PDF_INVOICES_FEATURE_NAME, + SPARTACUS_PDF_INVOICES, + SPARTACUS_PDF_INVOICES_ASSETS, + SPARTACUS_PDF_INVOICES_ROOT, + SPARTACUS_REQUESTED_DELIVERY_DATE, + USER_PROFILE_FEATURE_NAME, +} from '../libs-constants'; +import { SchematicConfig } from '../utils/lib-utils'; + +export const PDF_INVOICES_FEATURE_NAME_CONSTANT = 'PDF_INVOICES_FEATURE'; +export const PDF_INVOICES_FOLDER_NAME = 'pdf-invoices'; +export const PDF_INVOICES_TRANSLATIONS = 'pdfInvoicesTranslations'; +export const PDF_INVOICES_TRANSLATION_CHUNKS_CONFIG = + 'pdfInvoicesTranslationChunksConfig'; +export const PDF_INVOICES_ROOT_MODULE = 'PDFInvoicesRootModule'; +export const PDF_INVOICES_MODULE = 'PDFInvoicesModule'; + +export const PDF_INVOICES_SCSS_FILE_NAME = 'pdf-invoices.scss'; + +export const PDF_INVOICES_SCHEMATICS_CONFIG: SchematicConfig = { + library: { + featureName: PDF_INVOICES_FEATURE_NAME, + mainScope: SPARTACUS_REQUESTED_DELIVERY_DATE, + }, + folderName: PDF_INVOICES_FOLDER_NAME, + moduleName: PDF_INVOICES_MODULE, + featureModule: { + name: PDF_INVOICES_MODULE, + importPath: SPARTACUS_PDF_INVOICES, + }, + rootModule: { + name: PDF_INVOICES_ROOT_MODULE, + importPath: SPARTACUS_PDF_INVOICES_ROOT, + }, + styles: { + scssFileName: PDF_INVOICES_SCSS_FILE_NAME, + importStyle: SPARTACUS_PDF_INVOICES, + }, + lazyLoadingChunk: { + moduleSpecifier: SPARTACUS_PDF_INVOICES_ROOT, + namedImports: [PDF_INVOICES_FEATURE_NAME_CONSTANT], + }, + i18n: { + resources: PDF_INVOICES_TRANSLATIONS, + chunks: PDF_INVOICES_TRANSLATION_CHUNKS_CONFIG, + importPath: SPARTACUS_PDF_INVOICES_ASSETS, + }, + dependencyFeatures: [USER_PROFILE_FEATURE_NAME], +}; diff --git a/projects/schematics/src/shared/libs-constants.ts b/projects/schematics/src/shared/libs-constants.ts index 39faa1c6383..89e48f70e69 100644 --- a/projects/schematics/src/shared/libs-constants.ts +++ b/projects/schematics/src/shared/libs-constants.ts @@ -131,6 +131,10 @@ export const SPARTACUS_FUTURE_STOCK = `@spartacus/product/future-stock`; export const SPARTACUS_FUTURE_STOCK_ROOT = `@spartacus/product/future-stock/root`; export const SPARTACUS_FUTURE_STOCK_ASSETS = `@spartacus/product/future-stock/assets`; +export const SPARTACUS_PDF_INVOICES = `@spartacus/pdf-invoices`; +export const SPARTACUS_PDF_INVOICES_ROOT = `@spartacus/pdf-invoices/root`; +export const SPARTACUS_PDF_INVOICES_ASSETS = `@spartacus/pdf-invoices/assets`; + export const SPARTACUS_PRODUCT_CONFIGURATOR = `@spartacus/product-configurator`; export const SPARTACUS_PRODUCT_CONFIGURATOR_COMMON = `@spartacus/product-configurator/common`; export const SPARTACUS_PRODUCT_CONFIGURATOR_ASSETS = `@spartacus/product-configurator/common/assets`; @@ -261,6 +265,8 @@ export const TRACKING_PERSONALIZATION_FEATURE_NAME = 'Personalization'; export const TRACKING_TMS_GTM_FEATURE_NAME = 'TMS-GTM'; export const TRACKING_TMS_AEP_FEATURE_NAME = 'TMS-AEPL'; +export const PDF_INVOICES_FEATURE_NAME = 'PDF-Invoices'; + export const USER_ACCOUNT_FEATURE_NAME = 'User-Account'; export const USER_PROFILE_FEATURE_NAME = 'User-Profile'; diff --git a/projects/schematics/src/shared/schematics-config-mappings.ts b/projects/schematics/src/shared/schematics-config-mappings.ts index 0cb429e3a52..83dd318ac7d 100644 --- a/projects/schematics/src/shared/schematics-config-mappings.ts +++ b/projects/schematics/src/shared/schematics-config-mappings.ts @@ -33,6 +33,7 @@ import { ORGANIZATION_UNIT_ORDER_SCHEMATICS_CONFIG, ORGANIZATION_USER_REGISTRATION_SCHEMATICS_CONFIG, } from './lib-configs/organization-schematics-config'; +import { PDF_INVOICES_SCHEMATICS_CONFIG } from './lib-configs/pdf-invoices-schematics-config'; import { PICKUP_IN_STORE_SCHEMATICS_CONFIG } from './lib-configs/pickup-in-store-schematics-config'; import { PRODUCT_CONFIGURATOR_CPQ_SCHEMATICS_CONFIG, @@ -97,6 +98,8 @@ export const SCHEMATICS_CONFIGS: SchematicConfig[] = [ PRODUCT_VARIANTS_SCHEMATICS_CONFIG, PRODUCT_FUTURE_STOCK_SCHEMATICS_CONFIG, + PDF_INVOICES_SCHEMATICS_CONFIG, + QUALTRICS_SCHEMATICS_CONFIG, REQUESTED_DELIVERY_DATE_SCHEMATICS_CONFIG, diff --git a/projects/schematics/src/shared/utils/graph-utils_spec.ts b/projects/schematics/src/shared/utils/graph-utils_spec.ts index deaa8f366e0..a11097ec6d2 100644 --- a/projects/schematics/src/shared/utils/graph-utils_spec.ts +++ b/projects/schematics/src/shared/utils/graph-utils_spec.ts @@ -11,6 +11,7 @@ import { SPARTACUS_EPD_VISUALIZATION, SPARTACUS_ORDER, SPARTACUS_ORGANIZATION, + SPARTACUS_PDF_INVOICES, SPARTACUS_PICKUP_IN_STORE, SPARTACUS_PRODUCT, SPARTACUS_PRODUCT_CONFIGURATOR, @@ -131,6 +132,7 @@ describe('Graph utils', () => { SPARTACUS_ORDER, SPARTACUS_CHECKOUT, SPARTACUS_REQUESTED_DELIVERY_DATE, + SPARTACUS_PDF_INVOICES, SPARTACUS_TRACKING, SPARTACUS_ORGANIZATION, SPARTACUS_ASM, @@ -169,6 +171,8 @@ describe('Graph utils', () => { "Personalization", "TMS-AEPL", "TMS-GTM", + "PDF-Invoices", + "Requested-Delivery-Date", "Organization-User-Registration", "Administration", "Account-Summary", @@ -186,7 +190,6 @@ describe('Graph utils', () => { "CDC", "Customer-Ticketing", "SmartEdit", - "Requested-Delivery-Date", "Qualtrics", "Future-Stock", "Product-Variants", diff --git a/projects/schematics/src/shared/utils/test-utils.ts b/projects/schematics/src/shared/utils/test-utils.ts index f6cdf7aedf3..7d2117870b7 100644 --- a/projects/schematics/src/shared/utils/test-utils.ts +++ b/projects/schematics/src/shared/utils/test-utils.ts @@ -55,6 +55,8 @@ export const organizationUnitOrderFeatureModulePath = 'src/app/spartacus/features/organization/organization-unit-order-feature.module.ts'; export const organizationAccountSummaryFeatureModulePath = 'src/app/spartacus/features/organization/organization-account-summary-feature.module.ts'; +export const pdfInvoicesFeatureModulePath = + 'src/app/spartacus/features/pdf-invoices/pdf-invoices-feature.module.ts'; export const productBulkPricingFeatureModulePath = 'src/app/spartacus/features/product/product-bulk-pricing-feature.module.ts'; export const productImageZoomFeatureModulePath = diff --git a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/pdf-invoices/pdf-invoices.e2e.cy.ts b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/pdf-invoices/pdf-invoices.e2e.cy.ts new file mode 100644 index 00000000000..8f49844f2bc --- /dev/null +++ b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/pdf-invoices/pdf-invoices.e2e.cy.ts @@ -0,0 +1,142 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + interceptOrdersEndpoint, + waitForResponse, +} from '../../../helpers/order-history'; +import * as pdfInvoicesHelper from '../../../helpers/vendor/pdf-invoices/pdf-invoices'; +import * as s4Helper from '../../../helpers/vendor/s4om/s4om'; +import { + ORDER_REQUEST_ENDPOINT, + POWERTOOLS_BASESITE, + USER_REQUEST_ENDPOINT, +} from '../../../sample-data/b2b-checkout'; +import { isolateTestsBefore } from '../../../support/utils/test-isolation'; + +describe('PDF Invoices', { testIsolation: false }, () => { + isolateTestsBefore(); + before(() => { + cy.window().then((win) => win.sessionStorage.clear()); + Cypress.env('BASE_SITE', POWERTOOLS_BASESITE); + Cypress.env('OCC_PREFIX_USER_ENDPOINT', USER_REQUEST_ENDPOINT); + Cypress.env('OCC_PREFIX_ORDER_ENDPOINT', ORDER_REQUEST_ENDPOINT); + }); + + beforeEach(() => { + cy.restoreLocalStorage(); + }); + + afterEach(() => { + cy.saveLocalStorage(); + }); + + describe('PDF Invoices in Order History', () => { + it('should be able to login as a b2b user (CXINT-1851)', () => { + s4Helper.loginS4OMB2bUser(); + }); + + it('should be able to view order in order history with PO# (CXINT-1851)', () => { + cy.visit('/my-account/orders'); + const ordersAlias = interceptOrdersEndpoint(); + waitForResponse(ordersAlias); + + const pdfInvoicesOrderId = pdfInvoicesHelper.pdfInvoicesPastOrderId; + cy.wrap(pdfInvoicesOrderId).should('not.be.null'); + s4Helper.findRowInOrderHistoryTable( + ordersAlias, + pdfInvoicesOrderId, + pdfInvoicesHelper.poNumber + ); + }); + + it('should be able to view a past order detail in order detail page with requested delivery date information (CXINT-1851)', () => { + cy.intercept({ + method: 'GET', + pathname: `${Cypress.env('OCC_PREFIX')}/${Cypress.env( + 'BASE_SITE' + )}/users/current/orders/*`, + }).as('getOrderDetail'); + + cy.intercept({ + method: 'GET', + path: `**/users/current/orders/**/invoices?**`, + }).as('getInvoices'); + + const pdfInvoicesOrderId = pdfInvoicesHelper.pdfInvoicesPastOrderId; + cy.visit('/my-account/order/' + pdfInvoicesOrderId); + cy.wait('@getOrderDetail'); + cy.wait('@getInvoices').its('response.statusCode').should('eq', 200); + + s4Helper.reviewB2bOrderDetail( + pdfInvoicesHelper.pdfInvoicesB2bAccountShipToUser, + pdfInvoicesHelper.pdfInvoicesProduct, + pdfInvoicesHelper.cartWithB2bProductAndStandardShipping, + true, + null, + pdfInvoicesHelper.poNumber, + s4Helper.s4omCostCenter, + s4Helper.s4omB2BUnit, + false + ); + + pdfInvoicesHelper.verifyPDFInvoicesOrderDetailPage(); + }); + + it('should be able to traverse pages (CXINT-1851)', () => { + pdfInvoicesHelper.verifyInvoicesTablePagination(); + }); + + it('should be able to sort invoices by date ascending (CXINT-1851)', () => { + pdfInvoicesHelper.verifyInvoicesTableSortByDateAscending(); + }); + + it('should be able to sort invoices by date descending (CXINT-1851)', () => { + pdfInvoicesHelper.verifyInvoicesTableSortByDateDescending(); + }); + + it('should be able to sort invoices by net amount ascending (CXINT-1851)', () => { + pdfInvoicesHelper.verifyInvoicesTableSortByNetAmountAscending(); + }); + + it('should be able to sort invoices by net amount descending (CXINT-1851)', () => { + pdfInvoicesHelper.verifyInvoicesTableSortByNetAmountDescending(); + }); + + it('should be able to sort invoices by total amount ascending (CXINT-1851)', () => { + pdfInvoicesHelper.verifyInvoicesTableSortByTotalAmountAscending(); + }); + + it('should be able to sort invoices by total amount descending (CXINT-1851)', () => { + pdfInvoicesHelper.verifyInvoicesTableSortByTotalAmountDescending(); + }); + + it('should be able to sort invoices by Invoice Number ascending (CXINT-1851)', () => { + pdfInvoicesHelper.verifyInvoicesTableSortByInvoiceNumAscending(); + }); + + it('should be able to sort invoices by Invoice Number descending (CXINT-1851)', () => { + pdfInvoicesHelper.verifyInvoicesTableSortByInvoiceNumDescending(); + }); + + it('should be able to download first invoice (CXINT-1851)', () => { + cy.intercept({ + method: 'GET', + path: `**/users/current/orders/**/invoices?**`, + }).as('getInvoices'); + + const pdfInvoicesOrderId = pdfInvoicesHelper.pdfInvoicesPastOrderId; + cy.visit('/my-account/order/' + pdfInvoicesOrderId); + cy.wait('@getInvoices').its('response.statusCode').should('eq', 200); + + pdfInvoicesHelper.downloadFirstInvoice(); + }); + + it('should be able to download first invoice (CXINT-1851)', () => { + pdfInvoicesHelper.downloadLastInvoiceAcrossPages(); + }); + }); +}); diff --git a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/requested-delivery-date/requested-delivery-date.e2e.cy.ts b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/requested-delivery-date/requested-delivery-date.e2e.cy.ts index d430d0c141a..4f591da89a3 100644 --- a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/requested-delivery-date/requested-delivery-date.e2e.cy.ts +++ b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/requested-delivery-date/requested-delivery-date.e2e.cy.ts @@ -50,45 +50,45 @@ describe('Requested Delivery Date', { testIsolation: false }, () => { }); describe('Requested Delivery Date in Checkout Flow', () => { - it('should be able to login as a b2b user', () => { + it('should be able to login as a b2b user (CXINT-1850)', () => { s4Helper.loginS4OMB2bUser(); }); - it('should add a S4 HANA product (TG-11) to cart', () => { + it('should add a S4 HANA product (TG-11) to cart (CXINT-1850)', () => { s4Helper.resetCart(); //clear the cart s4Helper.addB2bS4ProductToCart(); //Ensure that the cart has only 1 S4 product }); - it('should proceed to checkout and select Account payment type', () => { + it('should proceed to checkout and select Account payment type (CXINT-1850)', () => { s4Helper.proceedtoCheckOutS4Product(); b2bCheckout.enterPONumber(rddHelper.poNumber); b2bCheckout.selectAccountPayment(); }); - it('should select shipping address', () => { + it('should select shipping address (CXINT-1850)', () => { s4Helper.selectS4OMAccountShippingAddress(); }); - it('should select delivery mode and display Request Delivery Date form', () => { + it('should select delivery mode and display Request Delivery Date form (CXINT-1850)', () => { rddHelper.selectAccountDeliveryMode(); }); - it('should show an error when an invalid delivery date is provided', () => { + it('should show an error when an invalid delivery date is provided (CXINT-1850)', () => { rddHelper.updateRequestedDeliveryDate('10000-01-01'); rddHelper.verifyDeliveryDateErrorMessage(); }); - it('should show an info message when the delivery date is updated', () => { + it('should show an info message when the delivery date is updated (CXINT-1850)', () => { rddHelper.updateRequestedDeliveryDate(inputDate); rddHelper.verifyDeliveryDateInfoMessage(); }); - it('should review and display the Requested Delivery Date', () => { + it('should review and display the Requested Delivery Date (CXINT-1850)', () => { rddHelper.proceedToOrderReviewPage(); rddHelper.verifyRDDOrderReviewPage(formattedDate); }); - it('should route back to the select delivery mode step when the edit button is clicked', () => { + it('should route back to the select delivery mode step when the edit button is clicked (CXINT-1850)', () => { rddHelper.editDeliveryMethodOrderReviewPage(); rddHelper.proceedToOrderReviewPage(); }); @@ -108,7 +108,7 @@ describe('Requested Delivery Date', { testIsolation: false }, () => { b2bCheckout.placeOrder('/order-confirmation'); }); - it('should display order confirmation summary page with Requested delivery date', () => { + it('should display order confirmation summary page with Requested delivery date (CXINT-1850)', () => { s4Helper.reviewB2bOrderDetail( s4Helper.s4omB2bAccountShipToUser, s4Helper.s4omProduct, @@ -125,7 +125,7 @@ describe('Requested Delivery Date', { testIsolation: false }, () => { }); describe('Requested Delivery Date in Order History', () => { - it('should be able to view order in order history with PO# and Cost center', () => { + it('should be able to view order in order history with PO# and Cost center (CXINT-1850)', () => { cy.visit('/my-account/orders'); const ordersAlias = interceptOrdersEndpoint(); waitForResponse(ordersAlias); @@ -139,7 +139,7 @@ describe('Requested Delivery Date', { testIsolation: false }, () => { ); }); - it('should be able to view a past order detail in order detail page with requested delivery date information', () => { + it('should be able to view a past order detail in order detail page with requested delivery date information (CXINT-1850)', () => { cy.intercept({ method: 'GET', pathname: `${Cypress.env('OCC_PREFIX')}/${Cypress.env( diff --git a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/s4om/s4om-schedule-lines.e2e.cy.ts b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/s4om/s4om-schedule-lines.e2e.cy.ts index 18547e65088..e4eaae27eed 100644 --- a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/s4om/s4om-schedule-lines.e2e.cy.ts +++ b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/s4om/s4om-schedule-lines.e2e.cy.ts @@ -38,39 +38,39 @@ describe('S4HANA Order management', { testIsolation: false }, () => { }); describe('Schedule Lines in Checkout Flow', () => { - it('should be able to login as a b2b user', () => { + it('should be able to login as a b2b user (CXINT-472)', () => { s4omHelper.loginS4OMB2bUser(); }); - it('should add a S4 HANA product (TG-11) to cart', () => { + it('should add a S4 HANA product (TG-11) to cart (CXINT-472)', () => { s4omHelper.resetCart(); //clear the cart s4omHelper.addB2bS4ProductToCart(); //Ensure that the cart has only 1 S4OM product }); - it('should show S4 HANA schedule lines in the add to cart popup', () => { + it('should show S4 HANA schedule lines in the add to cart popup (CXINT-472)', () => { s4omHelper.verifyScheduleLineInfo(); }); - it('should show S4 HANA schedule lines in the Cart page', () => { + it('should show S4 HANA schedule lines in the Cart page (CXINT-472)', () => { s4omHelper.goToCart(); s4omHelper.verifyScheduleLineInfo(); }); - it('should proceed to checkout and select Account payment type', () => { + it('should proceed to checkout and select Account payment type (CXINT-472)', () => { s4omHelper.proceedtoCheckOutS4Product(); b2bCheckout.enterPONumber(); b2bCheckout.selectAccountPayment(); }); - it('should select shipping address', () => { + it('should select shipping address (CXINT-472)', () => { s4omHelper.selectS4OMAccountShippingAddress(); }); - it('should select delivery mode', () => { + it('should select delivery mode (CXINT-472)', () => { s4omHelper.selectAccountDeliveryMode(); }); - it('should review and place order', () => { + it('should review and place order (CXINT-472)', () => { b2bCheckout.reviewB2bReviewOrderPage( b2bAccountShipToUser, s4omHelper.cartWithS4OMB2bProductAndPremiumShipping, @@ -82,7 +82,7 @@ describe('S4HANA Order management', { testIsolation: false }, () => { b2bCheckout.placeOrder('/order-confirmation'); }); - it('should display order confirmation summary page with delivery schedule lines', () => { + it('should display order confirmation summary page with delivery schedule lines (CXINT-472)', () => { s4omHelper.reviewB2bOrderDetail( s4omHelper.s4omB2bAccountShipToUser, s4omHelper.s4omProduct, @@ -98,7 +98,7 @@ describe('S4HANA Order management', { testIsolation: false }, () => { }); }); describe('Schedule lines in Order History', () => { - it('should be able to view order in order history with PO# and Cost center', () => { + it('should be able to view order in order history with PO# and Cost center (CXINT-472)', () => { cy.visit('/my-account/orders'); const ordersAlias = interceptOrdersEndpoint(); waitForResponse(ordersAlias); @@ -113,7 +113,7 @@ describe('S4HANA Order management', { testIsolation: false }, () => { ); }); - it('should be able to view a past order detail in order detail page with schedule line delivery information', () => { + it('should be able to view a past order detail in order detail page with schedule line delivery information (CXINT-472)', () => { cy.intercept({ method: 'GET', pathname: `${Cypress.env('OCC_PREFIX')}/${Cypress.env( diff --git a/projects/storefrontapp-e2e-cypress/cypress/helpers/vendor/pdf-invoices/pdf-invoices.ts b/projects/storefrontapp-e2e-cypress/cypress/helpers/vendor/pdf-invoices/pdf-invoices.ts new file mode 100644 index 00000000000..d0156b8cd65 --- /dev/null +++ b/projects/storefrontapp-e2e-cypress/cypress/helpers/vendor/pdf-invoices/pdf-invoices.ts @@ -0,0 +1,474 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + SampleCartProduct, + SampleProduct, + SampleUser, +} from '../../../sample-data/checkout-flow'; + +export const pdfInvoicesPastOrderId: string = '200000'; +export const poNumber: string = '111'; + +export const pdfInvoicesB2bAccountShipToUser: SampleUser = { + email: 'james.weber@harvestlive.inc', + password: 'welcome', + fullName: 'Stefan Reviewer', + address: { + city: 'Washington, 200000', + line1: 'Address line0, Washington', + }, +}; + +export const cartWithB2bProductAndStandardShipping: SampleCartProduct = { + estimatedShipping: '$5.26', + total: '$2,094.97', + totalAndShipping: '$2,100.23', +}; + +export const pdfInvoicesProduct: SampleProduct = { + name: 'Plier Set (3 Pack)', + code: '637227', +}; + +export const invoiceA = { + createdAt: '2023-09-16T18:29:59+0000', + invoiceId: '200000a', + netAmount: { + currencyIso: 'USD', + value: 115, + }, + totalAmount: { + currencyIso: 'USD', + value: 117, + }, +}; + +export const invoiceB = { + createdAt: '2023-09-01T18:29:59+0000', + invoiceId: '200000b', + netAmount: { + currencyIso: 'USD', + value: 118, + }, + totalAmount: { + currencyIso: 'USD', + value: 120, + }, +}; + +export const invoiceC = { + createdAt: '2023-07-21T18:29:59+0000', + invoiceId: '200000c', + netAmount: { + currencyIso: 'USD', + value: 398, + }, + totalAmount: { + currencyIso: 'USD', + value: 400, + }, +}; + +export const invoiceD = { + createdAt: '2023-06-23T18:29:59+0000', + invoiceId: '200000d', + netAmount: { + currencyIso: 'USD', + value: 115, + }, + totalAmount: { + currencyIso: 'USD', + value: 117, + }, +}; + +export const invoiceE = { + createdAt: '2023-05-12T18:29:59+0000', + invoiceId: '200000e', + netAmount: { + currencyIso: 'USD', + value: 118, + }, + totalAmount: { + currencyIso: 'USD', + value: 120, + }, +}; + +export const invoiceF = { + createdAt: '2022-12-11T18:29:59+0000', + invoiceId: '200000f', + netAmount: { + currencyIso: 'USD', + value: 398, + }, + totalAmount: { + currencyIso: 'USD', + value: 400, + }, +}; + +export const invoiceG = { + createdAt: '2022-11-08T04:59:59+0000', + invoiceId: '200000g', + netAmount: { + currencyIso: 'USD', + value: 115, + }, + totalAmount: { + currencyIso: 'USD', + value: 117, + }, +}; + +export const invoiceH = { + createdAt: '2022-10-06T03:59:59+0000', + invoiceId: '200000h', + netAmount: { + currencyIso: 'USD', + value: 118, + }, + totalAmount: { + currencyIso: 'USD', + value: 120, + }, +}; + +export const invoiceI = { + createdAt: '2022-06-05T03:59:59+0000', + invoiceId: '200000i', + netAmount: { + currencyIso: 'USD', + value: 398, + }, + totalAmount: { + currencyIso: 'USD', + value: 400, + }, +}; + +export const invoiceJ = { + createdAt: '2022-05-04T03:59:59+0000', + invoiceId: '200000j', + netAmount: { + currencyIso: 'USD', + value: 115, + }, + totalAmount: { + currencyIso: 'USD', + value: 117, + }, +}; + +export const invoiceK = { + createdAt: '2021-04-06T03:59:59+0000', + invoiceId: '200000k', + netAmount: { + currencyIso: 'USD', + value: 118, + }, + totalAmount: { + currencyIso: 'USD', + value: 120, + }, +}; + +export const invoiceL = { + createdAt: '2021-02-02T04:59:59+0000', + invoiceId: '200000l', + netAmount: { + currencyIso: 'USD', + value: 398, + }, + totalAmount: { + currencyIso: 'USD', + value: 400, + }, +}; + +export const invoiceM = { + createdAt: '2019-11-18T04:59:59+0000', + invoiceId: '200000m', + netAmount: { + currencyIso: 'USD', + value: 115, + }, + totalAmount: { + currencyIso: 'USD', + value: 117, + }, +}; + +export const invoiceN = { + createdAt: '2018-12-01T04:59:59+0000', + invoiceId: '200000n', + netAmount: { + currencyIso: 'USD', + value: 118, + }, + totalAmount: { + currencyIso: 'USD', + value: 120, + }, +}; + +export const invoiceO = { + createdAt: '2017-11-22T04:59:59+0000', + invoiceId: '200000o', + netAmount: { + currencyIso: 'USD', + value: 398, + }, + totalAmount: { + currencyIso: 'USD', + value: 400, + }, +}; + +export const invoiceP = { + createdAt: '2016-11-20T04:59:59+0000', + invoiceId: '200000p', + netAmount: { + currencyIso: 'USD', + value: 115, + }, + totalAmount: { + currencyIso: 'USD', + value: 117, + }, +}; + +export const invoiceQ = { + createdAt: '2016-11-18T04:59:59+0000', + invoiceId: '200000q', + netAmount: { + currencyIso: 'USD', + value: 118, + }, + totalAmount: { + currencyIso: 'USD', + value: 120, + }, +}; + +export const initialInvoicesData = { + page1: [invoiceA, invoiceB, invoiceC, invoiceD, invoiceE], + page2: [invoiceF, invoiceG, invoiceH, invoiceI, invoiceJ], + page3: [invoiceK, invoiceL, invoiceM, invoiceN, invoiceO], + page4: [invoiceP, invoiceQ], +}; + +export const sortByDateAscInvoicesData = { + page1: [invoiceQ, invoiceP, invoiceO, invoiceN, invoiceM], + page2: [invoiceL, invoiceK, invoiceJ, invoiceI, invoiceH], + page3: [invoiceG, invoiceF, invoiceE, invoiceD, invoiceC], + page4: [invoiceB, invoiceA], +}; + +export const sortByDateDescInvoicesData = { + ...initialInvoicesData, +}; + +export const sortByNetAmtAscInvoicesData = { + page1: [invoiceP, invoiceA, invoiceD, invoiceJ, invoiceG], + page2: [invoiceM, invoiceE, invoiceK, invoiceH, invoiceB], + page3: [invoiceN, invoiceQ, invoiceO, invoiceC, invoiceI], + page4: [invoiceL, invoiceF], +}; + +export const sortByNetAmtDescInvoicesData = { + page1: [invoiceO, invoiceC, invoiceI, invoiceL, invoiceF], + page2: [invoiceE, invoiceK, invoiceH, invoiceB, invoiceN], + page3: [invoiceQ, invoiceP, invoiceA, invoiceD, invoiceJ], + page4: [invoiceG, invoiceM], +}; + +export const sortByTotalAmtAscInvoicesData = { + ...sortByNetAmtAscInvoicesData, +}; + +export const sortByTotalAmtDescInvoicesData = { + ...sortByNetAmtDescInvoicesData, +}; + +export const sortByInvoiceIdAscInvoicesData = { + ...initialInvoicesData, +}; + +export const sortByInvoiceIdDescInvoicesData = { + page1: [invoiceQ, invoiceP, invoiceO, invoiceN, invoiceM], + page2: [invoiceL, invoiceK, invoiceJ, invoiceI, invoiceH], + page3: [invoiceG, invoiceF, invoiceE, invoiceD, invoiceC], + page4: [invoiceB, invoiceA], +}; + +export function verifyPDFInvoicesOrderDetailPage() { + checkTableData(initialInvoicesData.page1); +} + +export function verifyInvoicesTablePagination( + invoicesData = initialInvoicesData +) { + let index = 2; + + for (let invoiceData in invoicesData) { + checkTableData(invoicesData[invoiceData]); + if (index <= 4) { + moveToNextPage(index); + index += 1; + } + } +} +export function verifyInvoicesTableDownlodPDF() { + throw new Error('Function not implemented.'); +} + +export function verifyInvoicesTableSortByDateAscending() { + clickOnSortOptions('Date Ascending'); + verifyInvoicesTablePagination(sortByDateAscInvoicesData); +} + +export function verifyInvoicesTableSortByDateDescending() { + clickOnSortOptions('Date Descending'); + verifyInvoicesTablePagination(sortByDateDescInvoicesData); +} + +export function verifyInvoicesTableSortByInvoiceNumAscending() { + clickOnSortOptions('Invoice Number Ascending'); + verifyInvoicesTablePagination(sortByInvoiceIdAscInvoicesData); +} + +export function verifyInvoicesTableSortByInvoiceNumDescending() { + clickOnSortOptions('Invoice Number Descending'); + verifyInvoicesTablePagination(sortByInvoiceIdDescInvoicesData); +} + +export function verifyInvoicesTableSortByNetAmountAscending() { + clickOnSortOptions('Net Amount Ascending'); + verifyInvoicesTablePagination(sortByNetAmtAscInvoicesData); +} + +export function verifyInvoicesTableSortByNetAmountDescending() { + clickOnSortOptions('Net Amount Descending'); + verifyInvoicesTablePagination(sortByNetAmtDescInvoicesData); +} + +export function verifyInvoicesTableSortByTotalAmountAscending() { + clickOnSortOptions('Total Amount Ascending'); + verifyInvoicesTablePagination(sortByTotalAmtAscInvoicesData); +} + +export function verifyInvoicesTableSortByTotalAmountDescending() { + clickOnSortOptions('Total Amount Descending'); + verifyInvoicesTablePagination(sortByTotalAmtDescInvoicesData); +} + +export function clickOnSortOptions(sortOptionText: string) { + cy.get('cx-sorting').click(); + cy.get('.ng-option').contains(sortOptionText).click(); +} + +export function checkTableData( + rows: Array<{ + invoiceId?: string; + externalSystemId?: string; + createdAt?: string; + netAmount?: { + currencyIso?: string; + value?: number; + formattedValue?: string; + }; + totalAmount?: { + currencyIso?: string; + value?: number; + formattedValue?: string; + }; + }> +) { + cy.get('.cx-invoices-list-row').its('length').should('eq', rows.length); + + const columns: Array<{ + field: string; + class: string; + occurrence: number; + }> = [ + { field: 'invoiceId', class: 'code', occurrence: 0 }, + { field: 'createdAt', class: 'date', occurrence: 0 }, + { field: 'netAmount', class: 'monetary', occurrence: 0 }, + { field: 'totalAmount', class: 'monetary', occurrence: 1 }, + ]; + // For each row, check each column + rows.forEach((row, rowNumber) => { + columns.forEach((column) => { + //Handle amount fields separately + if ( + (column.field === 'netAmount' || column.field === 'totalAmount') && + row[column.field] + ) { + //handle amount fields + if (row[column.field].formattedValue) { + cy.get('.cx-invoices-list-row') + .eq(rowNumber) + .find(`.cx-invoices-list-${column.class}`) + .eq(column.occurrence) + .contains(row[column.field].formattedValue); + } else { + cy.get('.cx-invoices-list-row') + .eq(rowNumber) + .find(`.cx-invoices-list-${column.class}`) + .eq(column.occurrence) + .contains( + `${row[column.field].currencyIso} ${row[column.field].value}` + ); + } + } else if (column.field === 'createdAt' && row[column.field]) { + //handle date fields + cy.get('.cx-invoices-list-row') + .eq(rowNumber) + .find(`.cx-invoices-list-${column.class}`) + .eq(column.occurrence) + .contains(formatDateToLongLocaleDate(row[column.field])); + } else if (row[column.field]) { + //handle other fields + cy.get('.cx-invoices-list-row') + .eq(rowNumber) + .find(`.cx-invoices-list-${column.class}`) + .eq(column.occurrence) + .contains(row[column.field]); + } + }); + }); +} + +export function downloadFirstInvoice() { + cy.intercept({ + method: 'GET', + path: `**/users/current/**/invoices/**/download**`, + }).as('getAttachments'); + cy.get('.cx-invoices-list-row button').first().click(); + cy.wait('@getAttachments').its('response.statusCode').should('eq', 200); +} + +export function downloadLastInvoiceAcrossPages() { + for (let index = 2; index <= 4; index++) { + downloadFirstInvoice(); + moveToNextPage(index); + } +} + +//Format the date into a long date, eg. September 15, 2023 +export function formatDateToLongLocaleDate(date: string) { + return new Date(date).toLocaleDateString('en', { + year: 'numeric', + month: 'long', + day: 'numeric', + }); +} + +export function moveToNextPage(index: number) { + cy.get('cx-pagination').findByText(index).first().click(); +} diff --git a/projects/storefrontapp/project.json b/projects/storefrontapp/project.json index d52aecd7154..6380eb5e505 100644 --- a/projects/storefrontapp/project.json +++ b/projects/storefrontapp/project.json @@ -49,6 +49,10 @@ "input": "projects/storefrontapp/src/styles/lib-storefinder.scss", "bundleName": "storefinder" }, + { + "input": "projects/storefrontapp/src/styles/lib-pdf-invoices.scss", + "bundleName": "pdf-invoices" + }, { "input": "projects/storefrontapp/src/styles/lib-product.scss", "bundleName": "product" diff --git a/projects/storefrontapp/src/app/spartacus/features/pdf-invoices/pdf-invoices-feature.module.ts b/projects/storefrontapp/src/app/spartacus/features/pdf-invoices/pdf-invoices-feature.module.ts new file mode 100644 index 00000000000..cfd2e9e6e84 --- /dev/null +++ b/projects/storefrontapp/src/app/spartacus/features/pdf-invoices/pdf-invoices-feature.module.ts @@ -0,0 +1,38 @@ +/* + * SPDX-FileCopyrightText: 2023 SAP Spartacus team + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { NgModule } from '@angular/core'; +import { CmsConfig, I18nConfig, provideConfig } from '@spartacus/core'; +import { + pdfInvoicesTranslationChunksConfig, + pdfInvoicesTranslations, +} from '@spartacus/pdf-invoices/assets'; +import { + PDFInvoicesRootModule, + PDF_INVOICES_FEATURE, +} from '@spartacus/pdf-invoices/root'; + +@NgModule({ + imports: [PDFInvoicesRootModule], + providers: [ + provideConfig({ + featureModules: { + [PDF_INVOICES_FEATURE]: { + module: () => + import('@spartacus/pdf-invoices').then((m) => m.PDFInvoicesModule), + }, + }, + }), + provideConfig({ + i18n: { + resources: pdfInvoicesTranslations, + chunks: pdfInvoicesTranslationChunksConfig, + fallbackLang: 'en', + }, + }), + ], +}) +export class PDFInvoicesFeatureModule {} diff --git a/projects/storefrontapp/src/app/spartacus/spartacus-features.module.ts b/projects/storefrontapp/src/app/spartacus/spartacus-features.module.ts index 64a36f93193..d910c0d57fb 100644 --- a/projects/storefrontapp/src/app/spartacus/spartacus-features.module.ts +++ b/projects/storefrontapp/src/app/spartacus/spartacus-features.module.ts @@ -76,6 +76,7 @@ import { AccountSummaryFeatureModule } from './features/organization/organizatio import { AdministrationFeatureModule } from './features/organization/organization-administration-feature.module'; import { OrderApprovalFeatureModule } from './features/organization/organization-order-approval-feature.module'; import { UnitOrderFeatureModule } from './features/organization/organization-unit-order-feature.module'; +import { PDFInvoicesFeatureModule } from './features/pdf-invoices/pdf-invoices-feature.module'; import { PickupInStoreFeatureModule } from './features/pickup-in-store/pickup-in-store-feature.module'; import { ProductConfiguratorRulebasedFeatureModule } from './features/product-configurator/product-configurator-rulebased-feature.module'; import { ProductConfiguratorTextfieldFeatureModule } from './features/product-configurator/product-configurator-textfield-feature.module'; @@ -121,6 +122,9 @@ if (environment.digitalPayments) { if (environment.epdVisualization) { featureModules.push(EpdVisualizationFeatureModule); } +if (environment.pdfInvoices) { + featureModules.push(PDFInvoicesFeatureModule); +} if (environment.s4om) { featureModules.push(S4OMFeatureModule); } diff --git a/projects/storefrontapp/src/environments/environment.prod.ts b/projects/storefrontapp/src/environments/environment.prod.ts index 52f3d2609ca..017295dc574 100644 --- a/projects/storefrontapp/src/environments/environment.prod.ts +++ b/projects/storefrontapp/src/environments/environment.prod.ts @@ -19,4 +19,5 @@ export const environment: Environment = { s4om: buildProcess.env.CX_S4OM, segmentRefs: buildProcess.env.CX_SEGMENT_REFS, requestedDeliveryDate: buildProcess.env.CX_REQUESTED_DELIVERY_DATE, + pdfInvoices: buildProcess.env.CX_PDF_INVOICES, }; diff --git a/projects/storefrontapp/src/environments/environment.ts b/projects/storefrontapp/src/environments/environment.ts index 18033dad14d..0e0579d6f5e 100644 --- a/projects/storefrontapp/src/environments/environment.ts +++ b/projects/storefrontapp/src/environments/environment.ts @@ -32,4 +32,5 @@ export const environment: Environment = { s4om: buildProcess.env.CX_S4OM ?? false, segmentRefs: buildProcess.env.CX_SEGMENT_REFS ?? false, requestedDeliveryDate: buildProcess.env.CX_REQUESTED_DELIVERY_DATE ?? false, + pdfInvoices: buildProcess.env.CX_PDF_INVOICES ?? false, }; diff --git a/projects/storefrontapp/src/environments/models/build.process.env.d.ts b/projects/storefrontapp/src/environments/models/build.process.env.d.ts index b6e0f46055d..9a5d54a6df2 100644 --- a/projects/storefrontapp/src/environments/models/build.process.env.d.ts +++ b/projects/storefrontapp/src/environments/models/build.process.env.d.ts @@ -21,4 +21,5 @@ interface Env { CX_S4OM: boolean; CX_SEGMENT_REFS: boolean; CX_REQUESTED_DELIVERY_DATE: boolean; + CX_PDF_INVOICES: boolean; } diff --git a/projects/storefrontapp/src/environments/models/environment.model.ts b/projects/storefrontapp/src/environments/models/environment.model.ts index 4e6b60e944d..afca9e66a89 100644 --- a/projects/storefrontapp/src/environments/models/environment.model.ts +++ b/projects/storefrontapp/src/environments/models/environment.model.ts @@ -17,4 +17,5 @@ export interface Environment { s4om: boolean; segmentRefs: boolean; requestedDeliveryDate: boolean; + pdfInvoices: boolean; } diff --git a/projects/storefrontapp/src/styles/lib-pdf-invoices.scss b/projects/storefrontapp/src/styles/lib-pdf-invoices.scss new file mode 100644 index 00000000000..07362c045b4 --- /dev/null +++ b/projects/storefrontapp/src/styles/lib-pdf-invoices.scss @@ -0,0 +1,2 @@ +@import '../styles-config'; +@import '@spartacus/pdf-invoices'; diff --git a/projects/storefrontapp/tsconfig.app.prod.json b/projects/storefrontapp/tsconfig.app.prod.json index e0859d2d97d..b7fbdaf7666 100644 --- a/projects/storefrontapp/tsconfig.app.prod.json +++ b/projects/storefrontapp/tsconfig.app.prod.json @@ -178,6 +178,12 @@ "@spartacus/organization/user-registration/root": [ "dist/organization/user-registration/root" ], + "@spartacus/pdf-invoices/assets": ["dist/pdf-invoices/assets"], + "@spartacus/pdf-invoices/components": ["dist/pdf-invoices/components"], + "@spartacus/pdf-invoices/core": ["dist/pdf-invoices/core"], + "@spartacus/pdf-invoices": ["dist/pdf-invoices"], + "@spartacus/pdf-invoices/occ": ["dist/pdf-invoices/occ"], + "@spartacus/pdf-invoices/root": ["dist/pdf-invoices/root"], "@spartacus/pickup-in-store/assets": ["dist/pickup-in-store/assets"], "@spartacus/pickup-in-store/components": [ "dist/pickup-in-store/components" diff --git a/projects/storefrontapp/tsconfig.server.json b/projects/storefrontapp/tsconfig.server.json index 6f403d19066..60f59fa3fb3 100644 --- a/projects/storefrontapp/tsconfig.server.json +++ b/projects/storefrontapp/tsconfig.server.json @@ -261,6 +261,22 @@ "@spartacus/organization/user-registration/root": [ "../../feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "../../feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "../../feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "../../feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"], + "@spartacus/pdf-invoices/occ": [ + "../../feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "../../feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "../../feature-libs/pickup-in-store/assets/public_api" ], diff --git a/projects/storefrontapp/tsconfig.server.prod.json b/projects/storefrontapp/tsconfig.server.prod.json index 9b61f0ef35b..877a6287450 100644 --- a/projects/storefrontapp/tsconfig.server.prod.json +++ b/projects/storefrontapp/tsconfig.server.prod.json @@ -199,6 +199,14 @@ "@spartacus/organization/user-registration/root": [ "../../dist/organization/user-registration/root" ], + "@spartacus/pdf-invoices/assets": ["../../dist/pdf-invoices/assets"], + "@spartacus/pdf-invoices/components": [ + "../../dist/pdf-invoices/components" + ], + "@spartacus/pdf-invoices/core": ["../../dist/pdf-invoices/core"], + "@spartacus/pdf-invoices": ["../../dist/pdf-invoices"], + "@spartacus/pdf-invoices/occ": ["../../dist/pdf-invoices/occ"], + "@spartacus/pdf-invoices/root": ["../../dist/pdf-invoices/root"], "@spartacus/pickup-in-store/assets": [ "../../dist/pickup-in-store/assets" ], diff --git a/scripts/install/functions.sh b/scripts/install/functions.sh index 43ec075e050..df92a810142 100644 --- a/scripts/install/functions.sh +++ b/scripts/install/functions.sh @@ -130,6 +130,18 @@ function add_s4om { fi } +function add_requested_delivery_date { + if [ "$ADD_REQUESTED_DELIVERY_DATE" = true ] ; then + ng add --skip-confirmation @spartacus/requested-delivery-date@${SPARTACUS_VERSION} --interactive false + fi +} + +function add_pdf_invoices { + if [ "$ADD_PDF_INVOICES" = true ] ; then + ng add --skip-confirmation @spartacus/pdf-invoices@${SPARTACUS_VERSION} --interactive false + fi +} + # Don't install b2b features here (use add_b2b function for that) function add_feature_libs { ng add @spartacus/tracking@${SPARTACUS_VERSION} --skip-confirmation --no-interactive @@ -157,6 +169,8 @@ function add_spartacus_csr { add_epd_visualization add_product_configurator add_s4om + add_requested_delivery_date + add_pdf_invoices remove_npmrc ) } @@ -179,6 +193,8 @@ function add_spartacus_ssr { add_epd_visualization add_product_configurator add_s4om + add_requested_delivery_date + add_pdf_invoices remove_npmrc ) } @@ -200,6 +216,8 @@ function add_spartacus_ssr_pwa { add_epd_visualization add_product_configurator add_s4om + add_requested_delivery_date + add_pdf_invoices remove_npmrc ) } @@ -704,6 +722,16 @@ function parseInstallArgs { echo "âž– Added S4OM" shift ;; + rdd) + ADD_REQUESTED_DELIVERY_DATE=true + echo "âž– Added Requested Delivery Date" + shift + ;; + invoices) + ADD_PDF_INVOICES=true + echo "âž– Added PDF Invoices" + shift + ;; -*|--*) echo "Unknown option $1" exit 1 diff --git a/tools/schematics/testing.ts b/tools/schematics/testing.ts index 76f198673a0..10f7ca29806 100644 --- a/tools/schematics/testing.ts +++ b/tools/schematics/testing.ts @@ -17,6 +17,7 @@ const featureLibsFolders: string[] = [ 'order', 'checkout', 'organization', + 'pdf-invoices', 'pickup-in-store', 'product', 'product-configurator', @@ -50,6 +51,7 @@ const commands = [ 'build digital-payments/schematics', 'build epd-visualization/schematics', 'build organization/schematics', + 'build pdf-invoices/schematics', 'build pickup-in-store/schematics', 'build product/schematics', 'build product-configurator/schematics', @@ -199,6 +201,7 @@ async function executeCommand(command: Command): Promise { case 'build digital-payments/schematics': case 'build epd-visualization/schematics': case 'build organization/schematics': + case 'build pdf-invoices/schematics': case 'build pickup-in-store/schematics': case 'build product/schematics': case 'build product-configurator/schematics': diff --git a/tsconfig.compodoc.json b/tsconfig.compodoc.json index 82f956d5202..e8b78ac66f1 100644 --- a/tsconfig.compodoc.json +++ b/tsconfig.compodoc.json @@ -311,6 +311,24 @@ "@spartacus/organization/user-registration/root": [ "feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": [ + "feature-libs/pdf-invoices/public_api" + ], + "@spartacus/pdf-invoices/occ": [ + "feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "feature-libs/pickup-in-store/assets/public_api" ], diff --git a/tsconfig.json b/tsconfig.json index 37eccea84ef..c6a9539cecc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -260,6 +260,24 @@ "@spartacus/organization/user-registration/root": [ "feature-libs/organization/user-registration/root/public_api" ], + "@spartacus/pdf-invoices/assets": [ + "feature-libs/pdf-invoices/assets/public_api" + ], + "@spartacus/pdf-invoices/components": [ + "feature-libs/pdf-invoices/components/public_api" + ], + "@spartacus/pdf-invoices/core": [ + "feature-libs/pdf-invoices/core/public_api" + ], + "@spartacus/pdf-invoices": [ + "feature-libs/pdf-invoices/public_api" + ], + "@spartacus/pdf-invoices/occ": [ + "feature-libs/pdf-invoices/occ/public_api" + ], + "@spartacus/pdf-invoices/root": [ + "feature-libs/pdf-invoices/root/public_api" + ], "@spartacus/pickup-in-store/assets": [ "feature-libs/pickup-in-store/assets/public_api" ], From b5f836aa284627358b0d421b0c86c747828e6039 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Sep 2023 18:16:22 -0400 Subject: [PATCH 11/19] chore(deps): bump @cypress/request, @testing-library/cypress and cypress in /projects/storefrontapp-e2e-cypress (#17834) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Cordero Ortiz Co-authored-by: Giancarlo Cordero Ortiz <46171897+giancorderoortiz@users.noreply.github.com> --- .../package-lock.json | 1336 ++++++++++++++--- .../storefrontapp-e2e-cypress/package.json | 4 +- 2 files changed, 1163 insertions(+), 177 deletions(-) diff --git a/projects/storefrontapp-e2e-cypress/package-lock.json b/projects/storefrontapp-e2e-cypress/package-lock.json index 1701d2bd87f..a10f3517be8 100644 --- a/projects/storefrontapp-e2e-cypress/package-lock.json +++ b/projects/storefrontapp-e2e-cypress/package-lock.json @@ -12,9 +12,9 @@ "@babel/core": "^7.14.3", "@babel/preset-env": "^7.14.2", "@cypress/webpack-preprocessor": "^5.9.1", - "@testing-library/cypress": "9.0.0", + "@testing-library/cypress": "10.0.1", "babel-loader": "^8.2.2", - "cypress": "12.6.0", + "cypress": "13.2.0", "cypress-file-upload": "^5.0.8", "ts-loader": "^9.4.2", "typescript": "^4.2.4", @@ -1630,9 +1630,9 @@ } }, "node_modules/@cypress/request": { - "version": "2.88.10", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", - "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", + "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", "dev": true, "dependencies": { "aws-sign2": "~0.7.0", @@ -1648,9 +1648,9 @@ "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "performance-now": "^2.1.0", - "qs": "~6.5.2", + "qs": "6.10.4", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", + "tough-cookie": "^4.1.3", "tunnel-agent": "^0.6.0", "uuid": "^8.3.2" }, @@ -1766,39 +1766,39 @@ } }, "node_modules/@testing-library/cypress": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-9.0.0.tgz", - "integrity": "sha512-c1XiCGeHGGTWn0LAU12sFUfoX3qfId5gcSE2yHode+vsyHDWraxDPALjVnHd4/Fa3j4KBcc5k++Ccy6A9qnkMA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-10.0.1.tgz", + "integrity": "sha512-e8uswjTZIBhaIXjzEcrQQ8nHRWHgZH7XBxKuIWxZ/T7FxfWhCR48nFhUX5nfPizjVOKSThEfOSv67jquc1ASkw==", "dev": true, "dependencies": { "@babel/runtime": "^7.14.6", - "@testing-library/dom": "^8.1.0" + "@testing-library/dom": "^9.0.0" }, "engines": { "node": ">=12", "npm": ">=6" }, "peerDependencies": { - "cypress": "^12.0.0" + "cypress": "^12.0.0 || ^13.0.0" } }, "node_modules/@testing-library/dom": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.13.0.tgz", - "integrity": "sha512-9VHgfIatKNXQNaZTtLnalIy0jNZzY35a4S3oi08YAt9Hv1VsfZ/DfA45lM8D/UhtHBGJ4/lGwp0PZkVndRkoOQ==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.1.tgz", + "integrity": "sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", - "@types/aria-query": "^4.2.0", - "aria-query": "^5.0.0", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.4.4", + "lz-string": "^1.5.0", "pretty-format": "^27.0.2" }, "engines": { - "node": ">=12" + "node": ">=14" } }, "node_modules/@testing-library/dom/node_modules/ansi-styles": { @@ -1872,9 +1872,9 @@ } }, "node_modules/@types/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", + "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==", "dev": true }, "node_modules/@types/eslint": { @@ -1910,9 +1910,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "14.18.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.18.tgz", - "integrity": "sha512-B9EoJFjhqcQ9OmQrNorItO+OwEOORNn3S31WuiHvZY/dm9ajkB7AKD/8toessEtHHNL+58jofbq7hMMY9v4yig==", + "version": "18.17.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.15.tgz", + "integrity": "sha512-2yrWpBk32tvV/JAd3HNHWuZn/VDN1P+72hWirHnvsvTGSqbANi+kSeuQR9yAHnbvaBvHDsoTdXV0Fe+iRtHLKA==", "dev": true }, "node_modules/@types/sinonjs__fake-timers": { @@ -2220,12 +2220,25 @@ ] }, "node_modules/aria-query": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", "dev": true, - "engines": { - "node": ">=6.0" + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/asn1": { @@ -2276,6 +2289,18 @@ "node": ">= 4.0.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -2286,9 +2311,9 @@ } }, "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true }, "node_modules/babel-loader": { @@ -2671,9 +2696,9 @@ } }, "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "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" @@ -2735,7 +2760,7 @@ "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "dev": true }, "node_modules/cross-spawn": { @@ -2753,15 +2778,15 @@ } }, "node_modules/cypress": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.6.0.tgz", - "integrity": "sha512-WdHSVaS1lumSd5XpVTslZd8ui9GIGphrzvXq9+3DtVhqjRZC5M70gu5SW/Y/SLPq3D1wiXGZoHC6HJ7ESVE2lw==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.2.0.tgz", + "integrity": "sha512-AvDQxBydE771GTq0TR4ZUBvv9m9ffXuB/ueEtpDF/6gOcvFR96amgwSJP16Yhqw6VhmwqspT5nAGzoxxB+D89g==", "dev": true, "hasInstallScript": true, "dependencies": { - "@cypress/request": "^2.88.10", + "@cypress/request": "^3.0.0", "@cypress/xvfb": "^1.2.4", - "@types/node": "^14.14.31", + "@types/node": "^18.17.5", "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", "arch": "^2.2.0", @@ -2773,7 +2798,7 @@ "check-more-types": "^2.24.0", "cli-cursor": "^3.1.0", "cli-table3": "~0.6.1", - "commander": "^5.1.0", + "commander": "^6.2.1", "common-tags": "^1.8.0", "dayjs": "^1.10.4", "debug": "^4.3.4", @@ -2791,12 +2816,13 @@ "listr2": "^3.8.3", "lodash": "^4.17.21", "log-symbols": "^4.0.0", - "minimist": "^1.2.6", + "minimist": "^1.2.8", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", + "process": "^0.11.10", "proxy-from-env": "1.0.0", "request-progress": "^3.0.0", - "semver": "^7.3.2", + "semver": "^7.5.3", "supports-color": "^8.1.1", "tmp": "~0.2.1", "untildify": "^4.0.0", @@ -2806,7 +2832,7 @@ "cypress": "bin/cypress" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=18.0.0" + "node": "^16.0.0 || ^18.0.0 || >=20.0.0" } }, "node_modules/cypress-file-upload": { @@ -2898,9 +2924,9 @@ } }, "node_modules/cypress/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -2930,7 +2956,7 @@ "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "dependencies": { "assert-plus": "^1.0.0" @@ -2962,12 +2988,56 @@ } } }, + "node_modules/deep-equal": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", + "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.1", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-data-property": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", + "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2981,22 +3051,22 @@ "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk= sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/dom-accessibility-api": { - "version": "0.5.14", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", - "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, "dependencies": { "jsbn": "~0.1.0", @@ -3058,6 +3128,26 @@ "node": ">=8.6" } }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", @@ -3213,7 +3303,7 @@ "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true, "engines": [ "node >=0.6.0" @@ -3297,10 +3387,19 @@ "node": ">=8" } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true, "engines": { "node": "*" @@ -3347,6 +3446,15 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -3357,13 +3465,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { @@ -3397,7 +3506,7 @@ "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "dependencies": { "assert-plus": "^1.0.0" @@ -3453,6 +3562,18 @@ "node": ">=4" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -3471,6 +3592,15 @@ "node": ">= 0.4.0" } }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -3492,6 +3622,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -3504,6 +3646,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/http-signature": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", @@ -3581,6 +3738,90 @@ "node": ">=10" } }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-ci": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", @@ -3605,6 +3846,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -3630,6 +3886,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -3639,6 +3904,21 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -3648,6 +3928,43 @@ "node": ">=8" } }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -3660,10 +3977,55 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, "node_modules/is-unicode-supported": { @@ -3678,6 +4040,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -3687,7 +4077,7 @@ "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, "node_modules/jest-worker": { @@ -3737,7 +4127,7 @@ "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM= sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, "node_modules/jsesc": { @@ -3773,7 +4163,7 @@ "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "node_modules/json5": { @@ -4085,9 +4475,9 @@ } }, "node_modules/lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "bin": { "lz-string": "bin/bin.js" @@ -4170,10 +4560,13 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/ms": { "version": "2.1.2", @@ -4205,6 +4598,31 @@ "node": ">=8" } }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -4355,7 +4773,7 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true }, "node_modules/picocolors": { @@ -4435,6 +4853,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/process": { + "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" + } + }, "node_modules/proxy-from-env": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", @@ -4442,9 +4869,9 @@ "dev": true }, "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, "node_modules/pump": { @@ -4467,14 +4894,26 @@ } }, "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", + "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -4523,6 +4962,23 @@ "@babel/runtime": "^7.8.4" } }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regexpu-core": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", @@ -4576,6 +5032,12 @@ "throttleit": "^1.0.0" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -4684,6 +5146,20 @@ "randombytes": "^2.1.0" } }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4705,6 +5181,20 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -4799,7 +5289,19 @@ "sshpk-verify": "bin/sshpk-verify" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/string-width": { @@ -4992,16 +5494,27 @@ } }, "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "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==", "dev": true, "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { - "node": ">=0.8" + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" } }, "node_modules/ts-loader": { @@ -5117,7 +5630,7 @@ "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "dependencies": { "safe-buffer": "^5.0.1" @@ -5129,7 +5642,7 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, "node_modules/type-fest": { @@ -5250,6 +5763,16 @@ "punycode": "^2.1.0" } }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -5262,7 +5785,7 @@ "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, "engines": [ "node >=0.6.0" @@ -5375,6 +5898,56 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -6567,9 +7140,9 @@ "optional": true }, "@cypress/request": { - "version": "2.88.10", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", - "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", + "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -6585,9 +7158,9 @@ "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "performance-now": "^2.1.0", - "qs": "~6.5.2", + "qs": "6.10.4", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", + "tough-cookie": "^4.1.3", "tunnel-agent": "^0.6.0", "uuid": "^8.3.2" } @@ -6686,28 +7259,28 @@ } }, "@testing-library/cypress": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-9.0.0.tgz", - "integrity": "sha512-c1XiCGeHGGTWn0LAU12sFUfoX3qfId5gcSE2yHode+vsyHDWraxDPALjVnHd4/Fa3j4KBcc5k++Ccy6A9qnkMA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-10.0.1.tgz", + "integrity": "sha512-e8uswjTZIBhaIXjzEcrQQ8nHRWHgZH7XBxKuIWxZ/T7FxfWhCR48nFhUX5nfPizjVOKSThEfOSv67jquc1ASkw==", "dev": true, "requires": { "@babel/runtime": "^7.14.6", - "@testing-library/dom": "^8.1.0" + "@testing-library/dom": "^9.0.0" } }, "@testing-library/dom": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.13.0.tgz", - "integrity": "sha512-9VHgfIatKNXQNaZTtLnalIy0jNZzY35a4S3oi08YAt9Hv1VsfZ/DfA45lM8D/UhtHBGJ4/lGwp0PZkVndRkoOQ==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.1.tgz", + "integrity": "sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", - "@types/aria-query": "^4.2.0", - "aria-query": "^5.0.0", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.4.4", + "lz-string": "^1.5.0", "pretty-format": "^27.0.2" }, "dependencies": { @@ -6763,9 +7336,9 @@ } }, "@types/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", + "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==", "dev": true }, "@types/eslint": { @@ -6801,9 +7374,9 @@ "dev": true }, "@types/node": { - "version": "14.18.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.18.tgz", - "integrity": "sha512-B9EoJFjhqcQ9OmQrNorItO+OwEOORNn3S31WuiHvZY/dm9ajkB7AKD/8toessEtHHNL+58jofbq7hMMY9v4yig==", + "version": "18.17.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.15.tgz", + "integrity": "sha512-2yrWpBk32tvV/JAd3HNHWuZn/VDN1P+72hWirHnvsvTGSqbANi+kSeuQR9yAHnbvaBvHDsoTdXV0Fe+iRtHLKA==", "dev": true }, "@types/sinonjs__fake-timers": { @@ -7065,10 +7638,23 @@ "dev": true }, "aria-query": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", - "dev": true + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "requires": { + "deep-equal": "^2.0.5" + } + }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } }, "asn1": { "version": "0.2.6", @@ -7109,6 +7695,12 @@ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -7116,9 +7708,9 @@ "dev": true }, "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true }, "babel-loader": { @@ -7387,9 +7979,9 @@ } }, "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true }, "common-tags": { @@ -7440,7 +8032,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "dev": true }, "cross-spawn": { @@ -7455,14 +8047,14 @@ } }, "cypress": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.6.0.tgz", - "integrity": "sha512-WdHSVaS1lumSd5XpVTslZd8ui9GIGphrzvXq9+3DtVhqjRZC5M70gu5SW/Y/SLPq3D1wiXGZoHC6HJ7ESVE2lw==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.2.0.tgz", + "integrity": "sha512-AvDQxBydE771GTq0TR4ZUBvv9m9ffXuB/ueEtpDF/6gOcvFR96amgwSJP16Yhqw6VhmwqspT5nAGzoxxB+D89g==", "dev": true, "requires": { - "@cypress/request": "^2.88.10", + "@cypress/request": "^3.0.0", "@cypress/xvfb": "^1.2.4", - "@types/node": "^14.14.31", + "@types/node": "^18.17.5", "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", "arch": "^2.2.0", @@ -7474,7 +8066,7 @@ "check-more-types": "^2.24.0", "cli-cursor": "^3.1.0", "cli-table3": "~0.6.1", - "commander": "^5.1.0", + "commander": "^6.2.1", "common-tags": "^1.8.0", "dayjs": "^1.10.4", "debug": "^4.3.4", @@ -7492,12 +8084,13 @@ "listr2": "^3.8.3", "lodash": "^4.17.21", "log-symbols": "^4.0.0", - "minimist": "^1.2.6", + "minimist": "^1.2.8", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", + "process": "^0.11.10", "proxy-from-env": "1.0.0", "request-progress": "^3.0.0", - "semver": "^7.3.2", + "semver": "^7.5.3", "supports-color": "^8.1.1", "tmp": "~0.2.1", "untildify": "^4.0.0", @@ -7562,9 +8155,9 @@ "dev": true }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -7591,7 +8184,7 @@ "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -7612,12 +8205,50 @@ "ms": "2.1.2" } }, + "deep-equal": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", + "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.1", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + } + }, + "define-data-property": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", + "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "requires": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } @@ -7625,19 +8256,19 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk= sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, "dom-accessibility-api": { - "version": "0.5.14", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", - "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, "requires": { "jsbn": "~0.1.0", @@ -7690,6 +8321,23 @@ "ansi-colors": "^4.1.1" } }, + "es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + } + }, "es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", @@ -7806,7 +8454,7 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true }, "fast-deep-equal": { @@ -7869,10 +8517,19 @@ "path-exists": "^4.0.0" } }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true }, "form-data": { @@ -7910,6 +8567,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -7917,13 +8580,14 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" } }, @@ -7948,7 +8612,7 @@ "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -7989,6 +8653,15 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -8004,6 +8677,12 @@ "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -8019,12 +8698,27 @@ "get-intrinsic": "^1.1.1" } }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "http-signature": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", @@ -8076,6 +8770,63 @@ "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "dev": true }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, "is-ci": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", @@ -8094,6 +8845,15 @@ "has": "^1.0.3" } }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -8110,28 +8870,95 @@ "is-path-inside": "^3.0.2" } }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.11" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, "is-unicode-supported": { @@ -8140,6 +8967,28 @@ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true + }, + "is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -8149,7 +8998,7 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, "jest-worker": { @@ -8189,7 +9038,7 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM= sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, "jsesc": { @@ -8219,7 +9068,7 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "json5": { @@ -8447,9 +9296,9 @@ } }, "lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true }, "make-dir": { @@ -8508,9 +9357,9 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "ms": { @@ -8540,6 +9389,22 @@ "path-key": "^3.0.0" } }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -8648,7 +9513,7 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true }, "picocolors": { @@ -8703,6 +9568,12 @@ } } }, + "process": { + "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 + }, "proxy-from-env": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", @@ -8710,9 +9581,9 @@ "dev": true }, "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, "pump": { @@ -8732,9 +9603,18 @@ "dev": true }, "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", + "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true }, "randombytes": { @@ -8782,6 +9662,17 @@ "@babel/runtime": "^7.8.4" } }, + "regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + } + }, "regexpu-core": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", @@ -8828,6 +9719,12 @@ "throttleit": "^1.0.0" } }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -8911,6 +9808,17 @@ "randombytes": "^2.1.0" } }, + "set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "requires": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -8926,6 +9834,17 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -9002,6 +9921,15 @@ "tweetnacl": "~0.14.0" } }, + "stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "requires": { + "internal-slot": "^1.0.4" + } + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -9132,13 +10060,23 @@ } }, "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "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==", "dev": true, "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "dependencies": { + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true + } } }, "ts-loader": { @@ -9222,7 +10160,7 @@ "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "requires": { "safe-buffer": "^5.0.1" @@ -9231,7 +10169,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, "type-fest": { @@ -9305,6 +10243,16 @@ "punycode": "^2.1.0" } }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -9314,7 +10262,7 @@ "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -9392,6 +10340,44 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, + "which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", diff --git a/projects/storefrontapp-e2e-cypress/package.json b/projects/storefrontapp-e2e-cypress/package.json index 28f54557686..9b05314ba7d 100644 --- a/projects/storefrontapp-e2e-cypress/package.json +++ b/projects/storefrontapp-e2e-cypress/package.json @@ -37,9 +37,9 @@ "@babel/core": "^7.14.3", "@babel/preset-env": "^7.14.2", "@cypress/webpack-preprocessor": "^5.9.1", - "@testing-library/cypress": "9.0.0", + "@testing-library/cypress": "10.0.1", "babel-loader": "^8.2.2", - "cypress": "12.6.0", + "cypress": "13.2.0", "cypress-file-upload": "^5.0.8", "ts-loader": "^9.4.2", "typescript": "^4.2.4", From 30e51f88b22da12b803840b0a2d34f38977c4e04 Mon Sep 17 00:00:00 2001 From: kpawelczak <42094017+kpawelczak@users.noreply.github.com> Date: Fri, 15 Sep 2023 01:25:59 +0200 Subject: [PATCH 12/19] chore: package update (#17818) Co-authored-by: Giancarlo Cordero Ortiz <46171897+giancorderoortiz@users.noreply.github.com> Co-authored-by: Giancarlo Cordero Ortiz --- core-libs/setup/package.json | 6 +- feature-libs/asm/package.json | 10 +- feature-libs/cart/package.json | 12 +- feature-libs/checkout/package.json | 12 +- feature-libs/customer-ticketing/package.json | 12 +- feature-libs/order/package.json | 12 +- feature-libs/organization/package.json | 12 +- feature-libs/pdf-invoices/package.json | 10 +- feature-libs/pickup-in-store/package.json | 12 +- .../product-configurator/package.json | 12 +- feature-libs/product/package.json | 10 +- feature-libs/qualtrics/package.json | 8 +- .../requested-delivery-date/package.json | 10 +- feature-libs/smartedit/package.json | 8 +- feature-libs/storefinder/package.json | 12 +- feature-libs/tracking/package.json | 8 +- feature-libs/user/package.json | 12 +- integration-libs/cdc/package.json | 12 +- integration-libs/cds/package.json | 10 +- .../digital-payments/package.json | 12 +- .../epd-visualization/package.json | 12 +- integration-libs/s4om/package.json | 8 +- integration-libs/segment-refs/package.json | 8 +- package-lock.json | 449 +++++++++--------- package.json | 52 +- projects/assets/package.json | 2 +- projects/core/package.json | 14 +- projects/schematics/package.json | 12 +- projects/schematics/src/dependencies.json | 252 +++++----- .../ng-add/__snapshots__/index_spec.ts.snap | 14 +- projects/storefrontlib/package.json | 14 +- projects/storefrontstyles/package.json | 2 +- 32 files changed, 528 insertions(+), 523 deletions(-) diff --git a/core-libs/setup/package.json b/core-libs/setup/package.json index 77c1944a24a..692e12f3014 100644 --- a/core-libs/setup/package.json +++ b/core-libs/setup/package.json @@ -16,17 +16,17 @@ "test": "../../node_modules/.bin/jest --config ./jest.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular/core": "^15.2.4", + "@angular/core": "^15.2.9", "@spartacus/cart": "6.3.0-1", "@spartacus/core": "6.3.0-1", "@spartacus/order": "6.3.0-1", "@spartacus/user": "6.3.0-1" }, "optionalDependencies": { - "@angular/platform-server": "^15.2.4", + "@angular/platform-server": "^15.2.9", "@nguniversal/express-engine": "^15.2.0", "express": "^4.18.2" }, diff --git a/feature-libs/asm/package.json b/feature-libs/asm/package.json index 84a145d3190..64c84cc199c 100644 --- a/feature-libs/asm/package.json +++ b/feature-libs/asm/package.json @@ -22,13 +22,13 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", diff --git a/feature-libs/cart/package.json b/feature-libs/cart/package.json index 43dbc51e2a3..0dfb8e5a8e2 100644 --- a/feature-libs/cart/package.json +++ b/feature-libs/cart/package.json @@ -26,14 +26,14 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", diff --git a/feature-libs/checkout/package.json b/feature-libs/checkout/package.json index add1c29d462..bc05b2e6000 100644 --- a/feature-libs/checkout/package.json +++ b/feature-libs/checkout/package.json @@ -22,14 +22,14 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/store": "^15.3.0", "@spartacus/cart": "6.3.0-1", diff --git a/feature-libs/customer-ticketing/package.json b/feature-libs/customer-ticketing/package.json index 3acb2256931..e5ec380652b 100644 --- a/feature-libs/customer-ticketing/package.json +++ b/feature-libs/customer-ticketing/package.json @@ -22,14 +22,14 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@spartacus/cart": "6.3.0-1", "@spartacus/core": "6.3.0-1", "@spartacus/schematics": "6.3.0-1", diff --git a/feature-libs/order/package.json b/feature-libs/order/package.json index ef8e96d979d..f8616c1b3ec 100644 --- a/feature-libs/order/package.json +++ b/feature-libs/order/package.json @@ -22,14 +22,14 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", diff --git a/feature-libs/organization/package.json b/feature-libs/organization/package.json index 38f89ae0f91..4f4c39f2d47 100644 --- a/feature-libs/organization/package.json +++ b/feature-libs/organization/package.json @@ -22,14 +22,14 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", diff --git a/feature-libs/pdf-invoices/package.json b/feature-libs/pdf-invoices/package.json index 18aa684ce24..fc5428f187a 100644 --- a/feature-libs/pdf-invoices/package.json +++ b/feature-libs/pdf-invoices/package.json @@ -22,13 +22,13 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", "@spartacus/core": "6.3.0-1", "@spartacus/schematics": "6.3.0-1", "@spartacus/storefront": "6.3.0-1", diff --git a/feature-libs/pickup-in-store/package.json b/feature-libs/pickup-in-store/package.json index 1ffe58a0192..015fa71428c 100644 --- a/feature-libs/pickup-in-store/package.json +++ b/feature-libs/pickup-in-store/package.json @@ -22,14 +22,14 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", "@spartacus/cart": "6.3.0-1", diff --git a/feature-libs/product-configurator/package.json b/feature-libs/product-configurator/package.json index c92560dfcd8..a6bfebd786e 100644 --- a/feature-libs/product-configurator/package.json +++ b/feature-libs/product-configurator/package.json @@ -22,14 +22,14 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", diff --git a/feature-libs/product/package.json b/feature-libs/product/package.json index d05fcea3c57..517c771c5a0 100644 --- a/feature-libs/product/package.json +++ b/feature-libs/product/package.json @@ -22,13 +22,13 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/router": "^15.2.9", "@spartacus/core": "6.3.0-1", "@spartacus/schematics": "6.3.0-1", "@spartacus/storefront": "6.3.0-1", diff --git a/feature-libs/qualtrics/package.json b/feature-libs/qualtrics/package.json index d957fc0a4fa..9245da0237e 100644 --- a/feature-libs/qualtrics/package.json +++ b/feature-libs/qualtrics/package.json @@ -24,12 +24,12 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", "@spartacus/core": "6.3.0-1", "@spartacus/schematics": "6.3.0-1", "@spartacus/styles": "6.3.0-1", diff --git a/feature-libs/requested-delivery-date/package.json b/feature-libs/requested-delivery-date/package.json index cbeacc85e4a..c97e2c4a6ac 100644 --- a/feature-libs/requested-delivery-date/package.json +++ b/feature-libs/requested-delivery-date/package.json @@ -22,13 +22,13 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", "@spartacus/cart": "6.3.0-1", "@spartacus/checkout": "6.3.0-1", "@spartacus/core": "6.3.0-1", diff --git a/feature-libs/smartedit/package.json b/feature-libs/smartedit/package.json index b56b5b3f661..5740fa0a2fd 100644 --- a/feature-libs/smartedit/package.json +++ b/feature-libs/smartedit/package.json @@ -17,12 +17,12 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", "@spartacus/core": "6.3.0-1", "@spartacus/schematics": "6.3.0-1", "rxjs": "^6.6.0" diff --git a/feature-libs/storefinder/package.json b/feature-libs/storefinder/package.json index 33507e7151a..fc64dbba441 100644 --- a/feature-libs/storefinder/package.json +++ b/feature-libs/storefinder/package.json @@ -22,14 +22,14 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", "@spartacus/core": "6.3.0-1", diff --git a/feature-libs/tracking/package.json b/feature-libs/tracking/package.json index 957912bb9f7..4d1866111fb 100644 --- a/feature-libs/tracking/package.json +++ b/feature-libs/tracking/package.json @@ -21,12 +21,12 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", "@spartacus/core": "6.3.0-1", "@spartacus/schematics": "6.3.0-1", "rxjs": "^6.6.0" diff --git a/feature-libs/user/package.json b/feature-libs/user/package.json index dbd2f380bfb..7db8fb1b361 100644 --- a/feature-libs/user/package.json +++ b/feature-libs/user/package.json @@ -22,14 +22,14 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/store": "^15.3.0", "@spartacus/core": "6.3.0-1", diff --git a/integration-libs/cdc/package.json b/integration-libs/cdc/package.json index 39dd392508b..5fca4c0987b 100644 --- a/integration-libs/cdc/package.json +++ b/integration-libs/cdc/package.json @@ -19,14 +19,14 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", diff --git a/integration-libs/cds/package.json b/integration-libs/cds/package.json index 3821b1a1a00..85180e6bfb7 100644 --- a/integration-libs/cds/package.json +++ b/integration-libs/cds/package.json @@ -20,13 +20,13 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/router": "^15.2.9", "@ngrx/store": "^15.3.0", "@spartacus/cart": "6.3.0-1", "@spartacus/core": "6.3.0-1", diff --git a/integration-libs/digital-payments/package.json b/integration-libs/digital-payments/package.json index 726b83f117f..6fb40bb5f5b 100644 --- a/integration-libs/digital-payments/package.json +++ b/integration-libs/digital-payments/package.json @@ -18,14 +18,14 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@spartacus/cart": "6.3.0-1", "@spartacus/checkout": "6.3.0-1", diff --git a/integration-libs/epd-visualization/package.json b/integration-libs/epd-visualization/package.json index 23a84e541d2..1d6906fe4e3 100644 --- a/integration-libs/epd-visualization/package.json +++ b/integration-libs/epd-visualization/package.json @@ -29,14 +29,14 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@sapui5/ts-types-esm": "1.108.14", "@spartacus/cart": "6.3.0-1", "@spartacus/core": "6.3.0-1", diff --git a/integration-libs/s4om/package.json b/integration-libs/s4om/package.json index 505231bebd5..8d20f0810f9 100644 --- a/integration-libs/s4om/package.json +++ b/integration-libs/s4om/package.json @@ -17,12 +17,12 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", "@spartacus/cart": "6.3.0-1", "@spartacus/core": "6.3.0-1", "@spartacus/pdf-invoices": "6.3.0-1", diff --git a/integration-libs/segment-refs/package.json b/integration-libs/segment-refs/package.json index 005fa7301d6..3e5ba2bd03d 100644 --- a/integration-libs/segment-refs/package.json +++ b/integration-libs/segment-refs/package.json @@ -17,12 +17,12 @@ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", "@spartacus/core": "6.3.0-1", "@spartacus/schematics": "6.3.0-1", "rxjs": "^6.6.0" diff --git a/package-lock.json b/package-lock.json index cded6608585..a15cbf50258 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,53 +10,53 @@ "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@angular/animations": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/compiler": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/platform-browser": "^15.2.4", - "@angular/platform-browser-dynamic": "^15.2.4", - "@angular/platform-server": "^15.2.4", - "@angular/pwa": "^15.2.4", - "@angular/router": "^15.2.4", - "@angular/service-worker": "^15.2.4", + "@angular/animations": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/compiler": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/platform-browser": "^15.2.9", + "@angular/platform-browser-dynamic": "^15.2.9", + "@angular/platform-server": "^15.2.9", + "@angular/pwa": "^15.2.9", + "@angular/router": "^15.2.9", + "@angular/service-worker": "^15.2.9", "@fontsource/open-sans": "^4.5.14", - "@fortawesome/fontawesome-free": "5.8.1", + "@fortawesome/fontawesome-free": "6.4.2", "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/router-store": "^15.3.0", "@ngrx/store": "^15.3.0", "@nguniversal/express-engine": "^15.2.0", - "@types/google.maps": "^3.49.2", + "@types/google.maps": "^3.54.0", "angular-oauth2-oidc": "^15.0.1", "bootstrap": "^4.6.2", "comment-json": "^4.2.3", "express": "^4.18.2", "hamburgers": "^1.2.1", - "i18next": "^21.9.1", - "i18next-http-backend": "^1.4.1", + "i18next": "^21.10.0", + "i18next-http-backend": "^1.4.5", "i18next-resources-to-backend": "^1.1.2", "ngx-infinite-scroll": "^15.0.0", "rxjs": "^6.6.0", - "ts-loader": "^9.3.1", - "tslib": "^2.4.0", - "zone.js": "~0.11.8" + "ts-loader": "^9.4.4", + "tslib": "^2.6.2", + "zone.js": "~0.12.0" }, "devDependencies": { "@angular-builders/custom-webpack": "^15.0.0", - "@angular-devkit/build-angular": "^15.2.4", - "@angular-devkit/core": "^15.2.4", - "@angular-devkit/schematics": "^15.2.4", + "@angular-devkit/build-angular": "^15.2.9", + "@angular-devkit/core": "^15.2.9", + "@angular-devkit/schematics": "^15.2.9", "@angular-eslint/builder": "^15.2.0", "@angular-eslint/eslint-plugin": "^15.2.0", "@angular-eslint/eslint-plugin-template": "^15.2.0", "@angular-eslint/schematics": "^15.2.0", "@angular-eslint/template-parser": "^15.2.0", "@angular-eslint/utils": "^15.2.0", - "@angular/cli": "^15.2.4", - "@angular/compiler-cli": "^15.2.4", - "@angular/language-service": "^15.2.4", + "@angular/cli": "^15.2.9", + "@angular/compiler-cli": "^15.2.9", + "@angular/language-service": "^15.2.9", "@babel/runtime": "^7.18.9", "@ngrx/store-devtools": "^15.3.0", "@nguniversal/builders": "^15.2.0", @@ -66,7 +66,7 @@ "@nrwl/jest": "^15.9.2", "@nrwl/workspace": "15.9.2", "@sapui5/ts-types-esm": "1.108.14", - "@schematics/angular": "^15.2.4", + "@schematics/angular": "^15.2.9", "@types/express": "^4.17.17", "@types/fs-extra": "^11.0.1", "@types/i18next": "^13.0.0", @@ -127,7 +127,7 @@ "webpack-cli": "^4.10.0" }, "engines": { - "node": "^14.20.0 || ^16.13.0 || ^18.10.0" + "node": "^16.13.0 || ^18.10.0" } }, "node_modules/@ampproject/remapping": { @@ -163,11 +163,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1502.4", + "version": "0.1502.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1502.9.tgz", + "integrity": "sha512-CFn+LbtYeLG7WqO+BBSjogl764StHpwgfJnNAXQ/3UouUktZ92z4lxhUm0PwIPb5k0lILsf81ubcS1vzwoXEEg==", "devOptional": true, - "license": "MIT", "dependencies": { - "@angular-devkit/core": "15.2.4", + "@angular-devkit/core": "15.2.9", "rxjs": "6.6.7" }, "engines": { @@ -177,14 +178,15 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "15.2.4", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-15.2.9.tgz", + "integrity": "sha512-djOo2Q22zLrxPccSbINz93hD+pES/nNPoze4Ys/0IdtMlLmxO/YGsA+FG5eNeNAf2jK/JRoNydaYOh7XpGoCzA==", "dev": true, - "license": "MIT", "dependencies": { "@ampproject/remapping": "2.2.0", - "@angular-devkit/architect": "0.1502.4", - "@angular-devkit/build-webpack": "0.1502.4", - "@angular-devkit/core": "15.2.4", + "@angular-devkit/architect": "0.1502.9", + "@angular-devkit/build-webpack": "0.1502.9", + "@angular-devkit/core": "15.2.9", "@babel/core": "7.20.12", "@babel/generator": "7.20.14", "@babel/helper-annotate-as-pure": "7.18.6", @@ -196,7 +198,7 @@ "@babel/runtime": "7.20.13", "@babel/template": "7.20.7", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "15.2.4", + "@ngtools/webpack": "15.2.9", "ansi-colors": "4.1.3", "autoprefixer": "10.4.13", "babel-loader": "9.1.2", @@ -229,7 +231,7 @@ "rxjs": "6.6.7", "sass": "1.58.1", "sass-loader": "13.2.0", - "semver": "7.3.8", + "semver": "7.5.3", "source-map-loader": "4.0.1", "source-map-support": "0.5.21", "terser": "5.16.3", @@ -287,8 +289,9 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/@babel/runtime": { "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", + "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", "dev": true, - "license": "MIT", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -298,13 +301,15 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/@types/estree": { "version": "0.0.51", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true }, "node_modules/@angular-devkit/build-angular/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -318,24 +323,27 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/ajv-keywords": { "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/@angular-devkit/build-angular/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/@angular-devkit/build-angular/node_modules/eslint-scope": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -346,16 +354,18 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/estraverse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/@angular-devkit/build-angular/node_modules/glob": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -372,24 +382,15 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/json-schema-traverse": { "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular-devkit/build-angular/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/@angular-devkit/build-angular/node_modules/minimatch": { "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -399,6 +400,8 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/postcss": { "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", "dev": true, "funding": [ { @@ -410,7 +413,6 @@ "url": "https://tidelift.com/funding/github/npm/postcss" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", @@ -421,9 +423,10 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/schema-utils": { - "version": "3.1.1", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -437,24 +440,17 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/@angular-devkit/build-angular/node_modules/semver": { - "version": "7.3.8", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } + "node_modules/@angular-devkit/build-angular/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true }, "node_modules/@angular-devkit/build-angular/node_modules/webpack": { "version": "5.76.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz", + "integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", @@ -497,17 +493,13 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1502.4", + "version": "0.1502.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1502.9.tgz", + "integrity": "sha512-VzMXoZjrbL1XlcSegqpZCBDbVvKFGPs3cKp4bXDD5ht95jcCyJPk5FA/wrh0pGGwbOF8ae/XOWFcPRzctC35iA==", "dev": true, - "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1502.4", + "@angular-devkit/architect": "0.1502.9", "rxjs": "6.6.7" }, "engines": { @@ -521,8 +513,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "15.2.4", - "license": "MIT", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.2.9.tgz", + "integrity": "sha512-6u44YJ9tEG2hiWITL1rwA9yP6ot4a3cyN/UOMRkYSa/XO2Gz5/dM3U74E2kwg+P1NcxLXffBWl0rz8/Y/lSZyQ==", "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", @@ -545,10 +538,11 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "15.2.4", - "license": "MIT", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.2.9.tgz", + "integrity": "sha512-o08nE8sTpfq/Fknrr1rzBsM8vY36BDox+8dOo9Zc/KqcVPwDy94YKRzHb+xxVaU9jy1VYeCjy63mkyELy7Z3zQ==", "dependencies": { - "@angular-devkit/core": "15.2.4", + "@angular-devkit/core": "15.2.9", "jsonc-parser": "3.2.0", "magic-string": "0.29.0", "ora": "5.4.1", @@ -646,8 +640,9 @@ } }, "node_modules/@angular/animations": { - "version": "15.2.4", - "license": "MIT", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-15.2.9.tgz", + "integrity": "sha512-GQujLhI0cQFcl4Q8y0oSYKSRnW23GIeSL+Arl4eFufziJ9hGAAQNuesaNs/7i+9UlTHDMkPH3kd5ScXuYYz6wg==", "dependencies": { "tslib": "^2.3.0" }, @@ -655,18 +650,19 @@ "node": "^14.20.0 || ^16.13.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "15.2.4" + "@angular/core": "15.2.9" } }, "node_modules/@angular/cli": { - "version": "15.2.4", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-15.2.9.tgz", + "integrity": "sha512-mI6hkGyIJDKd8MRiBl3p5chsUhgnluwmpsq3g1FFPw+wv+eXsPYgCiHqXS/OsK+shFxii9XMxoZQO28bJ4NAOQ==", "devOptional": true, - "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1502.4", - "@angular-devkit/core": "15.2.4", - "@angular-devkit/schematics": "15.2.4", - "@schematics/angular": "15.2.4", + "@angular-devkit/architect": "0.1502.9", + "@angular-devkit/core": "15.2.9", + "@angular-devkit/schematics": "15.2.9", + "@schematics/angular": "15.2.9", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "3.0.1", @@ -678,7 +674,7 @@ "ora": "5.4.1", "pacote": "15.1.0", "resolve": "1.22.1", - "semver": "7.3.8", + "semver": "7.5.3", "symbol-observable": "4.0.0", "yargs": "17.6.2" }, @@ -691,39 +687,10 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular/cli/node_modules/lru-cache": { - "version": "6.0.0", - "devOptional": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@angular/cli/node_modules/semver": { - "version": "7.3.8", - "devOptional": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@angular/cli/node_modules/yallist": { - "version": "4.0.0", - "devOptional": true, - "license": "ISC" - }, "node_modules/@angular/common": { - "version": "15.2.4", - "license": "MIT", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-15.2.9.tgz", + "integrity": "sha512-LM9/UHG2dRrOzlu2KovrFwWIziFMjRxHzSP3Igw6Symw/wIl0kXGq8Fn6RpFP78zmLqnv+IQOoRiby9MCXsI4g==", "dependencies": { "tslib": "^2.3.0" }, @@ -731,13 +698,14 @@ "node": "^14.20.0 || ^16.13.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "15.2.4", + "@angular/core": "15.2.9", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "15.2.4", - "license": "MIT", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-15.2.9.tgz", + "integrity": "sha512-MoKugbjk+E0wRBj12uvIyDLELlVLonnqjA2+XiF+7FxALIeyds3/qQeEoMmYIqAbN3NnTT5pV92RxWwG4tHFwA==", "dependencies": { "tslib": "^2.3.0" }, @@ -745,7 +713,7 @@ "node": "^14.20.0 || ^16.13.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "15.2.4" + "@angular/core": "15.2.9" }, "peerDependenciesMeta": { "@angular/core": { @@ -754,9 +722,10 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "15.2.4", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-15.2.9.tgz", + "integrity": "sha512-zsbI8G2xHOeYWI0hjFzrI//ZhZV9il/uQW5dAimfwJp06KZDeXZ3PdwY9JQslf6F+saLwOObxy6QMrIVvfjy9w==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "7.19.3", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -778,7 +747,7 @@ "node": "^14.20.0 || ^16.13.0 || >=18.10.0" }, "peerDependencies": { - "@angular/compiler": "15.2.4", + "@angular/compiler": "15.2.9", "typescript": ">=4.8.2 <5.0" } }, @@ -831,8 +800,9 @@ } }, "node_modules/@angular/core": { - "version": "15.2.4", - "license": "MIT", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-15.2.9.tgz", + "integrity": "sha512-w46Z1yUXCQfKV7XfnamOoLA2VD0MVUUYVrUjO73mHSskDXSXxfZAEHO9kfUS71Cj35PvhP3mbkqWscpea2WeYg==", "dependencies": { "tslib": "^2.3.0" }, @@ -845,8 +815,9 @@ } }, "node_modules/@angular/forms": { - "version": "15.2.4", - "license": "MIT", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-15.2.9.tgz", + "integrity": "sha512-sk0pC2EFi2Ohg5J0q0NYptbT+2WOkoiERSMYA39ncDvlSZBWsNlxpkbGUSck7NIxjK2QfcVN1ldGbHlZTFvtqg==", "dependencies": { "tslib": "^2.3.0" }, @@ -854,23 +825,25 @@ "node": "^14.20.0 || ^16.13.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "15.2.4", - "@angular/core": "15.2.4", - "@angular/platform-browser": "15.2.4", + "@angular/common": "15.2.9", + "@angular/core": "15.2.9", + "@angular/platform-browser": "15.2.9", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "15.2.4", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-15.2.9.tgz", + "integrity": "sha512-B7lP4q/eHge2lZezOXS96EYzVf4stMCWfOnz7+pUUi0HbF+A5QCV65SWQddS/M+NM2jj8N2L/j+6UCH8lJjTQA==", "dev": true, - "license": "MIT", "engines": { "node": "^14.20.0 || ^16.13.0 || >=18.10.0" } }, "node_modules/@angular/platform-browser": { - "version": "15.2.4", - "license": "MIT", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-15.2.9.tgz", + "integrity": "sha512-ufCHeSX+U6d43YOMkn3igwfqtlozoCXADcbyfUEG8m2y9XASobqmCKvdSk/zfl62oyiA8msntWBJVBE2l4xKXg==", "dependencies": { "tslib": "^2.3.0" }, @@ -878,9 +851,9 @@ "node": "^14.20.0 || ^16.13.0 || >=18.10.0" }, "peerDependencies": { - "@angular/animations": "15.2.4", - "@angular/common": "15.2.4", - "@angular/core": "15.2.4" + "@angular/animations": "15.2.9", + "@angular/common": "15.2.9", + "@angular/core": "15.2.9" }, "peerDependenciesMeta": { "@angular/animations": { @@ -889,8 +862,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "15.2.4", - "license": "MIT", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-15.2.9.tgz", + "integrity": "sha512-ZIYDM6MShblb8OyV1m4+18lJJ2LCeICmeg2uSbpFYptYBSOClrTiYOOFVDJvn7HLvNzljLs16XPrgyaYVqNpcw==", "dependencies": { "tslib": "^2.3.0" }, @@ -898,15 +872,16 @@ "node": "^14.20.0 || ^16.13.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "15.2.4", - "@angular/compiler": "15.2.4", - "@angular/core": "15.2.4", - "@angular/platform-browser": "15.2.4" + "@angular/common": "15.2.9", + "@angular/compiler": "15.2.9", + "@angular/core": "15.2.9", + "@angular/platform-browser": "15.2.9" } }, "node_modules/@angular/platform-server": { - "version": "15.2.4", - "license": "MIT", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-15.2.9.tgz", + "integrity": "sha512-GOjRSCpqN9WPi5ROvsVo9G4gACZ4Z6J2GYBFUOzUY/PaQkuGtigZhp0zPDU19vteabIa0p6C3jqOHw0+jHolgw==", "dependencies": { "domino": "^2.1.2", "tslib": "^2.3.0", @@ -916,20 +891,21 @@ "node": "^14.20.0 || ^16.13.0 || >=18.10.0" }, "peerDependencies": { - "@angular/animations": "15.2.4", - "@angular/common": "15.2.4", - "@angular/compiler": "15.2.4", - "@angular/core": "15.2.4", - "@angular/platform-browser": "15.2.4", - "@angular/platform-browser-dynamic": "15.2.4" + "@angular/animations": "15.2.9", + "@angular/common": "15.2.9", + "@angular/compiler": "15.2.9", + "@angular/core": "15.2.9", + "@angular/platform-browser": "15.2.9", + "@angular/platform-browser-dynamic": "15.2.9" } }, "node_modules/@angular/pwa": { - "version": "15.2.4", - "license": "MIT", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/pwa/-/pwa-15.2.9.tgz", + "integrity": "sha512-5WRHStoooHDg6o82zomHUu5uZqoK2QNFJrQ40mgvYv2/rK/NikQBQlARl9aYkwER4qRIu0aO/kmfCuAXPve17A==", "dependencies": { - "@angular-devkit/schematics": "15.2.4", - "@schematics/angular": "15.2.4", + "@angular-devkit/schematics": "15.2.9", + "@schematics/angular": "15.2.9", "parse5-html-rewriting-stream": "7.0.0" }, "engines": { @@ -947,8 +923,9 @@ } }, "node_modules/@angular/router": { - "version": "15.2.4", - "license": "MIT", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-15.2.9.tgz", + "integrity": "sha512-UCbh5DLSDhybv0xKYT7kGQMfOVdyhHIHOZz5EYVebbhste6S+W1LE57vTHq7QtxJsyKBa/WSkaUkCLXD6ntCAg==", "dependencies": { "tslib": "^2.3.0" }, @@ -956,15 +933,16 @@ "node": "^14.20.0 || ^16.13.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "15.2.4", - "@angular/core": "15.2.4", - "@angular/platform-browser": "15.2.4", + "@angular/common": "15.2.9", + "@angular/core": "15.2.9", + "@angular/platform-browser": "15.2.9", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/service-worker": { - "version": "15.2.4", - "license": "MIT", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-15.2.9.tgz", + "integrity": "sha512-qM/lcrjaxIfpKj174mMWedtGfLNgLl5m7p9mPNODFjqp5lQj3fTTS643ix5Pr0onwbvbNbXu4g67/WXJqap0eA==", "dependencies": { "tslib": "^2.3.0" }, @@ -975,8 +953,8 @@ "node": "^14.20.0 || ^16.13.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "15.2.4", - "@angular/core": "15.2.4" + "@angular/common": "15.2.9", + "@angular/core": "15.2.9" } }, "node_modules/@assemblyscript/loader": { @@ -2936,8 +2914,10 @@ "license": "MIT" }, "node_modules/@fortawesome/fontawesome-free": { - "version": "5.8.1", - "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.4.2.tgz", + "integrity": "sha512-m5cPn3e2+FDCOgi1mz0RexTUvvQibBebOUlUlW0+YrMjDTPkiJ6VTKukA1GRsvRw+12KyJndNjj0O4AgTxm2Pg==", + "hasInstallScript": true, "engines": { "node": ">=6" } @@ -3398,9 +3378,10 @@ } }, "node_modules/@ngtools/webpack": { - "version": "15.2.4", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-15.2.9.tgz", + "integrity": "sha512-nOXUGqKkAEMlCcrhkDwWDzcVdKNH7MNRUXfNzsFc9zdeR/5p3qt6SVMN7OOE3NREyI7P6nzARc3S+6QDBjf3Jg==", "dev": true, - "license": "MIT", "engines": { "node": "^14.20.0 || ^16.13.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", @@ -5858,11 +5839,12 @@ } }, "node_modules/@schematics/angular": { - "version": "15.2.4", - "license": "MIT", + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-15.2.9.tgz", + "integrity": "sha512-0Lit6TLNUwcAYiEkXgZp3vY9xAO1cnZCBXuUcp+6v+Ddnrt2w/YOiGe74p21cYe0StkTpTljsqsKBTiX7TMjQg==", "dependencies": { - "@angular-devkit/core": "15.2.4", - "@angular-devkit/schematics": "15.2.4", + "@angular-devkit/core": "15.2.9", + "@angular-devkit/schematics": "15.2.9", "jsonc-parser": "3.2.0" }, "engines": { @@ -6143,8 +6125,9 @@ } }, "node_modules/@types/google.maps": { - "version": "3.52.0", - "license": "MIT" + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.54.0.tgz", + "integrity": "sha512-b1MBy2eGrZoEFLnzq1RrlHbfzuWHz+Nitgqbb5N+MFA0kAUv0kYPmAXtczpb4dHlFZyu58EYzcKXtWNqSInyXg==" }, "node_modules/@types/graceful-fs": { "version": "4.1.6", @@ -7351,8 +7334,9 @@ }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "dev": true, - "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" @@ -7363,8 +7347,9 @@ }, "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, - "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -9053,8 +9038,9 @@ }, "node_modules/copy-webpack-plugin": { "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, - "license": "MIT", "dependencies": { "fast-glob": "^3.2.11", "glob-parent": "^6.0.1", @@ -9076,8 +9062,9 @@ }, "node_modules/copy-webpack-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, - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -9086,13 +9073,14 @@ } }, "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.1.3", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, - "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" }, @@ -9105,8 +9093,9 @@ }, "node_modules/copy-webpack-plugin/node_modules/slash": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -11262,9 +11251,10 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.2.12", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -14855,8 +14845,9 @@ }, "node_modules/karma-source-map-support": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", "dev": true, - "license": "MIT", "dependencies": { "source-map-support": "^0.5.5" } @@ -15178,8 +15169,9 @@ }, "node_modules/loader-utils": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 12.13.0" } @@ -15877,8 +15869,9 @@ }, "node_modules/mini-css-extract-plugin": { "version": "2.7.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", + "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", "dev": true, - "license": "MIT", "dependencies": { "schema-utils": "^4.0.0" }, @@ -17844,8 +17837,9 @@ }, "node_modules/postcss-loader": { "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.2.tgz", + "integrity": "sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg==", "dev": true, - "license": "MIT", "dependencies": { "cosmiconfig": "^7.0.0", "klona": "^2.0.5", @@ -18840,8 +18834,9 @@ }, "node_modules/regex-parser": { "version": "2.2.11", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "dev": true }, "node_modules/regexp.prototype.flags": { "version": "1.4.3", @@ -19005,8 +19000,9 @@ }, "node_modules/resolve-url-loader": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", "dev": true, - "license": "MIT", "dependencies": { "adjust-sourcemap-loader": "^4.0.0", "convert-source-map": "^1.7.0", @@ -19020,8 +19016,9 @@ }, "node_modules/resolve-url-loader/node_modules/loader-utils": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, - "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -19033,8 +19030,9 @@ }, "node_modules/resolve-url-loader/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -19291,8 +19289,9 @@ }, "node_modules/sass-loader": { "version": "13.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", + "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", "dev": true, - "license": "MIT", "dependencies": { "klona": "^2.0.4", "neo-async": "^2.6.2" @@ -19459,9 +19458,9 @@ } }, "node_modules/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -19986,8 +19985,9 @@ }, "node_modules/source-map-loader": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", + "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", "dev": true, - "license": "MIT", "dependencies": { "abab": "^2.0.6", "iconv-lite": "^0.6.3", @@ -20006,8 +20006,9 @@ }, "node_modules/source-map-loader/node_modules/iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -21170,8 +21171,9 @@ } }, "node_modules/ts-loader": { - "version": "9.4.2", - "license": "MIT", + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.4.tgz", + "integrity": "sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==", "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", @@ -21274,8 +21276,9 @@ } }, "node_modules/tslib": { - "version": "2.5.0", - "license": "0BSD" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -21992,8 +21995,9 @@ }, "node_modules/webpack-dev-middleware": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.0.1.tgz", + "integrity": "sha512-PZPZ6jFinmqVPJZbisfggDiC+2EeGZ1ZByyMP5sOFJcPPWSexalISz+cvm+j+oYPT7FIJyxT76esjnw9DhE5sw==", "dev": true, - "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.12", @@ -22543,8 +22547,9 @@ } }, "node_modules/zone.js": { - "version": "0.11.8", - "license": "MIT", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.12.0.tgz", + "integrity": "sha512-XtC+I5dXU14HrzidAKBNMqneIVUykLEAA1x+v4KVrd6AUPWlwYORF8KgsVqvgdHiKZ4BkxxjvYi/ksEixTPR0Q==", "dependencies": { "tslib": "^2.3.0" } diff --git a/package.json b/package.json index 2997943cf75..eca5dd81729 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "license": "Apache-2.0", "author": "SAP, Spartacus team", "engines": { - "node": "^14.20.0 || ^16.13.0 || ^18.10.0" + "node": "^16.13.0 || ^18.10.0" }, "scripts": { "build:analyze": "npm run build --stats-json && npx --yes webpack-bundle-analyzer dist/storefrontapp/stats.json", @@ -101,53 +101,53 @@ }, "private": false, "dependencies": { - "@angular/animations": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/compiler": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/platform-browser": "^15.2.4", - "@angular/platform-browser-dynamic": "^15.2.4", - "@angular/platform-server": "^15.2.4", - "@angular/pwa": "^15.2.4", - "@angular/router": "^15.2.4", - "@angular/service-worker": "^15.2.4", + "@angular/animations": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/compiler": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/platform-browser": "^15.2.9", + "@angular/platform-browser-dynamic": "^15.2.9", + "@angular/platform-server": "^15.2.9", + "@angular/pwa": "^15.2.9", + "@angular/router": "^15.2.9", + "@angular/service-worker": "^15.2.9", "@fontsource/open-sans": "^4.5.14", - "@fortawesome/fontawesome-free": "5.8.1", + "@fortawesome/fontawesome-free": "6.4.2", "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/router-store": "^15.3.0", "@ngrx/store": "^15.3.0", "@nguniversal/express-engine": "^15.2.0", - "@types/google.maps": "^3.49.2", + "@types/google.maps": "^3.54.0", "angular-oauth2-oidc": "^15.0.1", "bootstrap": "^4.6.2", "comment-json": "^4.2.3", "express": "^4.18.2", "hamburgers": "^1.2.1", - "i18next": "^21.9.1", - "i18next-http-backend": "^1.4.1", + "i18next": "^21.10.0", + "i18next-http-backend": "^1.4.5", "i18next-resources-to-backend": "^1.1.2", "ngx-infinite-scroll": "^15.0.0", "rxjs": "^6.6.0", - "ts-loader": "^9.3.1", - "tslib": "^2.4.0", - "zone.js": "~0.11.8" + "ts-loader": "^9.4.4", + "tslib": "^2.6.2", + "zone.js": "~0.12.0" }, "devDependencies": { "@angular-builders/custom-webpack": "^15.0.0", - "@angular-devkit/build-angular": "^15.2.4", - "@angular-devkit/core": "^15.2.4", - "@angular-devkit/schematics": "^15.2.4", + "@angular-devkit/build-angular": "^15.2.9", + "@angular-devkit/core": "^15.2.9", + "@angular-devkit/schematics": "^15.2.9", "@angular-eslint/builder": "^15.2.0", "@angular-eslint/eslint-plugin": "^15.2.0", "@angular-eslint/eslint-plugin-template": "^15.2.0", "@angular-eslint/schematics": "^15.2.0", "@angular-eslint/template-parser": "^15.2.0", "@angular-eslint/utils": "^15.2.0", - "@angular/cli": "^15.2.4", - "@angular/compiler-cli": "^15.2.4", - "@angular/language-service": "^15.2.4", + "@angular/cli": "^15.2.9", + "@angular/compiler-cli": "^15.2.9", + "@angular/language-service": "^15.2.9", "@babel/runtime": "^7.18.9", "@ngrx/store-devtools": "^15.3.0", "@nguniversal/builders": "^15.2.0", @@ -157,7 +157,7 @@ "@nrwl/jest": "^15.9.2", "@nrwl/workspace": "15.9.2", "@sapui5/ts-types-esm": "1.108.14", - "@schematics/angular": "^15.2.4", + "@schematics/angular": "^15.2.9", "@types/express": "^4.17.17", "@types/fs-extra": "^11.0.1", "@types/i18next": "^13.0.0", diff --git a/projects/assets/package.json b/projects/assets/package.json index 7d083ba55f6..22f2561fe78 100644 --- a/projects/assets/package.json +++ b/projects/assets/package.json @@ -10,7 +10,7 @@ "generate:translations:ts-2-properties": "ts-node ./generate-translations-ts-2-properties" }, "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "publishConfig": { "access": "public" diff --git a/projects/core/package.json b/projects/core/package.json index d4326fac941..a26de809049 100644 --- a/projects/core/package.json +++ b/projects/core/package.json @@ -12,19 +12,19 @@ "repository": "https://github.com/SAP/spartacus/tree/develop/projects/core", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/platform-browser": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/platform-browser": "^15.2.9", + "@angular/router": "^15.2.9", "@ngrx/effects": "^15.3.0", "@ngrx/router-store": "^15.3.0", "@ngrx/store": "^15.3.0", "angular-oauth2-oidc": "^15.0.1", - "i18next": "^21.9.1", - "i18next-http-backend": "^1.4.1", + "i18next": "^21.10.0", + "i18next-http-backend": "^1.4.5", "i18next-resources-to-backend": "^1.1.2", "rxjs": "^6.6.0" }, diff --git a/projects/schematics/package.json b/projects/schematics/package.json index e2cde80e9ed..ce220c5b58a 100644 --- a/projects/schematics/package.json +++ b/projects/schematics/package.json @@ -16,17 +16,17 @@ "test": "npm run clean && ../../node_modules/.bin/jest --config ./jest.schematics.config.js" }, "dependencies": { - "@angular/pwa": "^15.2.4", + "@angular/pwa": "^15.2.9", "@nguniversal/express-engine": "^15.2.0", "semver": "^7.5.2", "ts-morph": "^9.1.0", - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular-devkit/core": "^15.2.4", - "@angular-devkit/schematics": "^15.2.4", - "@angular/compiler": "^15.2.4", - "@schematics/angular": "^15.2.4", + "@angular-devkit/core": "^15.2.9", + "@angular-devkit/schematics": "^15.2.9", + "@angular/compiler": "^15.2.9", + "@schematics/angular": "^15.2.9", "jsonc-parser": "^3.2.0", "parse5": "^6.0.1", "typescript": "^4.8.2" diff --git a/projects/schematics/src/dependencies.json b/projects/schematics/src/dependencies.json index acfb2abaf1e..1ea027a9d46 100644 --- a/projects/schematics/src/dependencies.json +++ b/projects/schematics/src/dependencies.json @@ -1,36 +1,36 @@ { "@spartacus/assets": {}, "@spartacus/core": { - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/platform-browser": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/platform-browser": "^15.2.9", + "@angular/router": "^15.2.9", "@ngrx/effects": "^15.3.0", "@ngrx/router-store": "^15.3.0", "@ngrx/store": "^15.3.0", "angular-oauth2-oidc": "^15.0.1", - "i18next": "^21.9.1", - "i18next-http-backend": "^1.4.1", + "i18next": "^21.10.0", + "i18next-http-backend": "^1.4.5", "i18next-resources-to-backend": "^1.1.2", "rxjs": "^6.6.0" }, "@spartacus/schematics": { - "@angular-devkit/core": "^15.2.4", - "@angular-devkit/schematics": "^15.2.4", - "@angular/compiler": "^15.2.4", - "@schematics/angular": "^15.2.4", + "@angular-devkit/core": "^15.2.9", + "@angular-devkit/schematics": "^15.2.9", + "@angular/compiler": "^15.2.9", + "@schematics/angular": "^15.2.9", "jsonc-parser": "^3.2.0", "parse5": "^6.0.1", "typescript": "^4.8.2" }, "storefrontapp-e2e-cypress": {}, "@spartacus/storefront": { - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/platform-browser": "^15.2.4", - "@angular/router": "^15.2.4", - "@angular/service-worker": "^15.2.4", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/platform-browser": "^15.2.9", + "@angular/router": "^15.2.9", + "@angular/service-worker": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/router-store": "^15.3.0", @@ -41,22 +41,22 @@ }, "@spartacus/styles": { "@fontsource/open-sans": "^4.5.14", - "@fortawesome/fontawesome-free": "5.8.1", + "@fortawesome/fontawesome-free": "6.4.2", "@ng-select/ng-select": "^10.0.3", "bootstrap": "^4.6.2" }, "@spartacus/setup": { - "@angular/core": "^15.2.4", + "@angular/core": "^15.2.9", "@spartacus/cart": "6.3.0-1", "@spartacus/core": "6.3.0-1", "@spartacus/order": "6.3.0-1", "@spartacus/user": "6.3.0-1" }, "@spartacus/asm": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", @@ -69,11 +69,11 @@ "rxjs": "^6.6.0" }, "@spartacus/cart": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", @@ -86,11 +86,11 @@ "rxjs": "^6.6.0" }, "@spartacus/checkout": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/store": "^15.3.0", "@spartacus/cart": "6.3.0-1", @@ -104,11 +104,11 @@ "rxjs": "^6.6.0" }, "@spartacus/customer-ticketing": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@spartacus/cart": "6.3.0-1", "@spartacus/core": "6.3.0-1", "@spartacus/schematics": "6.3.0-1", @@ -117,11 +117,11 @@ "rxjs": "^6.6.0" }, "@spartacus/order": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", @@ -134,11 +134,11 @@ "rxjs": "^6.6.0" }, "@spartacus/organization": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", @@ -164,11 +164,11 @@ "rxjs": "^6.6.0" }, "@spartacus/pickup-in-store": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", "@spartacus/cart": "6.3.0-1", @@ -183,10 +183,10 @@ "rxjs": "^6.6.0" }, "@spartacus/product": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/router": "^15.2.9", "@spartacus/core": "6.3.0-1", "@spartacus/schematics": "6.3.0-1", "@spartacus/storefront": "6.3.0-1", @@ -195,11 +195,11 @@ "rxjs": "^6.6.0" }, "@spartacus/product-configurator": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", @@ -213,9 +213,9 @@ "rxjs": "^6.6.0" }, "@spartacus/qualtrics": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", "@spartacus/core": "6.3.0-1", "@spartacus/schematics": "6.3.0-1", "@spartacus/styles": "6.3.0-1", @@ -223,10 +223,10 @@ "rxjs": "^6.6.0" }, "@spartacus/requested-delivery-date": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", "@spartacus/cart": "6.3.0-1", "@spartacus/checkout": "6.3.0-1", "@spartacus/core": "6.3.0-1", @@ -237,19 +237,19 @@ "rxjs": "^6.6.0" }, "@spartacus/smartedit": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", "@spartacus/core": "6.3.0-1", "@spartacus/schematics": "6.3.0-1", "rxjs": "^6.6.0" }, "@spartacus/storefinder": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", "@spartacus/core": "6.3.0-1", @@ -260,19 +260,19 @@ "rxjs": "^6.6.0" }, "@spartacus/tracking": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", "@spartacus/core": "6.3.0-1", "@spartacus/schematics": "6.3.0-1", "rxjs": "^6.6.0" }, "@spartacus/user": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/store": "^15.3.0", "@spartacus/core": "6.3.0-1", @@ -282,11 +282,11 @@ "rxjs": "^6.6.0" }, "@spartacus/cdc": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", @@ -299,10 +299,10 @@ "rxjs": "^6.6.0" }, "@spartacus/cds": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/router": "^15.2.9", "@ngrx/store": "^15.3.0", "@spartacus/cart": "6.3.0-1", "@spartacus/core": "6.3.0-1", @@ -313,11 +313,11 @@ "rxjs": "^6.6.0" }, "@spartacus/digital-payments": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@spartacus/cart": "6.3.0-1", "@spartacus/checkout": "6.3.0-1", @@ -327,11 +327,11 @@ "rxjs": "^6.6.0" }, "@spartacus/epd-visualization": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/router": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/router": "^15.2.9", "@sapui5/ts-types-esm": "1.108.14", "@spartacus/cart": "6.3.0-1", "@spartacus/core": "6.3.0-1", @@ -342,9 +342,9 @@ "rxjs": "^6.6.0" }, "@spartacus/s4om": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", "@spartacus/cart": "6.3.0-1", "@spartacus/core": "6.3.0-1", "@spartacus/pdf-invoices": "6.3.0-1", @@ -355,45 +355,45 @@ "rxjs": "^6.6.0" }, "@spartacus/segment-refs": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", "@spartacus/core": "6.3.0-1", "@spartacus/schematics": "6.3.0-1", "rxjs": "^6.6.0" }, "storefrontapp": { - "@angular/animations": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/compiler": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/platform-browser": "^15.2.4", - "@angular/platform-browser-dynamic": "^15.2.4", - "@angular/platform-server": "^15.2.4", - "@angular/pwa": "^15.2.4", - "@angular/router": "^15.2.4", - "@angular/service-worker": "^15.2.4", + "@angular/animations": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/compiler": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/platform-browser": "^15.2.9", + "@angular/platform-browser-dynamic": "^15.2.9", + "@angular/platform-server": "^15.2.9", + "@angular/pwa": "^15.2.9", + "@angular/router": "^15.2.9", + "@angular/service-worker": "^15.2.9", "@fontsource/open-sans": "^4.5.14", - "@fortawesome/fontawesome-free": "5.8.1", + "@fortawesome/fontawesome-free": "6.4.2", "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/router-store": "^15.3.0", "@ngrx/store": "^15.3.0", "@nguniversal/express-engine": "^15.2.0", - "@types/google.maps": "^3.49.2", + "@types/google.maps": "^3.54.0", "angular-oauth2-oidc": "^15.0.1", "bootstrap": "^4.6.2", "comment-json": "^4.2.3", "express": "^4.18.2", "hamburgers": "^1.2.1", - "i18next": "^21.9.1", - "i18next-http-backend": "^1.4.1", + "i18next": "^21.10.0", + "i18next-http-backend": "^1.4.5", "i18next-resources-to-backend": "^1.1.2", "ngx-infinite-scroll": "^15.0.0", "rxjs": "^6.6.0", - "ts-loader": "^9.3.1", - "tslib": "^2.4.0", + "ts-loader": "^9.4.4", + "tslib": "^2.6.2", "zone.js": "~0.11.8" } } diff --git a/projects/schematics/src/ng-add/__snapshots__/index_spec.ts.snap b/projects/schematics/src/ng-add/__snapshots__/index_spec.ts.snap index 0167385ada7..b6451fe9068 100644 --- a/projects/schematics/src/ng-add/__snapshots__/index_spec.ts.snap +++ b/projects/schematics/src/ng-add/__snapshots__/index_spec.ts.snap @@ -53,11 +53,11 @@ exports[`Spartacus Schematics: ng-add should add spartacus properly with SSR 2`] "@angular/forms": "^15.2.0", "@angular/platform-browser": "^15.2.0", "@angular/platform-browser-dynamic": "^15.2.0", - "@angular/platform-server": "^15.2.4", + "@angular/platform-server": "^15.2.9", "@angular/router": "^15.2.0", - "@angular/service-worker": "^15.2.4", + "@angular/service-worker": "^15.2.9", "@fontsource/open-sans": "^4.5.14", - "@fortawesome/fontawesome-free": "5.8.1", + "@fortawesome/fontawesome-free": "6.4.2", "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/router-store": "^15.3.0", @@ -71,17 +71,17 @@ exports[`Spartacus Schematics: ng-add should add spartacus properly with SSR 2`] "angular-oauth2-oidc": "^15.0.1", "bootstrap": "^4.6.2", "express": "^4.15.2", - "i18next": "^21.9.1", - "i18next-http-backend": "^1.4.1", + "i18next": "^21.10.0", + "i18next-http-backend": "^1.4.5", "i18next-resources-to-backend": "^1.1.2", "ngx-infinite-scroll": "^15.0.0", "rxjs": "^6.6.0", - "ts-loader": "^9.3.1", + "ts-loader": "^9.4.4", "tslib": "^2.3.0", "zone.js": "~0.12.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^15.2.4", + "@angular-devkit/build-angular": "^15.2.9", "@angular/cli": "~0.5.0", "@angular/compiler-cli": "^15.2.0", "@nguniversal/builders": "^15.2.0", diff --git a/projects/storefrontlib/package.json b/projects/storefrontlib/package.json index ce778e85755..56b2c7fcd77 100644 --- a/projects/storefrontlib/package.json +++ b/projects/storefrontlib/package.json @@ -10,15 +10,15 @@ "repository": "https://github.com/SAP/spartacus/tree/develop/projects/storefrontlib", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@angular/platform-browser": "^15.2.4", - "@angular/router": "^15.2.4", - "@angular/service-worker": "^15.2.4", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@angular/platform-browser": "^15.2.9", + "@angular/router": "^15.2.9", + "@angular/service-worker": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/router-store": "^15.3.0", diff --git a/projects/storefrontstyles/package.json b/projects/storefrontstyles/package.json index c8fc024414f..dfdd9ebbd93 100644 --- a/projects/storefrontstyles/package.json +++ b/projects/storefrontstyles/package.json @@ -19,7 +19,7 @@ "devDependencies": {}, "peerDependencies": { "@fontsource/open-sans": "^4.5.14", - "@fortawesome/fontawesome-free": "5.8.1", + "@fortawesome/fontawesome-free": "6.4.2", "@ng-select/ng-select": "^10.0.3", "bootstrap": "^4.6.2" }, From 588d622db63ae4250c24eb959a700e5725f7970f Mon Sep 17 00:00:00 2001 From: Radhep Sabapathipillai <34665674+RadhepS@users.noreply.github.com> Date: Fri, 15 Sep 2023 15:20:26 -0400 Subject: [PATCH 13/19] chore: increase karma timeouts (#17837) The karma tests have their timeouts increased to avoid timeout failures on the release pipeline closes: https://jira.tools.sap/browse/CXSPA-4725 --- feature-libs/asm/karma.conf.js | 4 ++++ feature-libs/cart/karma.conf.js | 4 ++++ feature-libs/checkout/karma.conf.js | 4 ++++ feature-libs/customer-ticketing/karma.conf.js | 4 ++++ feature-libs/order/karma.conf.js | 4 ++++ feature-libs/organization/karma.conf.js | 4 ++++ feature-libs/pdf-invoices/karma.conf.js | 4 ++++ feature-libs/pickup-in-store/karma.conf.js | 4 ++++ feature-libs/product-configurator/karma.conf.js | 4 ++++ feature-libs/product/karma.conf.js | 4 ++++ feature-libs/qualtrics/karma.conf.js | 4 ++++ feature-libs/requested-delivery-date/karma.conf.js | 4 ++++ feature-libs/smartedit/karma.conf.js | 4 ++++ feature-libs/storefinder/karma.conf.js | 4 ++++ feature-libs/tracking/karma.conf.js | 4 ++++ feature-libs/user/karma.conf.js | 4 ++++ integration-libs/cdc/karma.conf.js | 4 ++++ integration-libs/cds/karma.conf.js | 4 ++++ integration-libs/digital-payments/karma.conf.js | 4 ++++ integration-libs/epd-visualization/karma.conf.js | 4 ++++ integration-libs/s4om/karma.conf.js | 4 ++++ integration-libs/segment-refs/karma.conf.js | 4 ++++ projects/core/karma.conf.js | 4 ++++ projects/storefrontapp/karma.conf.js | 4 ++++ projects/storefrontlib/karma.conf.js | 4 ++++ 25 files changed, 100 insertions(+) diff --git a/feature-libs/asm/karma.conf.js b/feature-libs/asm/karma.conf.js index e3461fcbb60..3fe7e8cffb4 100644 --- a/feature-libs/asm/karma.conf.js +++ b/feature-libs/asm/karma.conf.js @@ -42,6 +42,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/feature-libs/cart/karma.conf.js b/feature-libs/cart/karma.conf.js index 9a580445bf6..a84400380c0 100644 --- a/feature-libs/cart/karma.conf.js +++ b/feature-libs/cart/karma.conf.js @@ -37,6 +37,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/feature-libs/checkout/karma.conf.js b/feature-libs/checkout/karma.conf.js index 0b54f0947bf..a717dc45679 100644 --- a/feature-libs/checkout/karma.conf.js +++ b/feature-libs/checkout/karma.conf.js @@ -37,6 +37,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/feature-libs/customer-ticketing/karma.conf.js b/feature-libs/customer-ticketing/karma.conf.js index 2ba14b12752..aa436f39398 100644 --- a/feature-libs/customer-ticketing/karma.conf.js +++ b/feature-libs/customer-ticketing/karma.conf.js @@ -36,6 +36,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/feature-libs/order/karma.conf.js b/feature-libs/order/karma.conf.js index ce76e1edcea..b5601c34956 100644 --- a/feature-libs/order/karma.conf.js +++ b/feature-libs/order/karma.conf.js @@ -37,6 +37,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/feature-libs/organization/karma.conf.js b/feature-libs/organization/karma.conf.js index 822cf311160..27293165aea 100644 --- a/feature-libs/organization/karma.conf.js +++ b/feature-libs/organization/karma.conf.js @@ -42,6 +42,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/feature-libs/pdf-invoices/karma.conf.js b/feature-libs/pdf-invoices/karma.conf.js index aed99ee7cec..b1ea719a64b 100644 --- a/feature-libs/pdf-invoices/karma.conf.js +++ b/feature-libs/pdf-invoices/karma.conf.js @@ -36,6 +36,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/feature-libs/pickup-in-store/karma.conf.js b/feature-libs/pickup-in-store/karma.conf.js index 2e5b72c7df4..5154d9516d0 100644 --- a/feature-libs/pickup-in-store/karma.conf.js +++ b/feature-libs/pickup-in-store/karma.conf.js @@ -37,6 +37,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/feature-libs/product-configurator/karma.conf.js b/feature-libs/product-configurator/karma.conf.js index f7ea355dfaf..d57a13f41d8 100644 --- a/feature-libs/product-configurator/karma.conf.js +++ b/feature-libs/product-configurator/karma.conf.js @@ -45,6 +45,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/feature-libs/product/karma.conf.js b/feature-libs/product/karma.conf.js index cf500675a9c..58cabf6bcb4 100644 --- a/feature-libs/product/karma.conf.js +++ b/feature-libs/product/karma.conf.js @@ -34,6 +34,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/feature-libs/qualtrics/karma.conf.js b/feature-libs/qualtrics/karma.conf.js index cf4314b55b0..ad54b8d4f69 100644 --- a/feature-libs/qualtrics/karma.conf.js +++ b/feature-libs/qualtrics/karma.conf.js @@ -34,6 +34,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/feature-libs/requested-delivery-date/karma.conf.js b/feature-libs/requested-delivery-date/karma.conf.js index e451c881c40..a143424cf73 100644 --- a/feature-libs/requested-delivery-date/karma.conf.js +++ b/feature-libs/requested-delivery-date/karma.conf.js @@ -39,6 +39,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/feature-libs/smartedit/karma.conf.js b/feature-libs/smartedit/karma.conf.js index b94d1f2a71c..e0fbf2282a3 100644 --- a/feature-libs/smartedit/karma.conf.js +++ b/feature-libs/smartedit/karma.conf.js @@ -37,6 +37,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/feature-libs/storefinder/karma.conf.js b/feature-libs/storefinder/karma.conf.js index 9575997ae09..1a217c828b3 100644 --- a/feature-libs/storefinder/karma.conf.js +++ b/feature-libs/storefinder/karma.conf.js @@ -37,6 +37,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/feature-libs/tracking/karma.conf.js b/feature-libs/tracking/karma.conf.js index 50417459311..2e80be331c5 100644 --- a/feature-libs/tracking/karma.conf.js +++ b/feature-libs/tracking/karma.conf.js @@ -34,6 +34,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/feature-libs/user/karma.conf.js b/feature-libs/user/karma.conf.js index f727f4eb1bc..6c9c9aff463 100644 --- a/feature-libs/user/karma.conf.js +++ b/feature-libs/user/karma.conf.js @@ -37,6 +37,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/integration-libs/cdc/karma.conf.js b/integration-libs/cdc/karma.conf.js index 4f3777d80c9..9f40841f4ae 100644 --- a/integration-libs/cdc/karma.conf.js +++ b/integration-libs/cdc/karma.conf.js @@ -34,6 +34,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/integration-libs/cds/karma.conf.js b/integration-libs/cds/karma.conf.js index ba9601acb3a..c08af0b3aeb 100644 --- a/integration-libs/cds/karma.conf.js +++ b/integration-libs/cds/karma.conf.js @@ -34,6 +34,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/integration-libs/digital-payments/karma.conf.js b/integration-libs/digital-payments/karma.conf.js index 7156e0d7406..399eaae94e1 100644 --- a/integration-libs/digital-payments/karma.conf.js +++ b/integration-libs/digital-payments/karma.conf.js @@ -34,6 +34,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/integration-libs/epd-visualization/karma.conf.js b/integration-libs/epd-visualization/karma.conf.js index bcd9271db68..9da0a2cf80c 100644 --- a/integration-libs/epd-visualization/karma.conf.js +++ b/integration-libs/epd-visualization/karma.conf.js @@ -34,6 +34,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/integration-libs/s4om/karma.conf.js b/integration-libs/s4om/karma.conf.js index 6a9e6e21ebb..839449226ad 100644 --- a/integration-libs/s4om/karma.conf.js +++ b/integration-libs/s4om/karma.conf.js @@ -34,6 +34,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/integration-libs/segment-refs/karma.conf.js b/integration-libs/segment-refs/karma.conf.js index c784a91dad0..c054668810e 100644 --- a/integration-libs/segment-refs/karma.conf.js +++ b/integration-libs/segment-refs/karma.conf.js @@ -34,6 +34,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/projects/core/karma.conf.js b/projects/core/karma.conf.js index 20bb029fff1..9a5b7b752c0 100644 --- a/projects/core/karma.conf.js +++ b/projects/core/karma.conf.js @@ -42,6 +42,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/projects/storefrontapp/karma.conf.js b/projects/storefrontapp/karma.conf.js index 7e89609a52e..a9b06fd3c31 100644 --- a/projects/storefrontapp/karma.conf.js +++ b/projects/storefrontapp/karma.conf.js @@ -28,6 +28,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, diff --git a/projects/storefrontlib/karma.conf.js b/projects/storefrontlib/karma.conf.js index 4d348dcb88e..6e9d815e8b5 100644 --- a/projects/storefrontlib/karma.conf.js +++ b/projects/storefrontlib/karma.conf.js @@ -37,6 +37,10 @@ module.exports = function (config) { }, }, }, + captureTimeout: 210000, + browserDisconnectTolerance: 3, + browserDisconnectTimeout: 210000, + browserNoActivityTimeout: 210000, port: 9876, colors: true, logLevel: config.LOG_INFO, From 9dcb262e54ed89e62e766557a1d1f2a2f122a438 Mon Sep 17 00:00:00 2001 From: kpawelczak <42094017+kpawelczak@users.noreply.github.com> Date: Mon, 18 Sep 2023 16:21:44 +0200 Subject: [PATCH 14/19] feat: disable SSR in smartedit (#17825) --- .../ssr/optimized-engine/rendering-strategy-resolver-options.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-libs/setup/ssr/optimized-engine/rendering-strategy-resolver-options.ts b/core-libs/setup/ssr/optimized-engine/rendering-strategy-resolver-options.ts index 90035dd14c8..26e69ec7802 100644 --- a/core-libs/setup/ssr/optimized-engine/rendering-strategy-resolver-options.ts +++ b/core-libs/setup/ssr/optimized-engine/rendering-strategy-resolver-options.ts @@ -11,6 +11,6 @@ export interface RenderingStrategyResolverOptions { export const defaultRenderingStrategyResolverOptions: RenderingStrategyResolverOptions = { - excludedUrls: ['checkout', 'my-account'], + excludedUrls: ['checkout', 'my-account', 'cx-preview'], excludedParams: ['asm'], }; From c933a6c3b040e53d21dfbb210356a212857666c3 Mon Sep 17 00:00:00 2001 From: Radhep Sabapathipillai <34665674+RadhepS@users.noreply.github.com> Date: Tue, 19 Sep 2023 12:23:48 -0400 Subject: [PATCH 15/19] chore: update CI to use node 18 (#17842) chore: update the CI to use node 18 closes: https://jira.tools.sap/browse/CXSPA-4599 --- .github/workflows/cache-node-modules.yml | 2 +- .github/workflows/ci-continuous-integration.yml | 2 +- .github/workflows/ci-merge-checks.yml | 2 +- .github/workflows/ci.yml | 2 +- .github/workflows/lighthouse.yml | 2 +- ci-scripts/e2e-cypress.sh | 2 ++ ci-scripts/lhci.sh | 1 + projects/schematics/src/dependencies.json | 2 +- tools/config/const.ts | 2 +- 9 files changed, 10 insertions(+), 7 deletions(-) diff --git a/.github/workflows/cache-node-modules.yml b/.github/workflows/cache-node-modules.yml index d50a013d50a..dba6da3e70e 100644 --- a/.github/workflows/cache-node-modules.yml +++ b/.github/workflows/cache-node-modules.yml @@ -8,7 +8,7 @@ on: name: Cache node modules env: - NODE_VERSION: '16' + NODE_VERSION: '18' jobs: cacheNodeModules: diff --git a/.github/workflows/ci-continuous-integration.yml b/.github/workflows/ci-continuous-integration.yml index c9f062b1607..2044ac9fa45 100644 --- a/.github/workflows/ci-continuous-integration.yml +++ b/.github/workflows/ci-continuous-integration.yml @@ -10,7 +10,7 @@ on: # empty as it is used only to manually trigger the workflow env: - NODE_VERSION: '16' + NODE_VERSION: '18' NX_BASE: origin/${{ github.event.pull_request.base.ref }} NX_HEAD: origin/${{ github.event.pull_request.head.ref }} diff --git a/.github/workflows/ci-merge-checks.yml b/.github/workflows/ci-merge-checks.yml index 70ba22a5607..773ebe1b4a8 100644 --- a/.github/workflows/ci-merge-checks.yml +++ b/.github/workflows/ci-merge-checks.yml @@ -11,7 +11,7 @@ on: env: CYPRESS_KEY: ${{ secrets.CYPRESS_KEY }} GH_TOKEN: ${{ github.token }} - NODE_VERSION: '16' + NODE_VERSION: '18' concurrency: group: ci-merge-checks-${{ github.head_ref || github.run_id }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b22cc1447d1..de47f5387ed 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ on: env: CYPRESS_KEY: ${{ secrets.CYPRESS_KEY }} - NODE_VERSION: '16' + NODE_VERSION: '18' concurrency: group: ci-${{ github.head_ref || github.run_id }} diff --git a/.github/workflows/lighthouse.yml b/.github/workflows/lighthouse.yml index 621d247b4cc..cc200ae2293 100644 --- a/.github/workflows/lighthouse.yml +++ b/.github/workflows/lighthouse.yml @@ -9,7 +9,7 @@ on: # empty as it is used only to manually trigger the workflow env: CYPRESS_KEY: ${{ secrets.CYPRESS_KEY }} - NODE_VERSION: '16' + NODE_VERSION: '18' concurrency: group: lighthouse-${{ github.head_ref || github.run_id }} diff --git a/ci-scripts/e2e-cypress.sh b/ci-scripts/e2e-cypress.sh index 0af88a94591..8b2fd427c11 100755 --- a/ci-scripts/e2e-cypress.sh +++ b/ci-scripts/e2e-cypress.sh @@ -57,6 +57,8 @@ fi echo '-----' echo "Building Spartacus libraries" +export NODE_OPTIONS=--dns-result-order=ipv4first + npm ci (cd projects/storefrontapp-e2e-cypress && npm ci) diff --git a/ci-scripts/lhci.sh b/ci-scripts/lhci.sh index a067632a482..172c3d1d43a 100755 --- a/ci-scripts/lhci.sh +++ b/ci-scripts/lhci.sh @@ -2,6 +2,7 @@ set -e export SPA_ENV='lighthouse' +export NODE_OPTIONS=--dns-result-order=ipv4first npm install -g @lhci/cli@0.8.x diff --git a/projects/schematics/src/dependencies.json b/projects/schematics/src/dependencies.json index 1ea027a9d46..b563cc10f57 100644 --- a/projects/schematics/src/dependencies.json +++ b/projects/schematics/src/dependencies.json @@ -394,6 +394,6 @@ "rxjs": "^6.6.0", "ts-loader": "^9.4.4", "tslib": "^2.6.2", - "zone.js": "~0.11.8" + "zone.js": "~0.12.0" } } diff --git a/tools/config/const.ts b/tools/config/const.ts index c923a002212..6ae750650b3 100644 --- a/tools/config/const.ts +++ b/tools/config/const.ts @@ -10,4 +10,4 @@ export const SPARTACUS_SCOPE = '@spartacus'; export const SAP_SCOPE = 'sap'; export const SAPUI5_TYPES = '@sapui5/ts-types-esm'; export const SPARTACUS_SCHEMATICS = `${SPARTACUS_SCOPE}/schematics`; -export const PUBLISHING_VERSION = '6.3.0-1'; +export const PUBLISHING_VERSION = ''; From 87a65ec4effe703a8cc74f2a21f8ff53af350729 Mon Sep 17 00:00:00 2001 From: kpawelczak <42094017+kpawelczak@users.noreply.github.com> Date: Wed, 20 Sep 2023 13:29:54 +0200 Subject: [PATCH 16/19] fix: 'this' is undefined in ProductEffects.productLoadEffect (#17853) --- projects/core/src/product/store/effects/product.effect.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/core/src/product/store/effects/product.effect.ts b/projects/core/src/product/store/effects/product.effect.ts index 87582569f82..3192d8fe193 100644 --- a/projects/core/src/product/store/effects/product.effect.ts +++ b/projects/core/src/product/store/effects/product.effect.ts @@ -4,10 +4,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Injectable, inject } from '@angular/core'; +import { inject, Injectable } from '@angular/core'; import { Actions, createEffect, ofType } from '@ngrx/effects'; import { Action } from '@ngrx/store'; -import { Observable, merge, of } from 'rxjs'; +import { merge, Observable, of } from 'rxjs'; import { catchError, map, mergeMap } from 'rxjs/operators'; import { AuthActions } from '../../../auth/user-auth/store/actions'; import { LoggerService } from '../../../logger'; @@ -49,7 +49,7 @@ export class ProductEffects { merge( ...this.productConnector .getMany(products) - .map(this.productLoadEffect) + .map((productLoad) => this.productLoadEffect(productLoad)) ) ), withdrawOn(this.contextChange$) From 6d2251fe4c28f629b7be6d794b659fd7ba16cca1 Mon Sep 17 00:00:00 2001 From: Roman Chygryn <129765378+rmch91@users.noreply.github.com> Date: Thu, 21 Sep 2023 12:00:20 +0200 Subject: [PATCH 17/19] Release 6.5.0 1 (#17863) --- core-libs/setup/package.json | 10 +- feature-libs/asm/package.json | 14 +- feature-libs/cart/package.json | 12 +- feature-libs/checkout/package.json | 16 +- .../__snapshots__/index_spec.ts.snap | 4 +- feature-libs/customer-ticketing/package.json | 12 +- feature-libs/order/package.json | 14 +- feature-libs/organization/package.json | 16 +- .../__snapshots__/index_spec.ts.snap | 10 +- feature-libs/pdf-invoices/package.json | 10 +- feature-libs/pickup-in-store/package.json | 18 +- .../product-configurator/package.json | 16 +- .../__snapshots__/index_spec.ts.snap | 6 +- feature-libs/product/package.json | 10 +- .../__snapshots__/index_spec.ts.snap | 4 +- feature-libs/qualtrics/package.json | 8 +- .../requested-delivery-date/package.json | 16 +- feature-libs/smartedit/package.json | 6 +- feature-libs/storefinder/package.json | 10 +- feature-libs/tracking/package.json | 6 +- feature-libs/user/package.json | 10 +- integration-libs/cdc/package.json | 14 +- integration-libs/cds/package.json | 14 +- .../digital-payments/package.json | 12 +- .../epd-visualization/package.json | 12 +- integration-libs/s4om/package.json | 16 +- integration-libs/segment-refs/package.json | 6 +- projects/assets/package.json | 2 +- projects/core/package.json | 2 +- projects/schematics/package.json | 2 +- projects/schematics/src/dependencies.json | 242 +++++++++--------- .../schematics/src/migrations/migrations.json | 20 +- .../ng-add/__snapshots__/index_spec.ts.snap | 10 +- projects/storefrontlib/package.json | 4 +- projects/storefrontstyles/package.json | 2 +- .../storefrontstyles/scss/_versioning.scss | 2 +- tools/config/const.ts | 2 +- 37 files changed, 295 insertions(+), 295 deletions(-) diff --git a/core-libs/setup/package.json b/core-libs/setup/package.json index 692e12f3014..2902e642dec 100644 --- a/core-libs/setup/package.json +++ b/core-libs/setup/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/setup", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "Includes features that makes Spartacus and it's setup easier and streamlined.", "keywords": [ "spartacus", @@ -20,10 +20,10 @@ }, "peerDependencies": { "@angular/core": "^15.2.9", - "@spartacus/cart": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/order": "6.3.0-1", - "@spartacus/user": "6.3.0-1" + "@spartacus/cart": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/order": "6.5.0-1", + "@spartacus/user": "6.5.0-1" }, "optionalDependencies": { "@angular/platform-server": "^15.2.9", diff --git a/feature-libs/asm/package.json b/feature-libs/asm/package.json index 64c84cc199c..2b0dd49201b 100644 --- a/feature-libs/asm/package.json +++ b/feature-libs/asm/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/asm", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "ASM feature library for Spartacus", "keywords": [ "spartacus", @@ -32,12 +32,12 @@ "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", - "@spartacus/cart": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", - "@spartacus/user": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", + "@spartacus/user": "6.5.0-1", "rxjs": "^6.6.0" }, "publishConfig": { diff --git a/feature-libs/cart/package.json b/feature-libs/cart/package.json index 0dfb8e5a8e2..16c604e51da 100644 --- a/feature-libs/cart/package.json +++ b/feature-libs/cart/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/cart", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "", "keywords": [ "spartacus", @@ -37,11 +37,11 @@ "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", - "@spartacus/user": "6.3.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", + "@spartacus/user": "6.5.0-1", "bootstrap": "^4.6.2", "rxjs": "^6.6.0" }, diff --git a/feature-libs/checkout/package.json b/feature-libs/checkout/package.json index bc05b2e6000..a89a39383b2 100644 --- a/feature-libs/checkout/package.json +++ b/feature-libs/checkout/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/checkout", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "Checkout feature library for Spartacus", "keywords": [ "spartacus", @@ -32,13 +32,13 @@ "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/store": "^15.3.0", - "@spartacus/cart": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/order": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", - "@spartacus/user": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/order": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", + "@spartacus/user": "6.5.0-1", "bootstrap": "^4.6.2", "rxjs": "^6.6.0" }, diff --git a/feature-libs/checkout/schematics/add-checkout/__snapshots__/index_spec.ts.snap b/feature-libs/checkout/schematics/add-checkout/__snapshots__/index_spec.ts.snap index 27cc71fa3f2..72a254fbe1c 100644 --- a/feature-libs/checkout/schematics/add-checkout/__snapshots__/index_spec.ts.snap +++ b/feature-libs/checkout/schematics/add-checkout/__snapshots__/index_spec.ts.snap @@ -63,7 +63,7 @@ import { defaultCmsContentProviders, layoutConfig, mediaConfig } from "@spartacu }, }), provideConfig({ features: { - level: '6.3' + level: '6.5' } }), provideConfig(defaultB2bOccConfig)] }) @@ -506,7 +506,7 @@ import { defaultCmsContentProviders, layoutConfig, mediaConfig } from "@spartacu }, }), provideConfig({ features: { - level: '6.3' + level: '6.5' } }), provideConfig(defaultB2bOccConfig)] }) diff --git a/feature-libs/customer-ticketing/package.json b/feature-libs/customer-ticketing/package.json index e5ec380652b..cbbeadcda3d 100644 --- a/feature-libs/customer-ticketing/package.json +++ b/feature-libs/customer-ticketing/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/customer-ticketing", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "Customer-Ticketing library for Spartacus", "keywords": [ "spartacus", @@ -30,11 +30,11 @@ "@angular/core": "^15.2.9", "@angular/forms": "^15.2.9", "@angular/router": "^15.2.9", - "@spartacus/cart": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", "rxjs": "^6.6.0" }, "publishConfig": { diff --git a/feature-libs/order/package.json b/feature-libs/order/package.json index f8616c1b3ec..9e2da427d5a 100644 --- a/feature-libs/order/package.json +++ b/feature-libs/order/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/order", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "Order feature library for Spartacus", "keywords": [ "spartacus", @@ -33,12 +33,12 @@ "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", - "@spartacus/cart": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", - "@spartacus/user": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", + "@spartacus/user": "6.5.0-1", "rxjs": "^6.6.0" }, "publishConfig": { diff --git a/feature-libs/organization/package.json b/feature-libs/organization/package.json index 4f4c39f2d47..55dc6558ba6 100644 --- a/feature-libs/organization/package.json +++ b/feature-libs/organization/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/organization", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "Organization library for Spartacus", "keywords": [ "spartacus", @@ -33,13 +33,13 @@ "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", - "@spartacus/cart": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/order": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", - "@spartacus/user": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/order": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", + "@spartacus/user": "6.5.0-1", "bootstrap": "^4.6.2", "rxjs": "^6.6.0" }, diff --git a/feature-libs/organization/schematics/add-organization/__snapshots__/index_spec.ts.snap b/feature-libs/organization/schematics/add-organization/__snapshots__/index_spec.ts.snap index 0d0d33778be..8d9dd423c77 100644 --- a/feature-libs/organization/schematics/add-organization/__snapshots__/index_spec.ts.snap +++ b/feature-libs/organization/schematics/add-organization/__snapshots__/index_spec.ts.snap @@ -51,7 +51,7 @@ import { defaultCmsContentProviders, layoutConfig, mediaConfig } from "@spartacu }, }), provideConfig({ features: { - level: '6.3' + level: '6.5' } }), provideConfig(defaultB2bOccConfig)] }) @@ -266,7 +266,7 @@ import { defaultCmsContentProviders, layoutConfig, mediaConfig } from "@spartacu }, }), provideConfig({ features: { - level: '6.3' + level: '6.5' } }), provideConfig(defaultB2bOccConfig)] }) @@ -481,7 +481,7 @@ import { defaultCmsContentProviders, layoutConfig, mediaConfig } from "@spartacu }, }), provideConfig({ features: { - level: '6.3' + level: '6.5' } }), provideConfig(defaultB2bOccConfig)] }) @@ -696,7 +696,7 @@ import { defaultCmsContentProviders, layoutConfig, mediaConfig } from "@spartacu }, }), provideConfig({ features: { - level: '6.3' + level: '6.5' } }), provideConfig(defaultB2bOccConfig)] }) @@ -911,7 +911,7 @@ import { defaultCmsContentProviders, layoutConfig, mediaConfig } from "@spartacu }, }), provideConfig({ features: { - level: '6.3' + level: '6.5' } }), provideConfig(defaultB2bOccConfig)] }) diff --git a/feature-libs/pdf-invoices/package.json b/feature-libs/pdf-invoices/package.json index fc5428f187a..4c147f7b38d 100644 --- a/feature-libs/pdf-invoices/package.json +++ b/feature-libs/pdf-invoices/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/pdf-invoices", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "Invoices library for Spartacus", "keywords": [ "spartacus", @@ -29,10 +29,10 @@ "@angular/common": "^15.2.9", "@angular/core": "^15.2.9", "@angular/forms": "^15.2.9", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", "rxjs": "^6.6.0" }, "publishConfig": { diff --git a/feature-libs/pickup-in-store/package.json b/feature-libs/pickup-in-store/package.json index 015fa71428c..6b5a478bb78 100644 --- a/feature-libs/pickup-in-store/package.json +++ b/feature-libs/pickup-in-store/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/pickup-in-store", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "", "keywords": [ "spartacus", @@ -32,14 +32,14 @@ "@angular/router": "^15.2.9", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", - "@spartacus/cart": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/order": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefinder": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", - "@spartacus/user": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/order": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefinder": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", + "@spartacus/user": "6.5.0-1", "bootstrap": "^4.6.2", "rxjs": "^6.6.0" }, diff --git a/feature-libs/product-configurator/package.json b/feature-libs/product-configurator/package.json index a6bfebd786e..1a2bac6a4d3 100644 --- a/feature-libs/product-configurator/package.json +++ b/feature-libs/product-configurator/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/product-configurator", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "Product configurator feature library for Spartacus", "keywords": [ "spartacus", @@ -33,13 +33,13 @@ "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", - "@spartacus/cart": "6.3.0-1", - "@spartacus/checkout": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/order": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/checkout": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/order": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", "rxjs": "^6.6.0" }, "publishConfig": { diff --git a/feature-libs/product-configurator/schematics/add-product-configurator/__snapshots__/index_spec.ts.snap b/feature-libs/product-configurator/schematics/add-product-configurator/__snapshots__/index_spec.ts.snap index 19148ba7c82..f51dc2e0a31 100644 --- a/feature-libs/product-configurator/schematics/add-product-configurator/__snapshots__/index_spec.ts.snap +++ b/feature-libs/product-configurator/schematics/add-product-configurator/__snapshots__/index_spec.ts.snap @@ -58,7 +58,7 @@ import { defaultCmsContentProviders, layoutConfig, mediaConfig } from "@spartacu }, }), provideConfig({ features: { - level: '6.3' + level: '6.5' } }), provideConfig(defaultB2bOccConfig)] }) @@ -303,7 +303,7 @@ import { defaultCmsContentProviders, layoutConfig, mediaConfig } from "@spartacu }, }), provideConfig({ features: { - level: '6.3' + level: '6.5' } }), provideConfig(defaultB2bOccConfig)] }) @@ -534,7 +534,7 @@ import { defaultCmsContentProviders, layoutConfig, mediaConfig } from "@spartacu }, }), provideConfig({ features: { - level: '6.3' + level: '6.5' } })] }) diff --git a/feature-libs/product/package.json b/feature-libs/product/package.json index 517c771c5a0..f8f5b17f7cf 100644 --- a/feature-libs/product/package.json +++ b/feature-libs/product/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/product", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "Product library for Spartacus", "keywords": [ "spartacus", @@ -29,10 +29,10 @@ "@angular/common": "^15.2.9", "@angular/core": "^15.2.9", "@angular/router": "^15.2.9", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", "bootstrap": "^4.6.2", "rxjs": "^6.6.0" }, diff --git a/feature-libs/product/schematics/add-product/__snapshots__/index_spec.ts.snap b/feature-libs/product/schematics/add-product/__snapshots__/index_spec.ts.snap index c64f861dfdd..1f089ce53e0 100644 --- a/feature-libs/product/schematics/add-product/__snapshots__/index_spec.ts.snap +++ b/feature-libs/product/schematics/add-product/__snapshots__/index_spec.ts.snap @@ -51,7 +51,7 @@ import { defaultCmsContentProviders, layoutConfig, mediaConfig } from "@spartacu }, }), provideConfig({ features: { - level: '6.3' + level: '6.5' } }), provideConfig(defaultB2bOccConfig)] }) @@ -266,7 +266,7 @@ import { defaultCmsContentProviders, layoutConfig, mediaConfig } from "@spartacu }, }), provideConfig({ features: { - level: '6.3' + level: '6.5' } }), provideConfig(defaultB2bOccConfig)] }) diff --git a/feature-libs/qualtrics/package.json b/feature-libs/qualtrics/package.json index 9245da0237e..dcce0fbc96e 100644 --- a/feature-libs/qualtrics/package.json +++ b/feature-libs/qualtrics/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/qualtrics", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "Qualtrics library for Spartacus", "keywords": [ "spartacus", @@ -30,9 +30,9 @@ "@angular-devkit/schematics": "^15.2.9", "@angular/common": "^15.2.9", "@angular/core": "^15.2.9", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", "bootstrap": "^4.6.2", "rxjs": "^6.6.0" }, diff --git a/feature-libs/requested-delivery-date/package.json b/feature-libs/requested-delivery-date/package.json index c97e2c4a6ac..48bc5689330 100644 --- a/feature-libs/requested-delivery-date/package.json +++ b/feature-libs/requested-delivery-date/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/requested-delivery-date", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "Requested Delivery Date library for Spartacus", "keywords": [ "spartacus", @@ -29,13 +29,13 @@ "@angular/common": "^15.2.9", "@angular/core": "^15.2.9", "@angular/forms": "^15.2.9", - "@spartacus/cart": "6.3.0-1", - "@spartacus/checkout": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/order": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/checkout": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/order": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", "rxjs": "^6.6.0" }, "publishConfig": { diff --git a/feature-libs/smartedit/package.json b/feature-libs/smartedit/package.json index 5740fa0a2fd..09a55b499a3 100644 --- a/feature-libs/smartedit/package.json +++ b/feature-libs/smartedit/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/smartedit", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "Smart Edit feature library for Spartacus", "keywords": [ "spartacus", @@ -23,8 +23,8 @@ "@angular-devkit/schematics": "^15.2.9", "@angular/common": "^15.2.9", "@angular/core": "^15.2.9", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", "rxjs": "^6.6.0" }, "publishConfig": { diff --git a/feature-libs/storefinder/package.json b/feature-libs/storefinder/package.json index fc64dbba441..c888554bb06 100644 --- a/feature-libs/storefinder/package.json +++ b/feature-libs/storefinder/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/storefinder", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "Store finder feature library for Spartacus", "keywords": [ "spartacus", @@ -32,10 +32,10 @@ "@angular/router": "^15.2.9", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", "bootstrap": "^4.6.2", "rxjs": "^6.6.0" }, diff --git a/feature-libs/tracking/package.json b/feature-libs/tracking/package.json index 4d1866111fb..c7b6f08f3b3 100644 --- a/feature-libs/tracking/package.json +++ b/feature-libs/tracking/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/tracking", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "Spartacus tracking and personalization library", "keywords": [ "spartacus", @@ -27,8 +27,8 @@ "@angular-devkit/schematics": "^15.2.9", "@angular/common": "^15.2.9", "@angular/core": "^15.2.9", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", "rxjs": "^6.6.0" }, "publishConfig": { diff --git a/feature-libs/user/package.json b/feature-libs/user/package.json index 7db8fb1b361..577ba072b24 100644 --- a/feature-libs/user/package.json +++ b/feature-libs/user/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/user", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "User feature library for Spartacus", "keywords": [ "spartacus", @@ -32,10 +32,10 @@ "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/store": "^15.3.0", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", "rxjs": "^6.6.0" }, "publishConfig": { diff --git a/integration-libs/cdc/package.json b/integration-libs/cdc/package.json index 5fca4c0987b..e7fcc601152 100644 --- a/integration-libs/cdc/package.json +++ b/integration-libs/cdc/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/cdc", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "Customer Data Cloud Integration library for Spartacus", "keywords": [ "spartacus", @@ -30,12 +30,12 @@ "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", - "@spartacus/asm": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/organization": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/user": "6.3.0-1", + "@spartacus/asm": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/organization": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/user": "6.5.0-1", "rxjs": "^6.6.0" }, "publishConfig": { diff --git a/integration-libs/cds/package.json b/integration-libs/cds/package.json index 85180e6bfb7..b5e02f5529f 100644 --- a/integration-libs/cds/package.json +++ b/integration-libs/cds/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/cds", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "Context Driven Service library for Spartacus", "keywords": [ "spartacus", @@ -28,12 +28,12 @@ "@angular/core": "^15.2.9", "@angular/router": "^15.2.9", "@ngrx/store": "^15.3.0", - "@spartacus/cart": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/order": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/tracking": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/order": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/tracking": "6.5.0-1", "rxjs": "^6.6.0" }, "publishConfig": { diff --git a/integration-libs/digital-payments/package.json b/integration-libs/digital-payments/package.json index 6fb40bb5f5b..a1e1e32d33a 100644 --- a/integration-libs/digital-payments/package.json +++ b/integration-libs/digital-payments/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/digital-payments", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "Digital Payments Integration library for Spartacus", "keywords": [ "spartacus", @@ -27,11 +27,11 @@ "@angular/forms": "^15.2.9", "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", - "@spartacus/cart": "6.3.0-1", - "@spartacus/checkout": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/checkout": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", "rxjs": "^6.6.0" }, "publishConfig": { diff --git a/integration-libs/epd-visualization/package.json b/integration-libs/epd-visualization/package.json index 1d6906fe4e3..32479eeef12 100644 --- a/integration-libs/epd-visualization/package.json +++ b/integration-libs/epd-visualization/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/epd-visualization", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "SAP Enterprise Product Development Visualization integration library for Spartacus", "keywords": [ "spartacus", @@ -38,11 +38,11 @@ "@angular/forms": "^15.2.9", "@angular/router": "^15.2.9", "@sapui5/ts-types-esm": "1.108.14", - "@spartacus/cart": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", "bootstrap": "^4.6.2", "rxjs": "^6.6.0" }, diff --git a/integration-libs/s4om/package.json b/integration-libs/s4om/package.json index 8d20f0810f9..c50a8ac267e 100644 --- a/integration-libs/s4om/package.json +++ b/integration-libs/s4om/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/s4om", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "S/4HANA Order Management (b2b feature)", "keywords": [ "spartacus", @@ -23,13 +23,13 @@ "@angular-devkit/schematics": "^15.2.9", "@angular/common": "^15.2.9", "@angular/core": "^15.2.9", - "@spartacus/cart": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/pdf-invoices": "6.3.0-1", - "@spartacus/requested-delivery-date": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/pdf-invoices": "6.5.0-1", + "@spartacus/requested-delivery-date": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", "rxjs": "^6.6.0" }, "publishConfig": { diff --git a/integration-libs/segment-refs/package.json b/integration-libs/segment-refs/package.json index 3e5ba2bd03d..9de2d251ff6 100644 --- a/integration-libs/segment-refs/package.json +++ b/integration-libs/segment-refs/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/segment-refs", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "segment-refs", "keywords": [ "spartacus", @@ -23,8 +23,8 @@ "@angular-devkit/schematics": "^15.2.9", "@angular/common": "^15.2.9", "@angular/core": "^15.2.9", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", "rxjs": "^6.6.0" }, "publishConfig": { diff --git a/projects/assets/package.json b/projects/assets/package.json index 22f2561fe78..470dea8bb63 100644 --- a/projects/assets/package.json +++ b/projects/assets/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/assets", - "version": "6.3.0-1", + "version": "6.5.0-1", "homepage": "https://github.com/SAP/spartacus", "repository": "https://github.com/SAP/spartacus/tree/develop/projects/assets", "scripts": { diff --git a/projects/core/package.json b/projects/core/package.json index a26de809049..87acd73c2ae 100644 --- a/projects/core/package.json +++ b/projects/core/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/core", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "Spartacus - the core framework", "keywords": [ "spartacus", diff --git a/projects/schematics/package.json b/projects/schematics/package.json index ce220c5b58a..eb81a19cbad 100644 --- a/projects/schematics/package.json +++ b/projects/schematics/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/schematics", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "Spartacus schematics", "keywords": [ "spartacus", diff --git a/projects/schematics/src/dependencies.json b/projects/schematics/src/dependencies.json index b563cc10f57..f7390376483 100644 --- a/projects/schematics/src/dependencies.json +++ b/projects/schematics/src/dependencies.json @@ -35,7 +35,7 @@ "@ngrx/effects": "^15.3.0", "@ngrx/router-store": "^15.3.0", "@ngrx/store": "^15.3.0", - "@spartacus/core": "6.3.0-1", + "@spartacus/core": "6.5.0-1", "ngx-infinite-scroll": "^15.0.0", "rxjs": "^6.6.0" }, @@ -47,10 +47,10 @@ }, "@spartacus/setup": { "@angular/core": "^15.2.9", - "@spartacus/cart": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/order": "6.3.0-1", - "@spartacus/user": "6.3.0-1" + "@spartacus/cart": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/order": "6.5.0-1", + "@spartacus/user": "6.5.0-1" }, "@spartacus/asm": { "@angular-devkit/schematics": "^15.2.9", @@ -60,12 +60,12 @@ "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", - "@spartacus/cart": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", - "@spartacus/user": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", + "@spartacus/user": "6.5.0-1", "rxjs": "^6.6.0" }, "@spartacus/cart": { @@ -77,11 +77,11 @@ "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", - "@spartacus/user": "6.3.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", + "@spartacus/user": "6.5.0-1", "bootstrap": "^4.6.2", "rxjs": "^6.6.0" }, @@ -93,13 +93,13 @@ "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/store": "^15.3.0", - "@spartacus/cart": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/order": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", - "@spartacus/user": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/order": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", + "@spartacus/user": "6.5.0-1", "bootstrap": "^4.6.2", "rxjs": "^6.6.0" }, @@ -109,11 +109,11 @@ "@angular/core": "^15.2.9", "@angular/forms": "^15.2.9", "@angular/router": "^15.2.9", - "@spartacus/cart": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", "rxjs": "^6.6.0" }, "@spartacus/order": { @@ -125,12 +125,12 @@ "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", - "@spartacus/cart": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", - "@spartacus/user": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", + "@spartacus/user": "6.5.0-1", "rxjs": "^6.6.0" }, "@spartacus/organization": { @@ -142,25 +142,25 @@ "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", - "@spartacus/cart": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/order": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", - "@spartacus/user": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/order": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", + "@spartacus/user": "6.5.0-1", "bootstrap": "^4.6.2", "rxjs": "^6.6.0" }, "@spartacus/pdf-invoices": { - "@angular-devkit/schematics": "^15.2.4", - "@angular/common": "^15.2.4", - "@angular/core": "^15.2.4", - "@angular/forms": "^15.2.4", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", + "@angular-devkit/schematics": "^15.2.9", + "@angular/common": "^15.2.9", + "@angular/core": "^15.2.9", + "@angular/forms": "^15.2.9", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", "rxjs": "^6.6.0" }, "@spartacus/pickup-in-store": { @@ -171,14 +171,14 @@ "@angular/router": "^15.2.9", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", - "@spartacus/cart": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/order": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefinder": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", - "@spartacus/user": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/order": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefinder": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", + "@spartacus/user": "6.5.0-1", "bootstrap": "^4.6.2", "rxjs": "^6.6.0" }, @@ -187,10 +187,10 @@ "@angular/common": "^15.2.9", "@angular/core": "^15.2.9", "@angular/router": "^15.2.9", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", "bootstrap": "^4.6.2", "rxjs": "^6.6.0" }, @@ -203,22 +203,22 @@ "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", - "@spartacus/cart": "6.3.0-1", - "@spartacus/checkout": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/order": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/checkout": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/order": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", "rxjs": "^6.6.0" }, "@spartacus/qualtrics": { "@angular-devkit/schematics": "^15.2.9", "@angular/common": "^15.2.9", "@angular/core": "^15.2.9", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", "bootstrap": "^4.6.2", "rxjs": "^6.6.0" }, @@ -227,21 +227,21 @@ "@angular/common": "^15.2.9", "@angular/core": "^15.2.9", "@angular/forms": "^15.2.9", - "@spartacus/cart": "6.3.0-1", - "@spartacus/checkout": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/order": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/checkout": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/order": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", "rxjs": "^6.6.0" }, "@spartacus/smartedit": { "@angular-devkit/schematics": "^15.2.9", "@angular/common": "^15.2.9", "@angular/core": "^15.2.9", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", "rxjs": "^6.6.0" }, "@spartacus/storefinder": { @@ -252,10 +252,10 @@ "@angular/router": "^15.2.9", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", "bootstrap": "^4.6.2", "rxjs": "^6.6.0" }, @@ -263,8 +263,8 @@ "@angular-devkit/schematics": "^15.2.9", "@angular/common": "^15.2.9", "@angular/core": "^15.2.9", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", "rxjs": "^6.6.0" }, "@spartacus/user": { @@ -275,10 +275,10 @@ "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", "@ngrx/store": "^15.3.0", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", "rxjs": "^6.6.0" }, "@spartacus/cdc": { @@ -290,12 +290,12 @@ "@ng-select/ng-select": "^10.0.3", "@ngrx/effects": "^15.3.0", "@ngrx/store": "^15.3.0", - "@spartacus/asm": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/organization": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/user": "6.3.0-1", + "@spartacus/asm": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/organization": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/user": "6.5.0-1", "rxjs": "^6.6.0" }, "@spartacus/cds": { @@ -304,12 +304,12 @@ "@angular/core": "^15.2.9", "@angular/router": "^15.2.9", "@ngrx/store": "^15.3.0", - "@spartacus/cart": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/order": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/tracking": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/order": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/tracking": "6.5.0-1", "rxjs": "^6.6.0" }, "@spartacus/digital-payments": { @@ -319,11 +319,11 @@ "@angular/forms": "^15.2.9", "@angular/router": "^15.2.9", "@ng-select/ng-select": "^10.0.3", - "@spartacus/cart": "6.3.0-1", - "@spartacus/checkout": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/checkout": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", "rxjs": "^6.6.0" }, "@spartacus/epd-visualization": { @@ -333,11 +333,11 @@ "@angular/forms": "^15.2.9", "@angular/router": "^15.2.9", "@sapui5/ts-types-esm": "1.108.14", - "@spartacus/cart": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", "bootstrap": "^4.6.2", "rxjs": "^6.6.0" }, @@ -345,21 +345,21 @@ "@angular-devkit/schematics": "^15.2.9", "@angular/common": "^15.2.9", "@angular/core": "^15.2.9", - "@spartacus/cart": "6.3.0-1", - "@spartacus/core": "6.3.0-1", - "@spartacus/pdf-invoices": "6.3.0-1", - "@spartacus/requested-delivery-date": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", - "@spartacus/storefront": "6.3.0-1", - "@spartacus/styles": "6.3.0-1", + "@spartacus/cart": "6.5.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/pdf-invoices": "6.5.0-1", + "@spartacus/requested-delivery-date": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", + "@spartacus/storefront": "6.5.0-1", + "@spartacus/styles": "6.5.0-1", "rxjs": "^6.6.0" }, "@spartacus/segment-refs": { "@angular-devkit/schematics": "^15.2.9", "@angular/common": "^15.2.9", "@angular/core": "^15.2.9", - "@spartacus/core": "6.3.0-1", - "@spartacus/schematics": "6.3.0-1", + "@spartacus/core": "6.5.0-1", + "@spartacus/schematics": "6.5.0-1", "rxjs": "^6.6.0" }, "storefrontapp": { diff --git a/projects/schematics/src/migrations/migrations.json b/projects/schematics/src/migrations/migrations.json index 01112d36515..f8815c12d67 100644 --- a/projects/schematics/src/migrations/migrations.json +++ b/projects/schematics/src/migrations/migrations.json @@ -139,52 +139,52 @@ }, "00-migration-v6-ssr": { - "version": "6.3.0-1", + "version": "6.5.0-1", "factory": "./6_0/ssr/ssr#migrate", "description": "Updates the SSR setup" }, "01-migration-v6-config-deprecations": { - "version": "6.3.0-1", + "version": "6.5.0-1", "factory": "./6_0/config-deprecations/config-deprecations#migrate", "description": "Handle deprecated configuration properties" }, "02-migration-v6-constructor-deprecations": { - "version": "6.3.0-1", + "version": "6.5.0-1", "factory": "./6_0/constructor-deprecations/constructor-deprecations#migrate", "description": "Add or remove constructor parameters" }, "03-migration-v6-css": { - "version": "6.3.0-1", + "version": "6.5.0-1", "factory": "./6_0/css/css#migrate", "description": "Handle deprecated CSS" }, "04-migration-v6-dependency-management": { - "version": "6.3.0-1", + "version": "6.5.0-1", "factory": "./6_0/dependency-management/dependency-management#migrate", "description": "Update dependencies" }, "05-migration-v6-methods-and-properties-deprecations": { - "version": "6.3.0-1", + "version": "6.5.0-1", "factory": "./6_0/methods-and-properties-deprecations/methods-and-properties-deprecations#migrate", "description": "Comment about usage of removed public methods or properties" }, "06-migration-v6-missing-packages": { - "version": "6.3.0-1", + "version": "6.5.0-1", "factory": "./6_0/missing-packages/missing-packages#migrate", "description": "Check missing packages" }, "07-migration-v6-removed-public-api-deprecations": { - "version": "6.3.0-1", + "version": "6.5.0-1", "factory": "./6_0/removed-public-api-deprecations/removed-public-api-deprecations#migrate", "description": "Comment about usage of removed public api" }, "08-migration-v6-rename-symbol": { - "version": "6.3.0-1", + "version": "6.5.0-1", "factory": "./6_0/rename-symbol/rename-symbol#migrate", "description": "Rename import symbols that were moved/changed in majors" }, "09-migration-v6-angular-json-styling": { - "version": "6.3.0-1", + "version": "6.5.0-1", "factory": "./6_0/angular-json-styles/angular-json-styles#migrate", "description": "Update the angular.json with the style preprocessor options" } diff --git a/projects/schematics/src/ng-add/__snapshots__/index_spec.ts.snap b/projects/schematics/src/ng-add/__snapshots__/index_spec.ts.snap index b6451fe9068..f0720fff3e4 100644 --- a/projects/schematics/src/ng-add/__snapshots__/index_spec.ts.snap +++ b/projects/schematics/src/ng-add/__snapshots__/index_spec.ts.snap @@ -63,11 +63,11 @@ exports[`Spartacus Schematics: ng-add should add spartacus properly with SSR 2`] "@ngrx/router-store": "^15.3.0", "@ngrx/store": "^15.3.0", "@nguniversal/express-engine": "^15.2.0", - "@spartacus/assets": "~6.3.0-1", - "@spartacus/core": "~6.3.0-1", - "@spartacus/setup": "~6.3.0-1", - "@spartacus/storefront": "~6.3.0-1", - "@spartacus/styles": "~6.3.0-1", + "@spartacus/assets": "~6.5.0-1", + "@spartacus/core": "~6.5.0-1", + "@spartacus/setup": "~6.5.0-1", + "@spartacus/storefront": "~6.5.0-1", + "@spartacus/styles": "~6.5.0-1", "angular-oauth2-oidc": "^15.0.1", "bootstrap": "^4.6.2", "express": "^4.15.2", diff --git a/projects/storefrontlib/package.json b/projects/storefrontlib/package.json index 56b2c7fcd77..d45d0d961e9 100644 --- a/projects/storefrontlib/package.json +++ b/projects/storefrontlib/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/storefront", - "version": "6.3.0-1", + "version": "6.5.0-1", "keywords": [ "spartacus", "storefront", @@ -23,7 +23,7 @@ "@ngrx/effects": "^15.3.0", "@ngrx/router-store": "^15.3.0", "@ngrx/store": "^15.3.0", - "@spartacus/core": "6.3.0-1", + "@spartacus/core": "6.5.0-1", "ngx-infinite-scroll": "^15.0.0", "rxjs": "^6.6.0" }, diff --git a/projects/storefrontstyles/package.json b/projects/storefrontstyles/package.json index dfdd9ebbd93..eb7e3b9434d 100644 --- a/projects/storefrontstyles/package.json +++ b/projects/storefrontstyles/package.json @@ -1,6 +1,6 @@ { "name": "@spartacus/styles", - "version": "6.3.0-1", + "version": "6.5.0-1", "description": "Style library containing global styles", "keywords": [ "spartacus", diff --git a/projects/storefrontstyles/scss/_versioning.scss b/projects/storefrontstyles/scss/_versioning.scss index 5ba22c35349..a8a375e9cef 100644 --- a/projects/storefrontstyles/scss/_versioning.scss +++ b/projects/storefrontstyles/scss/_versioning.scss @@ -24,7 +24,7 @@ // or `$styleVersion` are enabled. $_fullVersion: ( major: 6, - minor: 4, + minor: 5, patch: 0, ); diff --git a/tools/config/const.ts b/tools/config/const.ts index 6ae750650b3..76c8e4131b5 100644 --- a/tools/config/const.ts +++ b/tools/config/const.ts @@ -10,4 +10,4 @@ export const SPARTACUS_SCOPE = '@spartacus'; export const SAP_SCOPE = 'sap'; export const SAPUI5_TYPES = '@sapui5/ts-types-esm'; export const SPARTACUS_SCHEMATICS = `${SPARTACUS_SCOPE}/schematics`; -export const PUBLISHING_VERSION = ''; +export const PUBLISHING_VERSION = '6.5.0-1'; From ae83fd2dc9053336526b7dad2c86e09d43542fae Mon Sep 17 00:00:00 2001 From: Florent Letendre Date: Mon, 25 Sep 2023 09:58:46 -0400 Subject: [PATCH 18/19] fix: install failing due to mismatch version (#17870) CXSPA-4403 Spartacus_version specified in install config file now overwrites publishing_version. --- scripts/install/functions.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install/functions.sh b/scripts/install/functions.sh index df92a810142..a224fb13b9f 100644 --- a/scripts/install/functions.sh +++ b/scripts/install/functions.sh @@ -82,7 +82,7 @@ function update_projects_versions { fi printh "Updating all library versions to ${SPARTACUS_VERSION}" - (cd "${CLONE_DIR}/tools/config" && pwd && sed -i -E 's/PUBLISHING_VERSION = '\'\''/PUBLISHING_VERSION = '\'"${SPARTACUS_VERSION}"\''/g' const.ts); + (cd "${CLONE_DIR}/tools/config" && pwd && sed -i -E 's/PUBLISHING_VERSION = '\'.*\''/PUBLISHING_VERSION = '\'"${SPARTACUS_VERSION}"\''/g' const.ts); (cd "${CLONE_DIR}" && pwd && npm run config:update -- --generate-deps); } From 0dd42d4ab0121265024ee092d7cb3ef8640bf475 Mon Sep 17 00:00:00 2001 From: kpawelczak <42094017+kpawelczak@users.noreply.github.com> Date: Wed, 27 Sep 2023 14:11:03 +0200 Subject: [PATCH 19/19] fix: smart edit infinite loader fix (#17877) Co-authored-by: github-actions[bot] Co-authored-by: Krzysztof Platis --- .../core/services/smart-edit.service.ts | 2 +- .../smart-edit-launcher.service.spec.ts | 23 ++++++++++++++++++- .../services/smart-edit-launcher.service.ts | 8 +++++-- .../smartedit/root/smart-edit-root.module.ts | 13 +---------- projects/core/src/cms/config/cms-config.ts | 2 ++ .../guards/cms-page-guard.service.spec.ts | 20 +--------------- .../guards/cms-page-guard.service.ts | 7 ------ 7 files changed, 33 insertions(+), 42 deletions(-) diff --git a/feature-libs/smartedit/core/services/smart-edit.service.ts b/feature-libs/smartedit/core/services/smart-edit.service.ts index a4d1db8885f..ad824d4fdbe 100644 --- a/feature-libs/smartedit/core/services/smart-edit.service.ts +++ b/feature-libs/smartedit/core/services/smart-edit.service.ts @@ -13,8 +13,8 @@ import { RoutingService, WindowRef, } from '@spartacus/core'; -import { SmartEditConfig } from '@spartacus/smartedit/root'; import { filter, take } from 'rxjs/operators'; +import { SmartEditConfig } from '@spartacus/smartedit/root'; @Injectable({ providedIn: 'root', diff --git a/feature-libs/smartedit/root/services/smart-edit-launcher.service.spec.ts b/feature-libs/smartedit/root/services/smart-edit-launcher.service.spec.ts index d774f300736..7364432d58b 100644 --- a/feature-libs/smartedit/root/services/smart-edit-launcher.service.spec.ts +++ b/feature-libs/smartedit/root/services/smart-edit-launcher.service.spec.ts @@ -1,9 +1,10 @@ import { Location } from '@angular/common'; import { TestBed } from '@angular/core/testing'; -import { ScriptLoader } from '@spartacus/core'; +import { FeatureModulesService, ScriptLoader } from '@spartacus/core'; import { defaultSmartEditConfig } from '../config/default-smart-edit-config'; import { SmartEditConfig } from '../config/smart-edit-config'; import { SmartEditLauncherService } from './smart-edit-launcher.service'; +import { of } from 'rxjs'; class MockLocation { path() { @@ -15,10 +16,16 @@ class MockScriptLoader { public embedScript(): void {} } +class MockFeatureModulesService implements Partial { + isConfigured = () => true; + resolveFeature = () => of(undefined); +} + describe('SmartEditLauncherService', () => { let smartEditLauncherService: SmartEditLauncherService; let location: Location; let scriptLoader: ScriptLoader; + let featureModules: FeatureModulesService; beforeEach(() => { TestBed.configureTestingModule({ @@ -26,12 +33,14 @@ describe('SmartEditLauncherService', () => { { provide: Location, useClass: MockLocation }, { provide: SmartEditConfig, useValue: defaultSmartEditConfig }, { provide: ScriptLoader, useClass: MockScriptLoader }, + { provide: FeatureModulesService, useClass: MockFeatureModulesService }, ], }); smartEditLauncherService = TestBed.inject(SmartEditLauncherService); location = TestBed.inject(Location); scriptLoader = TestBed.inject(ScriptLoader); + featureModules = TestBed.inject(FeatureModulesService); }); it('should be created', () => { @@ -62,6 +71,18 @@ describe('SmartEditLauncherService', () => { }); }); + describe('should lazy load SmartEditModule', () => { + it('lazy load SmartEditModule', () => { + spyOn(location, 'path').and.returnValue( + '/any/cx-preview?cmsTicketId=test-cms-ticket-id' + ); + spyOn(featureModules, 'resolveFeature').and.callThrough(); + + smartEditLauncherService.load(); + expect(featureModules.resolveFeature).toHaveBeenCalledWith('smartEdit'); + }); + }); + it('should be able to load webApplicationInjector.js', () => { spyOn(location, 'path').and.returnValue( '/any/cx-preview?cmsTicketId=test-cms-ticket-id' diff --git a/feature-libs/smartedit/root/services/smart-edit-launcher.service.ts b/feature-libs/smartedit/root/services/smart-edit-launcher.service.ts index 44c11833368..c874418f83f 100644 --- a/feature-libs/smartedit/root/services/smart-edit-launcher.service.ts +++ b/feature-libs/smartedit/root/services/smart-edit-launcher.service.ts @@ -5,9 +5,10 @@ */ import { Location } from '@angular/common'; -import { Injectable } from '@angular/core'; -import { ScriptLoader } from '@spartacus/core'; +import { inject, Injectable } from '@angular/core'; +import { FeatureModulesService, ScriptLoader } from '@spartacus/core'; import { SmartEditConfig } from '../config/smart-edit-config'; +import { SMART_EDIT_FEATURE } from '../feature-name'; /** * The SmartEditLauncherService is used to check whether Spartacus is launched inside Smart Edit; @@ -17,6 +18,7 @@ import { SmartEditConfig } from '../config/smart-edit-config'; providedIn: 'root', }) export class SmartEditLauncherService { + protected readonly featureModulesService = inject(FeatureModulesService); private _cmsTicketId: string | undefined; get cmsTicketId(): string | undefined { @@ -34,6 +36,8 @@ export class SmartEditLauncherService { */ load(): void { if (this.isLaunchedInSmartEdit()) { + this.featureModulesService.resolveFeature(SMART_EDIT_FEATURE).subscribe(); + this.scriptLoader?.embedScript({ src: 'assets/webApplicationInjector.js', params: undefined, diff --git a/feature-libs/smartedit/root/smart-edit-root.module.ts b/feature-libs/smartedit/root/smart-edit-root.module.ts index 3996328633e..3b8b99849d3 100644 --- a/feature-libs/smartedit/root/smart-edit-root.module.ts +++ b/feature-libs/smartedit/root/smart-edit-root.module.ts @@ -5,12 +5,8 @@ */ import { APP_INITIALIZER, NgModule } from '@angular/core'; -import { - provideDefaultConfig, - SMART_EDIT_DUMMY_COMPONENT_TYPE, -} from '@spartacus/core'; +import { provideDefaultConfig } from '@spartacus/core'; import { defaultSmartEditConfig } from './config/default-smart-edit-config'; -import { SMART_EDIT_FEATURE } from './feature-name'; import { interceptors } from './http-interceptors/index'; import { SmartEditLauncherService } from './services/smart-edit-launcher.service'; @@ -33,13 +29,6 @@ export function smartEditFactory( deps: [SmartEditLauncherService], multi: true, }, - provideDefaultConfig({ - featureModules: { - [SMART_EDIT_FEATURE]: { - cmsComponents: [SMART_EDIT_DUMMY_COMPONENT_TYPE], - }, - }, - }), ], }) export class SmartEditRootModule {} diff --git a/projects/core/src/cms/config/cms-config.ts b/projects/core/src/cms/config/cms-config.ts index 1f9e623082e..9c0ec6eb06e 100644 --- a/projects/core/src/cms/config/cms-config.ts +++ b/projects/core/src/cms/config/cms-config.ts @@ -41,6 +41,8 @@ export interface JspIncludeCmsComponentConfig { export const JSP_INCLUDE_CMS_COMPONENT_TYPE = 'JspIncludeComponent'; export const CMS_FLEX_COMPONENT_TYPE = 'CMSFlexComponent'; + +/** @deprecated - unused since 6.5. Now `SmartEditLauncher` is responsible for triggering the lazy loading of the `SMART_EDIT_FEATURE` */ export const SMART_EDIT_DUMMY_COMPONENT_TYPE = 'SmartEditDummyCMSComponent'; /** diff --git a/projects/storefrontlib/cms-structure/guards/cms-page-guard.service.spec.ts b/projects/storefrontlib/cms-structure/guards/cms-page-guard.service.spec.ts index 85b2d78cde1..29aeb50f743 100644 --- a/projects/storefrontlib/cms-structure/guards/cms-page-guard.service.spec.ts +++ b/projects/storefrontlib/cms-structure/guards/cms-page-guard.service.spec.ts @@ -9,8 +9,6 @@ import { PageType, RoutingService, SemanticPathService, - SMART_EDIT_CONTEXT, - SMART_EDIT_DUMMY_COMPONENT_TYPE, } from '@spartacus/core'; import { CmsComponentsService } from '@spartacus/storefront'; import { NEVER, of } from 'rxjs'; @@ -34,6 +32,7 @@ class MockCmsService implements Partial { getPageIndex = () => of(''); setPageFailIndex = () => {}; } + class MockCmsRoutesService implements Partial { handleCmsRoutesInGuard = () => true; } @@ -61,7 +60,6 @@ describe('CmsPageGuardService', () => { let cmsGuards: CmsGuardsService; let semanticPath: SemanticPathService; let service: CmsPageGuardService; - let cmsComponentsService: CmsComponentsService; beforeEach(() => { TestBed.configureTestingModule({ @@ -88,7 +86,6 @@ describe('CmsPageGuardService', () => { cmsI18n = TestBed.inject(CmsI18nService); cmsGuards = TestBed.inject(CmsGuardsService); semanticPath = TestBed.inject(SemanticPathService); - cmsComponentsService = TestBed.inject(CmsComponentsService); service = TestBed.inject(CmsPageGuardService); }); @@ -115,21 +112,6 @@ describe('CmsPageGuardService', () => { expect(cms.getPageComponentTypes).toHaveBeenCalledWith(pageContext); }); - it('should get a specific component type SMART_EDIT_DUMMY_COMPONENT_TYPE for SmartEdit review page', () => { - pageContext = { type: PageType.CONTENT_PAGE, id: SMART_EDIT_CONTEXT }; - spyOn(cms, 'getPageComponentTypes').and.returnValue(of([])); - spyOn(cmsComponentsService, 'determineMappings').and.callThrough(); - - service - .canActivatePage(pageContext, pageData, route, state) - .subscribe() - .unsubscribe(); - expect(cms.getPageComponentTypes).toHaveBeenCalledWith(pageContext); - expect(cmsComponentsService.determineMappings).toHaveBeenCalledWith([ - SMART_EDIT_DUMMY_COMPONENT_TYPE, - ]); - }); - describe('when CmsGuardsService emits false', () => { beforeEach(() => { spyOn(cmsGuards, 'cmsPageCanActivate').and.returnValue(of(false)); diff --git a/projects/storefrontlib/cms-structure/guards/cms-page-guard.service.ts b/projects/storefrontlib/cms-structure/guards/cms-page-guard.service.ts index f480bbc4003..6aa00a613c7 100644 --- a/projects/storefrontlib/cms-structure/guards/cms-page-guard.service.ts +++ b/projects/storefrontlib/cms-structure/guards/cms-page-guard.service.ts @@ -14,8 +14,6 @@ import { PageType, RoutingService, SemanticPathService, - SMART_EDIT_CONTEXT, - SMART_EDIT_DUMMY_COMPONENT_TYPE, } from '@spartacus/core'; import { Observable, of } from 'rxjs'; import { @@ -71,11 +69,6 @@ export class CmsPageGuardService { state: RouterStateSnapshot ): Observable { return this.cmsService.getPageComponentTypes(pageContext).pipe( - map((componentTypes) => - pageContext.id === SMART_EDIT_CONTEXT - ? [SMART_EDIT_DUMMY_COMPONENT_TYPE, ...componentTypes] - : componentTypes - ), take(1), switchMap((componentTypes) => this.cmsComponentsService.determineMappings(componentTypes)