From 6571f4bd4426819fa2715ce634d004c744c77e8e Mon Sep 17 00:00:00 2001 From: Lucao Adam Date: Fri, 17 May 2024 10:59:23 +0545 Subject: [PATCH 1/2] config updated --- package.json | 5 +- public/favicon/android-chrome-192x192.png | Bin 0 -> 2298 bytes public/favicon/android-chrome-512x512.png | Bin 0 -> 4894 bytes public/favicon/apple-touch-icon-120x120.png | Bin 736 -> 0 bytes public/favicon/apple-touch-icon-152x152.png | Bin 833 -> 0 bytes public/favicon/apple-touch-icon-180x180.png | Bin 791 -> 1740 bytes public/favicon/apple-touch-icon-60x60.png | Bin 515 -> 0 bytes public/favicon/apple-touch-icon-76x76.png | Bin 561 -> 0 bytes public/favicon/apple-touch-icon.png | Bin 791 -> 0 bytes public/favicon/favicon-16x16.png | Bin 383 -> 633 bytes public/favicon/favicon-32x32.png | Bin 439 -> 844 bytes public/favicon/favicon.ico | Bin 15086 -> 15086 bytes public/favicon/mstile-144x144.png | Bin 0 -> 1821 bytes public/favicon/mstile-150x150.png | Bin 0 -> 1879 bytes public/favicon/mstile-310x150.png | Bin 0 -> 2063 bytes public/favicon/mstile-310x310.png | Bin 0 -> 3521 bytes public/favicon/mstile-70x70.png | Bin 0 -> 1442 bytes public/favicon/safari-pinned-tab.svg | 4 +- ui/snippets/footer/Footer.tsx | 184 ++++++++++---------- yarn.lock | 56 ++++++ 20 files changed, 149 insertions(+), 100 deletions(-) create mode 100644 public/favicon/android-chrome-192x192.png create mode 100644 public/favicon/android-chrome-512x512.png delete mode 100644 public/favicon/apple-touch-icon-120x120.png delete mode 100644 public/favicon/apple-touch-icon-152x152.png delete mode 100644 public/favicon/apple-touch-icon-60x60.png delete mode 100644 public/favicon/apple-touch-icon-76x76.png delete mode 100644 public/favicon/apple-touch-icon.png create mode 100644 public/favicon/mstile-144x144.png create mode 100644 public/favicon/mstile-150x150.png create mode 100644 public/favicon/mstile-310x150.png create mode 100644 public/favicon/mstile-310x310.png create mode 100644 public/favicon/mstile-70x70.png diff --git a/package.json b/package.json index fde1113c2e..e176f118e3 100644 --- a/package.json +++ b/package.json @@ -11,9 +11,9 @@ "dev": "./tools/scripts/dev.sh", "dev:preset": "./tools/scripts/dev.preset.sh", "build": "next build", - "build:docker": "docker build --build-arg GIT_COMMIT_SHA=$(git rev-parse --short HEAD) --build-arg GIT_TAG=$(git describe --tags --abbrev=0) -t blockscout-frontend:local ./", + "build:docker": "docker build --platform linux/amd64 --build-arg GIT_COMMIT_SHA=$(git rev-parse --short HEAD) --build-arg GIT_TAG=$(git describe --tags --abbrev=0) -t lucoadam/blockscout-naut-frontend ./", "start": "next start", - "start:docker:local": "docker run -p 3000:3000 --env-file .env.local blockscout-frontend:local", + "start:docker:local": "docker run -p 3000:3000 --env-file .env.local lucoadam/blockscout-naut-frontend", "start:docker:preset": "./tools/scripts/docker.preset.sh", "lint:eslint": "eslint . --ext .js,.jsx,.ts,.tsx", "lint:eslint:fix": "eslint . --ext .js,.jsx,.ts,.tsx --fix", @@ -123,6 +123,7 @@ "@types/mixpanel-browser": "^2.38.1", "@types/node": "20.11.0", "@types/phoenix": "^1.5.4", + "@types/pino": "^7.0.5", "@types/qrcode": "^1.5.0", "@types/react": "18.0.9", "@types/react-dom": "18.0.5", diff --git a/public/favicon/android-chrome-192x192.png b/public/favicon/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..55542b97b911eb947258a6decdc6d7ef83af8422 GIT binary patch literal 2298 zcmZ`(30PBC7QT-d!Xk@;iiq|}US2{HLL@92mVgb)Qnm`Odrd-2eUOod2Br z<>g0&ZL~16Hv<4z1OZfs#-FGI0Qi zPXU;P5HSKk1|NViDFDJ#04!6eFGqRL9xDF2M z3{h+ble^l<$pCWT4>}A61YvU0H>l;3wQv|qD#4*JCKoyw#wNk{%+*{j4sk;iNi#SY zP9iuC4VK_S2lC%GPG)9s0f>fV29wQXGD$L%L+2O>EYc^9!EtmHz$jRh3}iT=DEjWz zTf+N_zX$0oXN*m@_AbycD_8}}z%ZDZO{RjX$P9*NA=99fTv=oxgJx1NlgV>*a$4o= zjFD4wZwFSS(_slNFSNU86J26e)#bY|d&mPs+>1h50C)|KU?eY}xp zIsVg`y@4x+>y^Rgu&zI7Cr267z+T52r zX4VXx+y3*iulrspE2v~AC~r>uFc)*+);WU!r3=x3O0hohHMnKRX;d<1s+Tlf!opn*jh?H zNPnv5EeO(-L7@S(5vsK@!%g<=q96PRMg@ueqxRjO&{03OjkGl$s?9T5nipzf#&#^Q z8?mqbv_LAO<>hN)Jv|DJ>(1QMWxXl)5-gRp%$%>BTlI8?vbXJ|V9Hx?(zGupuGf`y zE?S`&FZ8I2Ngeq1Y4@5PNgK{(>%_`}pC8n4_}ZXmy-((b)s#AMNBeY+@z(rfGj~v3 z)5GWb;vow(@^S)wbf8h>p-o?lS!i{+YRu{*|4O3N|8Nyk%E&NzzQ8+ZMS%|z9(%+; zTwDB*u0=|G7d!a5by6)gJ*GpzzSzi8bK#K|vEB4!SBLY?pE^EM#e@@ys1W_cXqqQ3 zDKfRx)F~7|{v{>RQ7G+=Q-EO&Zg%e*L z4kzL@ltf&JE?j9{1S~b%Mu`3q!h6|TVzLKG??%#lkg3O-|NyPR`YU&8C8!X1kw8sXvy{=s1pbZ|KuB_{n zfz2V!&EFhBPIV4?i%dUTgaw^!-c)C0Qmo&dQ12_vRjRxgvk4`#>J~4jKI6LL27O$G zhxB`82J=`GvZA`y%juSJN=d^FYRU<6DI=F6xL_e$o*4C3*QO&qy?x&i^}T%+)w?K< ze{HSrTYdeDRO&#+#VZNgunEy-djAWnv#G#X`rfoxcT@P_H=Ap>ClI^$_PT@c`43eJ zX8XsF4y3N{oEeRu7gc+nh?wYKS=gY*Hm*S5pv#w8+gbVX0j&n=C?a*Fy!la%RFU3? zP?5t1k#S}+<!=M^2Gt#i>Kl%oqxEDD7d#R3@0G{7j|(>kDB7bB?&sW<`Z`Lo>rM^?s-$u^ z;gC=`WV}{dZbW;~1QZ`cyreg4nM18*;>%RJ*WZzHwWs>wDvIb%Q+0A8vpF~>eCSCH zU~4O^EHBlcN0#>u5ng61B2MR61h&3}x6TA^XmPM;LN%=+ePBmMfBLY#3U-;PsX4Pqs;i>Vt zEvB73TV40vF@OA7_4z|@>};-PZ9h|p++>#;8DpaCDgw!0*B6XX3jWH;HCLRJdqj&0 zktBDQ@`gs+`DE{d`7PI9DALAgxOU}C>;0DLLne9qUd$f9J3(34Jvq@*-$fD?Rc5nos^;Z*cUr=YvJp4cbn_hoKDE zs*HTDYm89pkl)9N*slLF$(Rv ncl&DlwRVSgS{D(h3Fd*ZWs8)P>)qj37J#6DFmc0rY0kd^_Dnc> literal 0 HcmV?d00001 diff --git a/public/favicon/android-chrome-512x512.png b/public/favicon/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..4ba057af3453ce321bf18032b5d8665595f3af7b GIT binary patch literal 4894 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 literal 0 HcmV?d00001 diff --git a/public/favicon/apple-touch-icon-120x120.png b/public/favicon/apple-touch-icon-120x120.png deleted file mode 100644 index 7f502ce922975e78f84d180d03b3cd5b109cfd6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 736 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#Q3?xr`X+H!~Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaOmt3o15f)dLW3X1a6GILTDN-7Id6*3D-l7Xhod3;Jo!}D1X1G6%>UNX0^ zvat7L5oTcpmj;u=Da^{7LljQmxN_pinIkes*iScjEb!7}(3r~iSW78a9%wXYfk$L9 z14GMw5N4cuLdF;@>&PE^ujIa3 zWVKjfP=Ua%AJSV6JI0o5TCm{4!bQzZ%^FS3ryE1A{0Y4GH0u3QU!O(64{ML_`R-XX z{m%DE?jB2y%ygZ3Z$9VxiAfSG?(cL_+I{fX7Y1<;vDu98T@R_fd)Z&M^F)Bik4Xm% zwNL$gQdPRh!B)L(x8?~?&#I-%lYVe4srayPvVuc4hjPybvpN6x_bmBpn|`!lYL*4( zThUD)g|2=u_%%)FAh&|^t9kp@?F^{YxuD_w;TyBB?beb#M#3iR+nncb{&V3#f4;~TNw+kMtMv+^d!Up1?Z-nL6A^g+`OUG67Z4}>iyy?;=^ zYcG;>J8tt7X@_ms(>NPz*GeCZY!P(Z5&YnjQt-XM%yVwO<}96H-1d0l_FRd>nGZE1 zh1YS_pR6*l`Fc4wSmM^tS(-6Iw=53<9d7_43fK?!ZHW9V@SST`zVAb(`qO63$$^y% z?*BPqbK}hG-3IN#r>8G$`&iZtRJ}UkG)v$1D-5!wKWBFQXEpsd?eBu7g>%{aa#pW8 zKZmQPRrE^L@~JwVmNhG@k~SIkI)6RTl42%(v-sbE`-|W1%Jg8YngWb+22WQ%mvv4F FO#q}wLy`ah diff --git a/public/favicon/apple-touch-icon-152x152.png b/public/favicon/apple-touch-icon-152x152.png deleted file mode 100644 index fbadd1501c5ec383a72eeb698fdf740b9a02bd4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 833 zcmeAS@N?(olHy`uVBq!ia0vp^GeDSy8A!f*V=DxtSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?snBSA|5B1SOU$6cpvBW#*(RlvEa^Dr6RvBr`Bn%z1oDN5k`35CgL^w_Y;0 zu(GiCWD#az1(ybs!zs+ln?n>%-?(z($eANDN7zp{cr5VJW6+q&_gG6QR~~3IXMsm# zF#|)(eGq1xdP2q+D5x0V6XNQVS*Vq>0f@ArXd{dP75S#HX8}+#S4ogxFoW=-d+%-c zr+apO>q-B@z`$hT>EalYaqsP{^ZthnM2?#aFS^5aWI=en%8Nk51@5L&<&WBhY^6-y z{Qk{gv~A4z!f`R-&_!LTZ{c0H8@`rihaWroVW0cG*UR5#Pye2w?YU&q^JU7(#`+hn zByX)R5{foXEnd;%baVOk8)Z(s)7NKi(b(;FWBtrE9lMh+-+6vxvroj752pJc+AQ<< zEnYm2^U}>VjMWoOUYm-&5jc<#Fwe4VS#h^$eTyPbBFF5Ih{?>^n-ccSlb$nCI7+p) zS4REe95(;iC0fiYC-|+=JKFf3tz^P!g^jC#4)uH_Kz76VAdm>IL3%pOr zFfVXeFY2AEp7g6}>D21=PwamuL|^91eSbMCy0k{Qd-t|qbFU_Et4T_fem?Ej<52d*<8PWhntdhb^g%c<&z1lkNh?tk2Hv`@Ql)z1wEJ8eyJuR9;=c=XVLlT~^1 zwu?Nh%<1+w12!lv{w3Cy+4Cq$;@Lxcvl)TT5-`miP^Pce8sl^SXGgaULsDnr8m}b_y7o`oX!>66 tR%`GJ9Tq+wMpWxQiO-{b*?Yp6H|tVhgB+7^l8%c^ejGvaFf^UTB6e#Qt2TU*<+v-9{c!ph2uuRj(O5VW|s7=#Z~D8TdQi}-wj^v#>kpFey12Am*7FcEGj zgqufVQmRBE;Z#-2WU`3J)9GaD)3I@56?0ej4tl9!!8m|pV1?HeMvM?bpb=;QHMD~n z-LxzP0R7Ss947iZ`SR=r@gN2|yea`O5$1YT6$hYD<3Om?#u0CR*Ap6E*HKz6gBq{9 zmJc=VO2nqn`Pk6KS z*U4l(EYg1uO(va55(`r~?3p(vlW*fjpgFK5k;!B@$UH-UYH(jnG5qB$;YX(x9X2_95VYIXYT3? zD8!ZvhH^7x6Xv{Ob1UL+_w#TPZLoofgH@4Pn$zHoMO7)x!~qg_n4gt7)ZK-SGaJ&~ z{|qrn#xJ8C35+usSe(2o&1k#v5BR2)l+t!%668tKI}>6U?jl(S&GW!eCFxMl-m1AU zi0Ob?(c`&Okp6E=u~U&3mV5I+mNfAJ_P9DFQJI5cwx6i{clY=Pundeb>E*xR zuDg2wfAD{4i?+8+t;}P4x_iYmTJz!CiFBX)4(*Ndtf@-uM%0CZmkxJ^&|s8qKf^*q zH1hFZ7KMph8tx38XB}5VMN=zC(-O8k%kwf5+uXL!cIJ+>RNi^K@O)tc5dblr;^I6b zSl!Rlb`2S2q%LWo-zyW@IWFa4n0}0Vd^_sw+eaBrh4fn1j|JbiN}#8l9!9#c9fIfd z<0Y%TbHgH})!oyHd+#Z*#q$Mhu*uS7av1Pd{^Zo7YuZoo(quG1qjcbNv zl%5ZF2LkcZ5EKga_;xDjI=8yL+OM9?l2^8iDW{I2vp5KZ=~(bSkCj|0_lr y3!ORvv99PFh{|Li{fwjIvs2>}A@A#Mx%@_HVa`wmcwEyB03m@VaXkUa<^Kc->=FO~ delta 699 zcmX@ZJDqKU1SbnK0|UeP$I^@w6@^_Hi-X*q7}lMWc?lGh2=EDU^~o&M&e@=uy+J2u zBai_^I=LY7oMccOPz`%YkY6yvdav}GE!q{+a~gp{{*x2g9v z(uo~cPMlpQSFt+m?1>(i7nyfY_S8qNzO(5S*9qU#$3y0XW<~3=zL@zoh3i;WhV;~~ zZwAkNF32qsTj)36CtNy^@ztpnmoHh{h3)#xZ~JPCz!#-xbNgT184DWOq%s!#H{PZB z>+Lp||Fu&muVI+x=OV}^yf!4RWWE)z#AZIz;3KI^bzYRPoUYzow?y7!Ue~mvioDye z*7K@b%NRvBo0lF&^L87W^Q)u;-S)r|!^Mf9X*xz4Mb%f47vo9luDGp`AV_)@rd zbANBwju%l6?)P=RtDMAUyX#^1q^~b#<~uv|*T4Irb0y>0#*UV}%HUd4tFLN7SzGGA zvqC)u_8AiKulYqpbjQp0xiv=9Wp`~fn^}B6mdCa#BU)$C!eIYk`68ag+}+`V{uZzL z15f3hDV~{Av`?_uoacBp%sD0(j`yk+?tHM2os(0u>R|9)ZO;9#-c?P!oxYzf>(sLh zll@XHi_=*)bxqm)=RsV_zMJpfpHC^(-E^*Ojk(Iywl`Js_bYCm44%g&I;;BXf8J8& WRTFp~rcMJU9|liXKbLh*2~7axPcx4I diff --git a/public/favicon/apple-touch-icon-60x60.png b/public/favicon/apple-touch-icon-60x60.png deleted file mode 100644 index e2de1ac49672bd7915495e578f4b3164bc481fb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 515 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKx3?xrnI^qbVSkfJRf%L|H?mvmFKt5w}kh>GZ zx^prwfgJS!pAc7{%tGy)4O%%HfFvIDMIkB#sD-B_$S;`Tt$sz%P3f8LF`PRy&##;d z6!)(Ri6{w5ELSKf%1_J8NmVGREJ#(zEGS84V5pe$_>_)@=d&ONW@T=@WNu+)VeiQz z%)$yT4JLw8OG`7Jk%R*^4xOxHdB_zLqSxfXc^a;XSbM>=KDEJ zn#Vj%jA`@Clmm0vR5GPiGWj~bv?MCVGK+CCZ@!syK!&|VM?K=O;|ezC4O>`R4yWYg z#8f2gB@AJ)~PaR(Zh4qPmH_JfJ7!*_Q;s-(qv2j+h~ zyPPLHKAMo?p&uL+6m(egY?zjYhK3d6bQ5l+RU15=jSdU`xpdrpsr%B-X~$;Hxbacl zbzAR(mYh~&X`NRuUSvo$-jwe)>2YJd5LC^yM8keXgW6eEF}qa YgZ8fZFK6yl0QsK5)78&qol`;+01EB7egFUf diff --git a/public/favicon/apple-touch-icon-76x76.png b/public/favicon/apple-touch-icon-76x76.png deleted file mode 100644 index 68ad9f25849cc6711627990fc902a494f29c36fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 561 zcmeAS@N?(olHy`uVBq!ia0vp^J|N7(3?xl=`bYpNmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBP0X`wFKADBuIUBUHHvmcPoQ+@-!bXtk9&8*y_1q;ve!&bc_>byHTw3fD z-+A%}dn-`bzbYi6Bq*_5p`a)~Ei)%op`@}PRUxyWB$Ux%HB{ zg_VW9CyOu(E4Vb698O_Y-W;NE`o@(LN6s9PIl_Lr!DE4!9)reIzQ} z!U0nYokHGh+-cD~#Ifi^MA4JU53F6zqsns;SI zT9aC9FRy{BqO7d!^^t<*iEHz;zfXIxXjk7GHVi z6+I57X)RoOYT^O`61peZH*Y%2GQ~0Sw&aG!s~_0hlv}1YhR&3B32JI=WX`$sjBU*+ f3!a0Mge4fxH1T97Z@zpM7>Ep>u6{1-oD!M!kPBJJCsD`~H$S;^-y;u6p7VV1Z zIgLOe|EiFPlAy$Lg@U5|w9K4Tg_6pGRE5lfl4J&kiaC!@>1cR93u0ha=GIH*7FHJa zo-D#Ftl-jMayW%qd2@)u=^Iy09657D<_P=g29E_^dJGy<`5tR2<;nw%<}C1tEM{P6 zxevmOQ%}ekGcYhodAc};WZZi@+t>e)gFsvKgsRYs1*#KUwAp#Xd%f1Hbj8e;c&c?{ zQ~iAbo(pp$%gQ2zd)`;)q|JL%p8ieQvt!ouw8fj|T73DpBe`^9$CVRj*U43^4m*3I z$K^%l-IG0$tM6=j#dX5>^zo26p;^(otS@H1P2oD0l_5Q~>zlzdp9^w}#1{I^_X(E{ zWPEjM#pO%Zc450d^V`1KBJf2i+T8vZcgBK7HmQsS|BZKP{(8I3<$vwe$!i#<`MC(P z39k)_E17S_E3ui+H26sBQk@qiET^k?*DaCvnAbJ!s3Pz7tGue#GDcAymcs1&@A_T4 zHS7NWno7MnM|Y_CJ)QdY%Hq;$U#24=rElh_ELQP2$0zhX=ER1mRnOPt7|qGLBy`h5 zM#|SnHLAj7bz{L!5k09{uJh{VvM-j^=DOg(%xeN7z7#Ir+~3=^<3-ei`+c47Dkrho z?t0ig>FbM``OXgg?|$f9$vC#Lqb090xYpF_t6EUjmiq6kP%nY~g+%;oei0Gf@$!9c zjnQ=3T^r427T=HMv8~F8)>*VL*gsglh$k_3cetRx#jF0nQ+a2KXXX^`6D&68Ii3x3 zjmd@My=sL!A1q|&cvqWq|EqUZ6K|*QXUjVEEW>2KRLkOYmQ7t#Hvf4LSF-Qs zyZ7f)N_97#D_di(GPUhZmHhpRnLqiJ#!!HIP{epp^)PRBERRRNp)eHs(@q#(K0&Rd2 zQ2{<7u0UEC_TNJVnh*w%RMF5;1F6)3s8rPe zX#}ErplTH@5a<8@|Anm8wm{=$N`m}?8Gb!nY5T9-X_Nim7f(LPe}4Ma;rV*&-{~K( z&D6eiZ|f|eI>sb#cNf{$%!Lzy9L@rd$YKTt_Cye7oO*c2HlQGTiKnkC`wLb9HdXzX zQ>)ehg~B~u977~7Cr@Z(c2i3et7l_llT0~qs!dJd@Too^aj=15PK*O%o(dzI+=P<} zV)`zY@-bcWOBgi-7`V8UKDIhs<63O(!{XcEEfVVBBXhG@Xj0H69v+6vzJj{j-~3q& zv_rMTHKHUXu_VKdAb7?@cZn_HQfYa19?85k(UZu781(UF^< zl9^VCTSwsQ4^2P~k{~OB^V3So6N^$A%FE03GV`*FlM@S4_413-XTP(N0{L~~TshuP pJRF5#8XBkkPoMF8I`M#x$SZNdl21;iQ-KN?JYD@<);T3K0RW^^o)7>4 delta 275 zcmey#@}FsfNhV`)kh>GZx^prw85kIh1AIbUeKHHRb2eZiEo_1iWz!itUjVfWlmz(& zGt@jY+;N6Cj%}IS*S>%piD!=^%YkzKllhqBSWoF_cs`qK$)r=SF_rJJmQt=fP>Qp_ zBeIx*q2)dZGfq7rV+<6G^K@|xk+{6}oG0G_1s-OH%`F1c9{u0HZ9!OQ^@FhcHeDjj z9P{iLypFX@4T@B^2$G8sKi*=PZQL1UWbo_Z;?fBrF()T(kzKL%Lz~Ky-_k|GFXwN! kT>94Fd{kb;#J4OW-&@$vZC}Wm1hk65)78&qol`;+0Gl#uWdHyG diff --git a/public/favicon/favicon-32x32.png b/public/favicon/favicon-32x32.png index f004f2956c5cb428fd836c7407b4c725f7234c47..0698a290166d9792cfd97014bc930966089a38b6 100644 GIT binary patch literal 844 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 L?uRkoKHuOE8nkgc diff --git a/public/favicon/mstile-144x144.png b/public/favicon/mstile-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..93ea9afb3814d6397a1545ff187ee23bbd7caff1 GIT binary patch literal 1821 zcmZ`)X;4#F6uwCyETTpTE|p``hp-~M~nrFW04&M*QX4TK^JO56|>rJ`s+5do`KL3&@}IMW}UIl1?od%p9X@0@uv$@cScn{3E1 z1OQBSm%8}FTS5HvDezS7Gu{a=ok)qd1c2kaCylMqg)uW!>hBG}CIo=g?Erj&PpN7E z)(Zg`2nImB4}cj7CFhqp0YDn^^OCtj02}2YC=Z^5VOoc;4H1OL!uU+y*DQpwps~0B ztRMgg55c%rm_SRy!iX%B$<*-hd0(seIF5f~gAM{)U_1;HK%a$jVF(Km^lL{J!m~no zmYP~fOMp?H1&4z`Bow2OieVTF;Ufr_jdF<>M4*Mi5T-Qmgf@a)GZc$u!^R-qdiHEb z*4Ms#7RuL-^KE1em39Q7RxqKE#UeOR%8~olLeRJ>Au+|3Yr`DqiP{%5LnJ`+|2X(n_n3>`j!K*OOyM=T!OUQBU+Ai=zkbg?ds%H zGLGeMJrLt1bDuhGf3I)PO+s8krE?jow@IU8*JN!0XCGn>Zx^URJM&tky|?elv(aB64}OwgWa!!yq3|g z4c`|P++Z&+TIzlv!t(i@Tt!9Vt|S9f*I5}YY-bMrTqZ54HEz7TC`Gco{8rh?_V&@& zLvw}gksVuYUcQbTDqV28dO@bulYTF$SJ9r5JaJ)L#QsSC(HGXzAT^on>d_vU-@lZc z(K-?qlGYqllDA7Y0_w;{P0bz- zck(iV3Z~kX4(}Xoz%M@3rS{rIF<0kMM~+e`iJPxmE7tF>EgK{KVPJDiub5W24iwYk zb&6?b#r62A9n@Z#NEIPcESo~@6+|gZ-X>?Yuluu!TaPpa-Np-|Jewu82E+DcgFl&- zJ(P6xJvp~_LjgTM*aAy`crt)meK5Ll=+Kca)MW4s!$oh*QYC4X$d>a+b55AMWU`f3 zhIoybRJodz#n4ffbMb3B%K4_srKC!CUG-Uz{~P(aaq6AhII6;LMk%L@{OlN&QeAZg zki`s`+;z4Q_lbhy)~e*}!?<}vK<H8%cIX?u9X z&|$ef-SAXESkasA*hitJG^5drhKlD|ay^Ec%uri0T6R;Yq#Kdc)ns44q_(4;By~}J1m>U;X{m`5}mLwY=f7UO5oG9|NdFljaJSiKXQf9>kE4PvsM_`t+rdIZeOiW9J7> zVT8xzsJf~z$-YCm`w|K|V*4Er43?@o1KoxTYmW6?o)EfbzcbmE9w9ka6Hfe9u;s3S z@~}1XaB*l-IK04o;e3%mXeY3-mkI5~whm&EBTpz43xx^UwxRzih>H)4j!60c0@A&l z9#{~tNfs#gU$cRkkQ5&g9UIP+rzC_kqZ8ziZDYx^5hMM??=kF#Z)=--pFf~jO_~=v z$;8UUa}S+j!gNU$HHJ~FPRf|Ao%dRr+L~rJ>9wXxl^*lJz>I0~5ofys*aEn_`nc3M H2dDoFbZ>u> literal 0 HcmV?d00001 diff --git a/public/favicon/mstile-150x150.png b/public/favicon/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..3c8c1da251c0d9c76934023a544b192b0dee3522 GIT binary patch literal 1879 zcmZ`&2~<*P6n)$q5?~=H<0lBx04QS! zg0@f~NVyh*Tn<8zIk)s;m>Uo}9U8>)0R&qd5ge@Usk2FcAy_;J*UfE6Nvz^`!m;0MMFSliP=*f(P2^6<;_-N3VDKc}2qcgK44n-?xWvB? z3Pk~<0VW995P=#AFtK5JSZ4x(`+=Zvm_vXOfMa!?>$X9%v7v(Y z;2waEEny-A)`h`1>dNVw2U)fxuo*D5gM$NjVzFdh6+4`+3b5h+!4mMG9N0EEfJW46 zwS}pz;M+oZeCD#{(C1IDUp~5bsb2JB>|zt;Mj&DgjbbH`;>{HLuGN+bb&K5m+n>qSHJu)jHy1;6` zUq;i#E8^=phuc@)+_51o$nq@A?|MHRuslnS3JpDJPclGIO;;)1jhRfqNb`(p-W;~Ro3 z4&Ueo!rxvQ+JNf4tca~2GNasZ&YajEuGpxX>ARY*zcDj6n?nvWZYpF4Fp{Kq-utkzvgN?sBHlpq**B@(cjXV;Z7e>*KnulIxOX+Y?RB zUO#?bCCds{aH~}Ey;}T`c~23dS}Q@U>AKM8qE1*&Up?@4bZaK^6t_~K{yB3=TF}Ge z(J92-`pDbOBKCVT^(H{clHT|9rVm7@xvS`wEw#lZk|)je#r=}7jrL|qm;7T}*+uc)bFxO<3(rP7mDM>nJe7R_$hes^2z ztMGi|ayN2Mo7inUCHDg1!C*<(mk>q8X>CTL(K+%SA65CFDgV6Yj;GO>V)4mNY61EO zdS2a|nYJ%P&kkyOL;Ko!*W`&gyaA%vKz-;Krkz*HI%*Nn7MT~IKGe+PpSay5s$4Ft zZa~(^68j|5Di7+KnpJ}*`o$LNcD_9QGoi+%-lG)x9Hmcx3GQw$BVIw4&K(i_%>gET zA|Q?_QITn-?={&u@0IDtMg;CT8d!R>7hJ_$4x0?vEQb5aCLf4VZ&$R|c~FaxjYx!& zs#mKVk?gAnqa;T=tuE8tqHH)dt{4ipw!DtGWcj*Ua|fjibW0sz##mmyTt2$6sDd}k5c zyW>$rUas<0HIKD&#}eThqe4z@L(e;ZccIJKmaubUSIg^shtCKu)FMM|IN3WcVo?^kP@P?9bRvb~ zLZNVXQ`!GWNa4gKC8Ymk6z>4BCW7AMv9w#AbV?2tV&W%SUarr=PTj{gm znbS8%;PH}>o?eE63F)B?9oUAZXw$&L@AOPj-Wjy6I6d?^7OLlgtovH;HRLt@o(%u; Z00&5EZo(g4>Lh|^WcV!eKDBgh<{!r$!@d9j literal 0 HcmV?d00001 diff --git a/public/favicon/mstile-310x150.png b/public/favicon/mstile-310x150.png new file mode 100644 index 0000000000000000000000000000000000000000..c976a5de595e803cef49b2c17515e9b7fb83c77d GIT binary patch literal 2063 zcmaJ>3se(V8Xm>h60~-eqQYXV$2$}~_#yA8eF(GIo9DoQk^dtw z6>Qm(X*6pF<5!SMCsF7W3I$(M=`c(O3}gzO4BL{)C?Fw|@o*Ua)t^oWi0%JkZH>;z zHWrISLTz9?FNuT@i9|dL1$U#-Xt*;K0i65x?F0M(2ec%>LjlbA09$Wj-_TO2RA7*) zh_M6&gaE^60}xN~`#~f!L21AfZ0(=}HUxOWR0LFnGXn$0s~{V3JRIkFgW!4~C>Zyl z;RwKCqjF<6kR3Z%Kpw6E@YvAaY=L%>$@a!{M)4rZ1_7M`Rih{h-Y{%u%wkJ1W&t*? zA2fjq(t&P+0o>@z%gecmH^JFL=VW}|erR!F^7)V2_DlI6N9=xg;@eNz>tFZmTJi6b zR+Xgr9lxAfW4|Zx_a2V@WnF3Tv#mGzL#v_=wvi=ONhwAB!+QA9zLK(?-*jEe z`{_mItJxXD#^}ReSm*d;G&X(Led}~_OIYvmBLOBduRHN|kNbk&X_eZ!eKoz!+~sJ( zeVW;M0%rMroa2MLs^$v8p1-ci;RFI@D?Z@*cxKP6JT(UvYh}LvUTeo!Z(L);TFisT zz=ak0db$fzAN)K#hXo{Abx*moKJ#d_KMQj_&zMR?!EBDYCV!W@Qd6mE8*X=c8CffG zD}UXZD0-FFH#TL_BISC%gPG zZ0XsAIX&c1t~DEb!or*`-TPO|Y?FcAk?F!)%yCM0IoO)=Sg4Glq zZgz9cSI^{gwXuamh1SZ8^U7*T%~8%3v1dd2tn_6~ufFwcReu=Ttoy+b?yXKldy5(R zuCo{JZTC(*`Z8p~{)ZHXe?!tiIjerAoXgTJTX!EIV$oec>jxVLUdLcg54D#hv>a{& z$@R-*2gUG5G4l88qok5#`PyhCODdVxwfKn%ompji$6{<`o~(a zNbYid^5JN8(d+FOQ-!XD)&av!)r8N}rsAyqkdqf3E!qcrIy*bEH$Qn)?Tn^1zA!P= z7%I%Zj}$9h%Gz?>Q!5dSqD^ry%k@&Y<-LR3g-Pz|D>-Jmid<7W~w&prekp+ zJP5Va#5kCV6;>R8=jo)o)8UT50%f9}we|Eh;kl~*s)PNbqZ;*}?W&%t>*Krv&Mc?d zr|zirJ-xpPD^;=lb4^gQ%Xp)yU+J+miC9udLlEi=@A zQYv3Qr3o$WsMXx#Oa89@oR;P0@{78=>#AdKksU1R`7Pt0S71WEWW3;@=0{s>I?!6ci&weO(jGHM}KF=~l zhdtYiE$VMK-b+CVZN7HVt6ZN-M+jJC{iv{Q5pBiJ8;X@}|IsFH_0LxLUFKwq1+6-V z^r=q`2fS}wC=cDRc+;&lZ-Zf4=5%tZ*1&VNUk<>AxIXH8LR z(s9*;@{>cQBR;h!N}mtJw~OY-I?L&H3p20wj%5777ygzHAG+1i&Z7=Fer4EF4qR+x zUZJw62$|S9QYr=$~{&6yPR3?JMXloGnvjzX0|H5_%{J@@llfKV{Z>w zI^Tu=hC}3nP#HfWg_t0XkCw!WiLzq}VxlBL770PAC1cZO>pnU_rQQips(f{P$b>{d zBMF;Go4C1~O*RodGaNgjOh^p^qVoPgPp7KWs&lO}gMER6LK7D6%BDSb=Hqqxdht9j IdxU5H7e@0Ya{vGU literal 0 HcmV?d00001 diff --git a/public/favicon/mstile-310x310.png b/public/favicon/mstile-310x310.png new file mode 100644 index 0000000000000000000000000000000000000000..33f041454c5fb91c6a487d02d689bb3e2de5b760 GIT binary patch literal 3521 zcmbtXdpuNWAD`BiN-gDkWO}x3rmKTGlW!!J?bH={=?jO7FKRcf@=RD{8e1G5H@Ap0DJZC0x&n~;w zE7z|?p-`*scQBk#sBa+TyIcVvg;zO4;PCAc8%G-ys_3H9tj|(#jy|-*$q|L(;!&u$ zpHQf20L4jBsBkI@HE;lhGS5JvG=sBC_gVs>(|a6Tn1FyIknjW&*#B|+4Iz>Nh()Fh za0D_QPr?z&7$TWKfV8#EaKzt3$T)of5`I&_BTOQZf);Rt43UEDF=Qko_<&h?3OwErw6=BYR;+;m=nIP{=_3mAmgOQK3Y3aO z;pGJr$e2{8(6|8tTE=1FKY8c#$-fMbY_pk*KqlFCDLC=@iBN+6K2STexz zMBs+pL(mtFjL_uOg7Km_4kvE}5B7)-;DeeMQ-k(FB0YV5po{^9;mKe_>iO*&A!dRp zBrlP?kxbSDrU4No1wzx)qb>R%_X;?JREx)xF&GFD0W>@rf*{a4xOM4T*9=d%2)BaWv zTgcOCYQFffz|wX7JLc}KY|!nIO*z_I|4QrqzUjN-vjZEReM@>1qLpJ(HS@~iPRutM z%dU0?J$)oBsh;@P+U0SEgm>-_?iMz#QGqZ|B3Bn3*(o;b(*OFIYLyx4%n1uWZo|bL z#Kxb$bSm0MJ%hy?NE+Qzviah>Z&o$_f+!V^HZBgi{9owbjp6kx9rQd|2S~& zWbwy{?l#+ngoGY!;y`*mU01j^&kgAVk zr#~qUOEpE4877i|&rDg-sGG$?OZSC~UMyw4^7V%MRlD{$_(|;Q{a+>$3X;8!w(||M z+o!8j1+Hz6R!b)8hOat%uN5^NXX=(Dq!^}n1?0CymCkng<=Gh)J4zxbzR$#b*LJ>b zF4U00og(ph?Kx6Gx^Yo;`#^15bgAXwTN;0&J)@YTWt!W+B-OcFxTDu(YX6qrZ~HV z`98VxfALGn|b=WC+**dKviXYo_B7H_rP~m9VC8<_w^hQ z>;J{YvoDk-8_#bHhg4meg_WkBeMZ`sUUrt!huL*ig(7|Mq>obv@(KNaBEM zB*%=x)k!MFu%X=ZIp_G+X>`rpynyx#<-!gvD`n%HaN*zEz7by9 z3SloPt@xASWI5at`{ybCfTo7}EL8thDRN$LS4D`$h*GNAP(mk~`5|{=|JX~!(NpC@ za2}A>UzWg zY#J#SI@kih8(a`81lS(Q`4#i3INF2_d4q&kf;zJ4JUhN3|5ia{fL4W$l?u)?$Bb7c zP~_i8jqt61X;O!m0s(gMPKf#2ck-%D4@x7HM?%3R}%kJ??d__!IxVXVU zRZJyujg6u{-?}}h^wMb65$0}J-WQ!H>P+WEp0bF$y=dPu_W8AGmdw>LD$#MJj9gNi zvH(0cQqIySOYTBiVukBNl3>C+QyR5&W-oZoRHF;s0%EmA3pET~^80b=STlb5K+!Dk z2}7c&^z@?y0C%J%4$8-^?Rf^%2XEG&?~DoO8*20uN*L@)a|t0?#*mE+HjW1HL=th~ z?$^T4UYerW>9B0^ZUI;?VmO&mCuPH=CN|W`Y}i^NJT|poHW1Jh2yMC8c`}V#*Ar3* z`|_LNm^GqF^A!FUjqWQ_k?XyNJn`*_#U*P*EPdL1PYlO|Gh}T6V7>EcM6=DKkKU!lnv$}&XOX7lNTPo{23S!Ex<=Ng z5=nlLjiGRM_%5>0r@}!o23$#?6vG?TP447iO5gNMRE*}@D+;ye&Pj14f;l+dQbp7q z53i4|dv1Dv_K+;e@-4q7X7zQX0AE( zPlvx&ph61@%^#%qH3;f3VBx};ZefRg!dT{qLRsK|GNKw8Q>Z4CO{OkXQ*#>K+=NP^ zQq8GU{j%fW&(I$N0@;WCd?Wulz^%9b3J7rJy10co`9z?DL)pH5$5`mF$Y2)QFF5QF z3Uwm8dt}w}kbOjA&2Dk6eUB4L0iy&RQc}gJ?o3rvP(?H1jH?bSU>>`m#Vt*5UevzO hexWFi+i~Lu2sNO&CTwJzNgC3sJ#!c1!L|dZ{{z1SnjioG literal 0 HcmV?d00001 diff --git a/public/favicon/mstile-70x70.png b/public/favicon/mstile-70x70.png new file mode 100644 index 0000000000000000000000000000000000000000..5d561d6a999947910098f5cd7bfe1f693271d9bb GIT binary patch literal 1442 zcmZ`%X;2eq82)loAO$3Cs8Acp?k4PpxIlu47hupt3Wb2E6^xNXGol0=3n;>h3>52l zA6PGDR2Z#QJLphFN{VT92vS6*0*(+56i>>fL=gII(m(ytnceq$kLP{f=lyoez}Zl-7ZfhB_R zx|Oc4^4y+hvs-7pJI=Y{{wuGVS@t37$&?@PpNL&?d+uDl$(UcSF3kFF@BIR6mrvhE zZ|$QIs)WnK+}Nf+{hBp@?EiG=B&)Xke0oYx__>m{n@e3x!pm#YHHshTdeM5 zlc2Vt^XP$?Y1TGH>|I6dn8df)jlEsiBtNt?sZ@T1wWFd4uRC|GDtU@g8>SV0!U_9b ze$UDT7ZfQ6IY1Gb&k_vbqeTPUPJWnD=ly_6v~KF;17u$#P+!^6&8+rqqfAFh&^5b+ z(Hg*a=@D?vfd*>p3LlW#M)~x9AaA=+vm1S>oeGQH^pWB(uG}!PBxD2d34o6D-+wX<@Q?i^0s(n{T3ev!p4eJg3kW!ZD9F=u3l7=CFd= zm_7`hddR*ZvN&%~*}93YrCkMb^ZS{P3aVCkc2~AMW1N0@YiKzb=pVNGQE&H@+1;sI z*ALrK-uUQ|5k-TgdhMfcEaI#=z8%f$^FP-$^3P}YzuNqT&fna)azoE>!B}ML<&KB? z&R2H^F7_ykq`G>?2fo{~xQL-ads>!PKA(U;6l#iIW=hwaGQ!g~X21gklfjBWQW+Q& znnZ?%hs+FDgb^eePLh93gx&j3!}{!WLuUT}H&maZ*1?9Qo0FEAwEA3;abtF-AuB^< z$~R_+3`SEL0C~qA54yYLBuk}DUs;NN0&_l0?>y l_FI-_i=TyOrPP&+<=}~^ - + + diff --git a/ui/snippets/footer/Footer.tsx b/ui/snippets/footer/Footer.tsx index 52bb5cc57b..70cac70615 100644 --- a/ui/snippets/footer/Footer.tsx +++ b/ui/snippets/footer/Footer.tsx @@ -1,5 +1,5 @@ import type { GridProps } from '@chakra-ui/react'; -import { Box, Grid, Flex, Text, Link, VStack, Skeleton } from '@chakra-ui/react'; +import { Box, Grid, Flex, VStack, Skeleton } from '@chakra-ui/react'; import { useQuery } from '@tanstack/react-query'; import React from 'react'; @@ -7,85 +7,79 @@ import type { CustomLinksGroup } from 'types/footerLinks'; import config from 'configs/app'; import type { ResourceError } from 'lib/api/resources'; -import useApiQuery from 'lib/api/useApiQuery'; import useFetch from 'lib/hooks/useFetch'; -import useIssueUrl from 'lib/hooks/useIssueUrl'; import NetworkAddToWallet from 'ui/shared/NetworkAddToWallet'; import FooterLinkItem from './FooterLinkItem'; import IntTxsIndexingStatus from './IntTxsIndexingStatus'; -import getApiVersionUrl from './utils/getApiVersionUrl'; const MAX_LINKS_COLUMNS = 4; -const FRONT_VERSION_URL = `https://github.com/blockscout/frontend/tree/${ config.UI.footer.frontendVersion }`; -const FRONT_COMMIT_URL = `https://github.com/blockscout/frontend/commit/${ config.UI.footer.frontendCommit }`; - const Footer = () => { - const { data: backendVersionData } = useApiQuery('config_backend_version', { - queryOptions: { - staleTime: Infinity, - }, - }); - const apiVersionUrl = getApiVersionUrl(backendVersionData?.backend_version); - const issueUrl = useIssueUrl(backendVersionData?.backend_version); - const BLOCKSCOUT_LINKS = [ - { - icon: 'edit' as const, - iconSize: '16px', - text: 'Submit an issue', - url: issueUrl, - }, - { - icon: 'social/canny' as const, - iconSize: '20px', - text: 'Feature request', - url: 'https://blockscout.canny.io/feature-requests', - }, - { - icon: 'social/git' as const, - iconSize: '18px', - text: 'Contribute', - url: 'https://github.com/blockscout/blockscout', - }, - { - icon: 'social/twitter' as const, - iconSize: '18px', - text: 'X (ex-Twitter)', - url: 'https://www.twitter.com/blockscoutcom', - }, - { - icon: 'social/discord' as const, - iconSize: '24px', - text: 'Discord', - url: 'https://discord.gg/blockscout', - }, - { - icon: 'discussions' as const, - iconSize: '20px', - text: 'Discussions', - url: 'https://github.com/orgs/blockscout/discussions', - }, - { - icon: 'donate' as const, - iconSize: '20px', - text: 'Donate', - url: 'https://github.com/sponsors/blockscout', - }, - ]; - - const frontendLink = (() => { - if (config.UI.footer.frontendVersion) { - return { config.UI.footer.frontendVersion }; - } - - if (config.UI.footer.frontendCommit) { - return { config.UI.footer.frontendCommit }; - } - - return null; - })(); + // const { data: backendVersionData } = useApiQuery('config_backend_version', { + // queryOptions: { + // staleTime: Infinity, + // }, + // }); + // const apiVersionUrl = getApiVersionUrl(backendVersionData?.backend_version); + // const issueUrl = useIssueUrl(backendVersionData?.backend_version); + // const BLOCKSCOUT_LINKS = [ + // { + // icon: 'edit' as const, + // iconSize: '16px', + // text: 'Submit an issue', + // url: issueUrl, + // }, + // { + // icon: 'social/canny' as const, + // iconSize: '20px', + // text: 'Feature request', + // url: 'https://blockscout.canny.io/feature-requests', + // }, + // { + // icon: 'social/git' as const, + // iconSize: '18px', + // text: 'Contribute', + // url: 'https://github.com/blockscout/blockscout', + // }, + // { + // icon: 'social/twitter' as const, + // iconSize: '18px', + // text: 'X (ex-Twitter)', + // url: 'https://www.twitter.com/blockscoutcom', + // }, + // { + // icon: 'social/discord' as const, + // iconSize: '24px', + // text: 'Discord', + // url: 'https://discord.gg/blockscout', + // }, + // { + // icon: 'discussions' as const, + // iconSize: '20px', + // text: 'Discussions', + // url: 'https://github.com/orgs/blockscout/discussions', + // }, + // { + // icon: 'donate' as const, + // iconSize: '20px', + // text: 'Donate', + // url: 'https://github.com/sponsors/blockscout', + // }, + // ]; + + // const frontendLink = (() => { + // if (config.UI.footer.frontendVersion) { + // return { config.UI.footer.frontendVersion }; + // } + + // if (config.UI.footer.frontendCommit) { + // return { config.UI.footer.frontendCommit }; + // } + + // return null; + // })(); const fetch = useFetch(); @@ -115,28 +109,28 @@ const Footer = () => { ); }, []); - const renderProjectInfo = React.useCallback((gridArea?: GridProps['gridArea']) => { - return ( - - blockscout.com - - Blockscout is a tool for inspecting and analyzing EVM based blockchains. Blockchain explorer for Ethereum Networks. - - - { apiVersionUrl && ( - - Backend: { backendVersionData?.backend_version } - - ) } - { frontendLink && ( - - Frontend: { frontendLink } - - ) } - - - ); - }, [ apiVersionUrl, backendVersionData?.backend_version, frontendLink ]); + // const renderProjectInfo = React.useCallback((gridArea?: GridProps['gridArea']) => { + // return ( + // + // blockscout.com + // + // Blockscout is a tool for inspecting and analyzing EVM based blockchains. Blockchain explorer for Ethereum Networks. + // + // + // { apiVersionUrl && ( + // + // Backend: { backendVersionData?.backend_version } + // + // ) } + // { frontendLink && ( + // + // Frontend: { frontendLink } + // + // ) } + // + // + // ); + // }, [ apiVersionUrl, backendVersionData?.backend_version, frontendLink ]); const containerProps: GridProps = { as: 'footer', @@ -153,7 +147,6 @@ const Footer = () => {
{ renderNetworkInfo() } - { renderProjectInfo() }
{ > { ([ - { title: 'Blockscout', links: BLOCKSCOUT_LINKS }, + // { title: 'Blockscout', links: BLOCKSCOUT_LINKS }, ...(linksData || []), ]) .slice(0, colNum) @@ -198,7 +191,6 @@ const Footer = () => { > { renderNetworkInfo({ lg: 'network' }) } - { renderProjectInfo({ lg: 'info' }) } { justifyContent={{ lg: 'flex-end' }} mt={{ base: 8, lg: 0 }} > - { BLOCKSCOUT_LINKS.map(link => ) } + { /* { BLOCKSCOUT_LINKS.map(link => ) } */ } ); diff --git a/yarn.lock b/yarn.lock index 51a8c89030..cd4e8e7a58 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6350,6 +6350,13 @@ resolved "https://registry.yarnpkg.com/@types/phoenix/-/phoenix-1.5.4.tgz#c08a1da6d7b4e365f6a1fe1ff9aada55f5356d24" integrity sha512-L5eZmzw89eXBKkiqVBcJfU1QGx9y+wurRIEgt0cuLH0hwNtVUxtx+6cu0R2STwWj468sjXyBYPYDtGclUd1kjQ== +"@types/pino@^7.0.5": + version "7.0.5" + resolved "https://registry.yarnpkg.com/@types/pino/-/pino-7.0.5.tgz#1c84a81b924a6a9e263dbb581dffdbad7a3c60c4" + integrity sha512-wKoab31pknvILkxAF8ss+v9iNyhw5Iu/0jLtRkUD74cNfOOLJNnqfFKAv0r7wVaTQxRZtWrMpGfShwwBjOcgcg== + dependencies: + pino "*" + "@types/prettier@^2.1.5": version "2.7.1" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" @@ -13322,6 +13329,14 @@ pino-abstract-transport@^1.0.0, pino-abstract-transport@v1.0.0: readable-stream "^4.0.0" split2 "^4.0.0" +pino-abstract-transport@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz#97f9f2631931e242da531b5c66d3079c12c9d1b5" + integrity sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q== + dependencies: + readable-stream "^4.0.0" + split2 "^4.0.0" + pino-abstract-transport@v0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz#4b54348d8f73713bfd14e3dc44228739aa13d9c0" @@ -13371,6 +13386,28 @@ pino-std-serializers@^6.0.0: resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-6.0.0.tgz#4c20928a1bafca122fdc2a7a4a171ca1c5f9c526" integrity sha512-mMMOwSKrmyl+Y12Ri2xhH1lbzQxwwpuru9VjyJpgFIH4asSj88F2csdMwN6+M5g1Ll4rmsYghHLQJw81tgZ7LQ== +pino-std-serializers@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz#7c625038b13718dbbd84ab446bd673dc52259e3b" + integrity sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA== + +pino@*: + version "9.1.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-9.1.0.tgz#f734617ad096568cc905e6a227266dbd6100c3fb" + integrity sha512-qUcgfrlyOtjwhNLdbhoL7NR4NkHjzykAPw0V2QLFbvu/zss29h4NkRnibyFzBrNCbzCOY3WZ9hhKSwfOkNggYA== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.1.1" + on-exit-leak-free "^2.1.0" + pino-abstract-transport "^1.2.0" + pino-std-serializers "^7.0.0" + process-warning "^3.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.2.0" + safe-stable-stringify "^2.3.1" + sonic-boom "^4.0.1" + thread-stream "^3.0.0" + pino@7.11.0: version "7.11.0" resolved "https://registry.yarnpkg.com/pino/-/pino-7.11.0.tgz#0f0ea5c4683dc91388081d44bff10c83125066f6" @@ -13676,6 +13713,11 @@ process-warning@^2.0.0: resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-2.0.0.tgz#341dbeaac985b90a04ebcd844d50097c7737b2ee" integrity sha512-+MmoAXoUX+VTHAlwns0h+kFUWFs/3FZy+ZuchkgjyOu3oioLAo2LB5aCfKPh2+P9O18i3m43tUEv3YqttSy0Ww== +process-warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-3.0.0.tgz#96e5b88884187a1dce6f5c3166d611132058710b" + integrity sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ== + process@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/process/-/process-0.10.1.tgz#842457cc51cfed72dc775afeeafb8c6034372725" @@ -14883,6 +14925,13 @@ sonic-boom@^3.0.0, sonic-boom@^3.1.0: dependencies: atomic-sleep "^1.0.0" +sonic-boom@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-4.0.1.tgz#515b7cef2c9290cb362c4536388ddeece07aed30" + integrity sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ== + dependencies: + atomic-sleep "^1.0.0" + source-map-js@^1.0.1, source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" @@ -15464,6 +15513,13 @@ thread-stream@^2.0.0: dependencies: real-require "^0.2.0" +thread-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-3.0.0.tgz#3548327972fe1f5d3c78049d35aeacdce8c21771" + integrity sha512-oUIFjxaUT6knhPtWgDMc29zF1FcSl0yXpapkyrQrCGEfYA2HUZXCilUtKyYIv6HkCyqSPAMkY+EG0GbyIrNDQg== + dependencies: + real-require "^0.2.0" + thriftrw@^3.5.0: version "3.11.4" resolved "https://registry.yarnpkg.com/thriftrw/-/thriftrw-3.11.4.tgz#84c990ee89e926631c0b475909ada44ee9249870" From a9f6524b291ea93d38cc341372a35d7eeec26f53 Mon Sep 17 00:00:00 2001 From: Lucao Adam Date: Fri, 17 May 2024 11:02:30 +0545 Subject: [PATCH 2/2] removed .github --- .github/ISSUE_TEMPLATE/bug_report.yml | 78 ----- .github/ISSUE_TEMPLATE/config.yml | 11 - .github/release.yml | 21 -- .github/workflows/checks.yml | 228 -------------- .github/workflows/cleanup.yml | 33 -- .github/workflows/copy-issues-labels.yml | 106 ------- .github/workflows/deploy-main.yml | 51 ---- .github/workflows/deploy-review-l2.yml | 38 --- .github/workflows/deploy-review.yml | 59 ---- .github/workflows/e2e-tests.yml | 50 ---- .github/workflows/label-issues-in-release.yml | 282 ------------------ .github/workflows/pre-release.yml | 64 ---- .github/workflows/project-management.yml | 99 ------ .github/workflows/publish-image.yml | 84 ------ .github/workflows/release.yml | 91 ------ .github/workflows/stale-issues.yml | 29 -- .github/workflows/update-project-cards.yml | 240 --------------- .github/workflows/upload-source-maps.yml | 48 --- 18 files changed, 1612 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml delete mode 100644 .github/ISSUE_TEMPLATE/config.yml delete mode 100644 .github/release.yml delete mode 100644 .github/workflows/checks.yml delete mode 100644 .github/workflows/cleanup.yml delete mode 100644 .github/workflows/copy-issues-labels.yml delete mode 100644 .github/workflows/deploy-main.yml delete mode 100644 .github/workflows/deploy-review-l2.yml delete mode 100644 .github/workflows/deploy-review.yml delete mode 100644 .github/workflows/e2e-tests.yml delete mode 100644 .github/workflows/label-issues-in-release.yml delete mode 100644 .github/workflows/pre-release.yml delete mode 100644 .github/workflows/project-management.yml delete mode 100644 .github/workflows/publish-image.yml delete mode 100644 .github/workflows/release.yml delete mode 100644 .github/workflows/stale-issues.yml delete mode 100644 .github/workflows/update-project-cards.yml delete mode 100644 .github/workflows/upload-source-maps.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml deleted file mode 100644 index 732e01d370..0000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ /dev/null @@ -1,78 +0,0 @@ -name: Bug Report -description: File a bug report -labels: [ "bug", "triage" ] -body: - - type: markdown - attributes: - value: | - Thanks for reporting a bug 🐛! - - Please search open/closed issues before submitting. Someone might have had the similar problem before 😉! - - - type: textarea - id: description - attributes: - label: Description - description: A brief description of the issue. - placeholder: | - When I ____, I expected ____ to happen but ____ happened instead. - validations: - required: true - - - type: input - id: link - attributes: - label: Link to the page - description: The link to the page where the issue occurs. - placeholder: https://eth.blockscout.com - validations: - required: true - - - type: textarea - id: steps - attributes: - label: Steps to reproduce - description: | - Explain how to reproduce the issue in the development environment. - value: | - 1. Go to '...' - 2. Click on '...' - 3. Scroll down to '...' - 4. See error - - - type: input - id: version - attributes: - label: App version - description: The version of the front-end app you use. You can find it in the footer of the page. - placeholder: v1.2.0 - validations: - required: true - - - type: input - id: browser - # validations: - # required: true - attributes: - label: Browser - description: What browsers are you seeing the problem on? Please specify browser vendor and its version. - placeholder: Google Chrome 111 - - - type: dropdown - id: operating-system - # validations: - # required: true - attributes: - label: Operating system - description: The operating system this issue occurred with. - options: - - macOS - - Windows - - Linux - - - type: textarea - id: additional-information - attributes: - label: Additional information - description: | - Use this section to provide any additional information you might have (e.g screenshots or screencasts). \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index 439bca677d..0000000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,11 +0,0 @@ -blank_issues_enabled: false -contact_links: - - name: Feature Request - url: https://blockscout.canny.io/feature-requests - about: Request a feature or enhancement - - name: Ask a question - url: https://github.com/orgs/blockscout/discussions - about: Ask questions and discuss topics with other community members - - name: Join our Discord Server - url: https://discord.gg/blockscout - about: The official Blockscout Discord community \ No newline at end of file diff --git a/.github/release.yml b/.github/release.yml deleted file mode 100644 index c9de8448b3..0000000000 --- a/.github/release.yml +++ /dev/null @@ -1,21 +0,0 @@ -changelog: - categories: - - title: 🚀 New Features - labels: - - client feature - - feature - - title: 🐛 Bug Fixes - labels: - - bug - - title: ⚡ Performance Improvements - labels: - - performance - - title: 📦 Dependencies Updates - labels: - - dependencies - - title: 🚨 Changes in ENV variables - labels: - - ENVs - - title: ✨ Other Changes - labels: - - "*" \ No newline at end of file diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml deleted file mode 100644 index 9496bb37e6..0000000000 --- a/.github/workflows/checks.yml +++ /dev/null @@ -1,228 +0,0 @@ -name: Checks -on: - workflow_call: - workflow_dispatch: - pull_request: - types: [ opened, synchronize, unlabeled ] - paths-ignore: - - '.github/ISSUE_TEMPLATE/**' - - '.husky/**' - - '.vscode/**' - - 'deploy/**' - - 'docs/**' - - 'public/**' - - 'stub/**' - - 'tools/**' - -# concurrency: -# group: ${{ github.workflow }}__${{ github.job }}__${{ github.ref }} -# cancel-in-progress: true - -jobs: - code_quality: - name: Code quality - runs-on: ubuntu-latest - if: ${{ !contains(github.event.pull_request.labels.*.name, 'skip checks') && !(github.event.action == 'unlabeled' && github.event.label.name != 'skip checks') }} - steps: - - name: Checkout repo - uses: actions/checkout@v4 - - - name: Setup node - uses: actions/setup-node@v4 - with: - node-version: 20.11.0 - cache: 'yarn' - - - name: Cache node_modules - uses: actions/cache@v4 - id: cache-node-modules - with: - path: | - node_modules - key: node_modules-${{ runner.os }}-${{ hashFiles('yarn.lock') }} - - - name: Install dependencies - if: steps.cache-node-modules.outputs.cache-hit != 'true' - run: yarn --frozen-lockfile --ignore-optional - - - name: Run ESLint - run: yarn lint:eslint - - - name: Compile TypeScript - run: yarn lint:tsc - - envs_validation: - name: ENV variables validation - runs-on: ubuntu-latest - needs: [ code_quality ] - steps: - - name: Checkout repo - uses: actions/checkout@v4 - - - name: Setup node - uses: actions/setup-node@v4 - with: - node-version: 20.11.0 - cache: 'yarn' - - - name: Cache node_modules - uses: actions/cache@v4 - id: cache-node-modules - with: - path: | - node_modules - key: node_modules-${{ runner.os }}-${{ hashFiles('yarn.lock') }} - - - name: Install dependencies - if: steps.cache-node-modules.outputs.cache-hit != 'true' - run: yarn --frozen-lockfile --ignore-optional - - - name: Install script dependencies - run: cd ./deploy/tools/envs-validator && yarn --frozen-lockfile --ignore-optional - - - name: Run validation tests - run: | - set +e - cd ./deploy/tools/envs-validator && yarn test - exitcode="$?" - echo "exitcode=$exitcode" >> $GITHUB_OUTPUT - exit "$exitcode" - - jest_tests: - name: Jest tests - needs: [ code_quality, envs_validation ] - runs-on: ubuntu-latest - steps: - - name: Checkout repo - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup node - uses: actions/setup-node@v4 - with: - node-version: 20.11.0 - cache: 'yarn' - - - name: Cache node_modules - uses: actions/cache@v4 - id: cache-node-modules - with: - path: | - node_modules - key: node_modules-${{ runner.os }}-${{ hashFiles('yarn.lock') }} - - - name: Install dependencies - if: steps.cache-node-modules.outputs.cache-hit != 'true' - run: yarn --frozen-lockfile --ignore-optional - - - name: Run Jest - run: yarn test:jest ${{ github.event_name == 'pull_request' && '--changedSince=origin/main' || '' }} --passWithNoTests - - pw_affected_tests: - name: Resolve affected Playwright tests - runs-on: ubuntu-latest - needs: [ code_quality, envs_validation ] - if: github.event_name == 'pull_request' - steps: - - name: Checkout repo - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup node - uses: actions/setup-node@v4 - with: - node-version: 20.11.0 - cache: 'yarn' - - - name: Cache node_modules - uses: actions/cache@v4 - id: cache-node-modules - with: - path: | - node_modules - key: node_modules-${{ runner.os }}-${{ hashFiles('yarn.lock') }} - - - name: Install dependencies - if: steps.cache-node-modules.outputs.cache-hit != 'true' - run: yarn --frozen-lockfile --ignore-optional - - - name: Install script dependencies - run: cd ./deploy/tools/affected-tests && yarn --frozen-lockfile - - - name: Run script - run: yarn test:pw:detect-affected - - - name: Upload result file - uses: actions/upload-artifact@v4 - with: - name: playwright-affected-tests - path: ./playwright/affected-tests.txt - retention-days: 3 - - pw_tests: - name: 'Playwright tests / Project: ${{ matrix.project }}' - needs: [ code_quality, envs_validation, pw_affected_tests ] - if: | - always() && - needs.code_quality.result == 'success' && - needs.envs_validation.result == 'success' && - (needs.pw_affected_tests.result == 'success' || needs.pw_affected_tests.result == 'skipped') - runs-on: ubuntu-latest - container: - image: mcr.microsoft.com/playwright:v1.41.1-focal - - strategy: - fail-fast: false - matrix: - project: [ default, mobile, dark-color-mode ] - - steps: - - name: Install git-lfs - run: apt-get update && apt-get install git-lfs - - - name: Checkout repo - uses: actions/checkout@v4 - with: - lfs: 'true' - - - name: Setup node - uses: actions/setup-node@v4 - with: - node-version: 20.11.0 - cache: 'yarn' - - - name: Cache node_modules - uses: actions/cache@v4 - id: cache-node-modules - with: - path: | - node_modules - key: node_modules-${{ runner.os }}-${{ hashFiles('yarn.lock') }} - - - name: Install dependencies - if: steps.cache-node-modules.outputs.cache-hit != 'true' - run: yarn --frozen-lockfile --ignore-optional - - - name: Download affected tests list - if: ${{ needs.pw_affected_tests.result == 'success' }} - uses: actions/download-artifact@v4 - continue-on-error: true - with: - name: playwright-affected-tests - path: ./playwright - - - name: Run PlayWright - run: yarn test:pw:ci --affected=${{ github.event_name == 'pull_request' }} --pass-with-no-tests - env: - HOME: /root - PW_PROJECT: ${{ matrix.project }} - - - name: Upload test results - if: always() - uses: actions/upload-artifact@v4 - with: - name: playwright-report-${{ matrix.project }} - path: playwright-report - retention-days: 10 \ No newline at end of file diff --git a/.github/workflows/cleanup.yml b/.github/workflows/cleanup.yml deleted file mode 100644 index a8ed3ee27a..0000000000 --- a/.github/workflows/cleanup.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Cleanup environments - -on: - pull_request: - types: - - closed - - merged - workflow_dispatch: - -jobs: - cleanup_release: - uses: blockscout/blockscout-ci-cd/.github/workflows/cleanup_helmfile.yaml@master - with: - appName: review-l2-$GITHUB_REF_NAME_SLUG - globalEnv: review - helmfileDir: deploy - kubeConfigSecret: ci/data/dev/kubeconfig/k8s-dev - vaultRole: ci-dev - secrets: inherit - cleanup_l2_release: - uses: blockscout/blockscout-ci-cd/.github/workflows/cleanup_helmfile.yaml@master - with: - appName: review-$GITHUB_REF_NAME_SLUG - globalEnv: review - helmfileDir: deploy - kubeConfigSecret: ci/data/dev/kubeconfig/k8s-dev - vaultRole: ci-dev - secrets: inherit - cleanup_docker_image: - uses: blockscout/blockscout-ci-cd/.github/workflows/cleanup_docker.yaml@master - with: - dockerImage: review-$GITHUB_REF_NAME_SLUG - secrets: inherit diff --git a/.github/workflows/copy-issues-labels.yml b/.github/workflows/copy-issues-labels.yml deleted file mode 100644 index 69896dd051..0000000000 --- a/.github/workflows/copy-issues-labels.yml +++ /dev/null @@ -1,106 +0,0 @@ -name: Copy issues labels to pull request - -on: - workflow_dispatch: - inputs: - pr_number: - description: Pull request number - required: true - type: string - issues: - description: JSON encoded list of issue ids - required: true - type: string - -jobs: - run: - name: Run - runs-on: ubuntu-latest - steps: - - name: Find unique labels - id: find_unique_labels - uses: actions/github-script@v7 - env: - ISSUES: ${{ inputs.issues }} - with: - script: | - const issues = JSON.parse(process.env.ISSUES); - - const WHITE_LISTED_LABELS = [ - 'client feature', - 'feature', - - 'bug', - - 'dependencies', - 'performance', - - 'chore', - 'enhancement', - 'refactoring', - 'tech', - 'ENVs', - ] - - const labels = await Promise.all(issues.map(getIssueLabels)); - const uniqueLabels = uniqueStringArray(labels.flat().filter((label) => WHITE_LISTED_LABELS.includes(label))); - - if (uniqueLabels.length === 0) { - core.info('No labels found.\n'); - return []; - } - - core.info(`Found following labels: ${ uniqueLabels.join(', ') }.\n`); - return uniqueLabels; - - async function getIssueLabels(issue) { - core.info(`Obtaining labels list for the issue #${ issue }...`); - - try { - const response = await github.request('GET /repos/{owner}/{repo}/issues/{issue_number}/labels', { - owner: 'blockscout', - repo: 'frontend', - issue_number: issue, - }); - return response.data.map(({ name }) => name); - } catch (error) { - core.error(`Failed to obtain labels for the issue #${ issue }: ${ error.message }`); - return []; - } - } - - function uniqueStringArray(array) { - return Array.from(new Set(array)); - } - - - name: Update pull request labels - id: update_pr_labels - uses: actions/github-script@v7 - env: - LABELS: ${{ steps.find_unique_labels.outputs.result }} - PR_NUMBER: ${{ inputs.pr_number }} - with: - script: | - const labels = JSON.parse(process.env.LABELS); - const prNumber = Number(process.env.PR_NUMBER); - - if (labels.length === 0) { - core.info('Nothing to update.\n'); - return; - } - - for (const label of labels) { - await addLabelToPr(prNumber, label); - } - core.info('Done.\n'); - - async function addLabelToPr(prNumber, label) { - console.log(`Adding label to the pull request #${ prNumber }...`); - - return await github.request('POST /repos/{owner}/{repo}/issues/{issue_number}/labels', { - owner: 'blockscout', - repo: 'frontend', - issue_number: prNumber, - labels: [ label ], - }); - } \ No newline at end of file diff --git a/.github/workflows/deploy-main.yml b/.github/workflows/deploy-main.yml deleted file mode 100644 index 9e7f11dee9..0000000000 --- a/.github/workflows/deploy-main.yml +++ /dev/null @@ -1,51 +0,0 @@ -name: Deploy from main branch - -on: - push: - branches: - - main - paths-ignore: - - '.github/ISSUE_TEMPLATE/**' - - '.husky/**' - - '.vscode/**' - - 'docs/**' - - 'jest/**' - - 'mocks/**' - - 'playwright/**' - - 'stubs/**' - - 'tools/**' - workflow_dispatch: - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - publish_image: - name: Publish Docker image - uses: './.github/workflows/publish-image.yml' - secrets: inherit - - deploy_main: - name: Deploy frontend - needs: publish_image - uses: blockscout/blockscout-ci-cd/.github/workflows/deploy_helmfile.yaml@master - with: - appName: front - globalEnv: main - helmfileDir: deploy - kubeConfigSecret: ci/data/dev/kubeconfig/k8s-dev - vaultRole: ci-dev - secrets: inherit - - deploy_l2: - name: Deploy frontend (L2) - needs: publish_image - uses: blockscout/blockscout-ci-cd/.github/workflows/deploy_helmfile.yaml@master - with: - appName: l2-optimism-goerli - globalEnv: optimism-goerli - helmfileDir: deploy - kubeConfigSecret: ci/data/dev/kubeconfig/k8s-dev - vaultRole: ci-dev - secrets: inherit diff --git a/.github/workflows/deploy-review-l2.yml b/.github/workflows/deploy-review-l2.yml deleted file mode 100644 index 02feb3ce64..0000000000 --- a/.github/workflows/deploy-review-l2.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: Deploy review environment (L2) - -on: - workflow_dispatch: - -jobs: - make_slug: - name: Make GitHub reference slug - runs-on: ubuntu-latest - outputs: - REF_SLUG: ${{ steps.output.outputs.REF_SLUG }} - steps: - - name: Inject slug/short variables - uses: rlespinasse/github-slug-action@v4.4.1 - - - name: Set output - id: output - run: echo "REF_SLUG=${{ env.GITHUB_REF_NAME_SLUG }}" >> $GITHUB_OUTPUT - - publish_image: - name: Publish Docker image - needs: make_slug - uses: './.github/workflows/publish-image.yml' - with: - tags: ghcr.io/blockscout/frontend:review-${{ needs.make_slug.outputs.REF_SLUG }} - secrets: inherit - - deploy_review_l2: - name: Deploy frontend (L2) - needs: [ make_slug, publish_image ] - uses: blockscout/blockscout-ci-cd/.github/workflows/deploy_helmfile.yaml@master - with: - appName: review-l2-${{ needs.make_slug.outputs.REF_SLUG }} - globalEnv: review - helmfileDir: deploy - kubeConfigSecret: ci/data/dev/kubeconfig/k8s-dev - vaultRole: ci-dev - secrets: inherit diff --git a/.github/workflows/deploy-review.yml b/.github/workflows/deploy-review.yml deleted file mode 100644 index 64bc517804..0000000000 --- a/.github/workflows/deploy-review.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: Deploy review environment - -on: - workflow_dispatch: - inputs: - envs_preset: - description: ENVs preset - required: false - default: "" - type: choice - options: - - none - - base - - gnosis - - eth - - eth_sepolia - - eth_goerli - - optimism - - optimism_sepolia - - polygon - - rootstock - - stability - - zkevm - - zksync - -jobs: - make_slug: - name: Make GitHub reference slug - runs-on: ubuntu-latest - outputs: - REF_SLUG: ${{ steps.output.outputs.REF_SLUG }} - steps: - - name: Inject slug/short variables - uses: rlespinasse/github-slug-action@v4.4.1 - - - name: Set output - id: output - run: echo "REF_SLUG=${{ env.GITHUB_REF_NAME_SLUG }}" >> $GITHUB_OUTPUT - - publish_image: - name: Publish Docker image - needs: make_slug - uses: './.github/workflows/publish-image.yml' - with: - tags: ghcr.io/blockscout/frontend:review-${{ needs.make_slug.outputs.REF_SLUG }} - build_args: ENVS_PRESET=${{ inputs.envs_preset }} - secrets: inherit - - deploy_review: - name: Deploy frontend - needs: [ make_slug, publish_image ] - uses: blockscout/blockscout-ci-cd/.github/workflows/deploy_helmfile.yaml@master - with: - appName: review-${{ needs.make_slug.outputs.REF_SLUG }} - globalEnv: review - helmfileDir: deploy - kubeConfigSecret: ci/data/dev/kubeconfig/k8s-dev - vaultRole: ci-dev - secrets: inherit diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml deleted file mode 100644 index 6aab1f48ff..0000000000 --- a/.github/workflows/e2e-tests.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Run E2E tests k8s - -on: - workflow_dispatch: - workflow_call: - -# concurrency: -# group: ${{ github.workflow }}__${{ github.job }}__${{ github.ref }} -# cancel-in-progress: true - -jobs: - publish_image: - name: Publish Docker image - uses: './.github/workflows/publish-image.yml' - secrets: inherit - - deploy_e2e: - name: Deploy E2E instance - needs: publish_image - runs-on: ubuntu-latest - permissions: write-all - steps: - - name: Get Vault credentials - id: retrieve-vault-secrets - uses: hashicorp/vault-action@v2.4.1 - with: - url: https://vault.k8s.blockscout.com - role: ci-dev - path: github-jwt - method: jwt - tlsSkipVerify: false - exportToken: true - secrets: | - ci/data/dev/github token | WORKFLOW_TRIGGER_TOKEN ; - - name: Trigger deploy - uses: convictional/trigger-workflow-and-wait@v1.6.1 - with: - owner: blockscout - repo: deployment-values - github_token: ${{ env.WORKFLOW_TRIGGER_TOKEN }} - workflow_file_name: deploy_blockscout.yaml - ref: main - wait_interval: 30 - client_payload: '{ "instance": "dev", "globalEnv": "e2e"}' - - test: - name: Run tests - needs: deploy_e2e - uses: blockscout/blockscout-ci-cd/.github/workflows/e2e_new.yaml@master - secrets: inherit \ No newline at end of file diff --git a/.github/workflows/label-issues-in-release.yml b/.github/workflows/label-issues-in-release.yml deleted file mode 100644 index b95fd45616..0000000000 --- a/.github/workflows/label-issues-in-release.yml +++ /dev/null @@ -1,282 +0,0 @@ -name: Label issues in release - -on: - workflow_dispatch: - inputs: - tag: - description: 'Release tag' - required: true - type: string - label_name: - description: 'Name of the label' - required: true - type: string - label_description: - description: 'Description of the label' - default: '' - required: false - type: string - label_color: - description: 'A color of the added label' - default: 'FFFFFF' - required: false - type: string - workflow_call: - inputs: - tag: - description: 'Release tag' - required: true - type: string - label_name: - description: 'Name of the label' - required: true - type: string - label_description: - description: 'Description of the label' - default: '' - required: false - type: string - label_color: - description: 'A color of the added label' - default: 'FFFFFF' - required: false - type: string - outputs: - issues: - description: "JSON encoded list of issues linked to commits in the release" - value: ${{ jobs.run.outputs.issues }} - -# concurrency: -# group: ${{ github.workflow }}__${{ github.job }}__${{ github.ref }} -# cancel-in-progress: true - -jobs: - run: - name: Run - runs-on: ubuntu-latest - outputs: - issues: ${{ steps.linked_issues.outputs.result }} - steps: - - name: Getting tags of the two latestest releases - id: tags - uses: actions/github-script@v7 - env: - TAG: ${{ inputs.tag }} - with: - script: | - const { repository: { releases: { nodes: releases } } } = await github.graphql(` - query ($owner: String!, $repo: String!) { - repository(owner: $owner, name: $repo) { - releases(first: 10, orderBy: { field: CREATED_AT, direction: DESC }) { - nodes { - name - tagName - tagCommit { - oid - } - isPrerelease - isDraft - publishedAt - } - } - } - } - `, - { - owner: context.repo.owner, - repo: context.repo.repo, - } - ); - - if (releases[0].tagName !== process.env.TAG) { - core.info(`Current latest tag: ${ releases[0].tagName }`); - core.setFailed(`Release with tag ${ process.env.TAG } is not latest one.`); - return; - } - - const latestTag = process.env.TAG; - const [ { tagName: previousTag } ] = releases - .slice(1) - .filter(({ isDraft }) => !isDraft); - - core.info('Found following tags:'); - core.info(` latest: ${ latestTag }`); - core.info(` second latest: ${ previousTag }`); - - core.setOutput('latest', latestTag); - core.setOutput('previous', previousTag); - - - name: Looking for commits between two releases - id: commits - uses: actions/github-script@v7 - env: - PREVIOUS_TAG: ${{ steps.tags.outputs.previous }} - LATEST_TAG: ${{ steps.tags.outputs.latest }} - with: - script: | - const { data: { commits: commitsInRelease } } = await github.request('GET /repos/{owner}/{repo}/compare/{basehead}', { - owner: context.repo.owner, - repo: context.repo.repo, - basehead: `${ process.env.PREVIOUS_TAG }...${ process.env.LATEST_TAG }`, - }); - - if (commitsInRelease.length === 0) { - core.notice(`No commits found between ${ process.env.PREVIOUS_TAG } and ${ process.env.LATEST_TAG }`); - return []; - } - - const commits = commitsInRelease.map(({ sha }) => sha); - - core.startGroup(`Found ${ commits.length } commits`); - commits.forEach((sha) => { - core.info(sha); - }) - core.endGroup(); - - return commits; - - - name: Looking for issues linked to commits - id: linked_issues - uses: actions/github-script@v7 - env: - COMMITS: ${{ steps.commits.outputs.result }} - with: - script: | - const commits = JSON.parse(process.env.COMMITS); - - if (commits.length === 0) { - return []; - } - - const map = {}; - - core.startGroup(`Looking for linked issues`); - for (const sha of commits) { - const result = await getLinkedIssuesForCommitPR(sha); - result.forEach((issue) => { - map[issue] = issue; - }); - } - core.endGroup(); - - const issues = Object.values(map); - - if (issues.length > 0) { - core.startGroup(`Found ${ issues.length } unique issues`); - issues.sort().forEach((issue) => { - core.info(`#${ issue } - https://github.com/${ context.repo.owner }/${ context.repo.repo }/issues/${ issue }`); - }) - core.endGroup(); - } else { - core.notice('No linked issues found.'); - } - - return issues; - - async function getLinkedIssuesForCommitPR(sha) { - core.info(`Fetching issues for commit: ${ sha }`); - - const response = await github.graphql(` - query ($owner: String!, $repo: String!, $sha: GitObjectID!) { - repository(owner: $owner, name: $repo) { - object(oid: $sha) { - ... on Commit { - associatedPullRequests(first: 10) { - nodes { - number - title - state - merged - closingIssuesReferences(first: 10) { - nodes { - number - title - closed - } - } - } - } - } - } - } - } - `, { - owner: context.repo.owner, - repo: context.repo.repo, - sha, - }); - - if (!response) { - core.info('Nothing has found.'); - return []; - } - - const { repository: { object: { associatedPullRequests } } } = response; - - const issues = associatedPullRequests - .nodes - .map(({ closingIssuesReferences: { nodes: issues } }) => issues.map(({ number }) => number)) - .flat(); - - core.info(`Found following issues: ${ issues.join(', ') || '-' }\n`); - - return issues; - } - - - name: Creating label - id: label_creating - uses: actions/github-script@v7 - env: - LABEL_NAME: ${{ inputs.label_name }} - LABEL_COLOR: ${{ inputs.label_color }} - LABEL_DESCRIPTION: ${{ inputs.label_description }} - with: - script: | - try { - const result = await github.request('POST /repos/{owner}/{repo}/labels', { - owner: context.repo.owner, - repo: context.repo.repo, - name: process.env.LABEL_NAME, - color: process.env.LABEL_COLOR, - description: process.env.LABEL_DESCRIPTION, - }); - - core.info('Label was created.'); - } catch (error) { - if (error.status === 422) { - core.info('Label already exist.'); - } else { - core.setFailed(error.message); - } - } - - - - name: Adding label to issues - id: labeling_issues - uses: actions/github-script@v7 - env: - LABEL_NAME: ${{ inputs.label_name }} - ISSUES: ${{ steps.linked_issues.outputs.result }} - with: - script: | - const issues = JSON.parse(process.env.ISSUES); - - if (issues.length === 0) { - core.notice('No issues has found. Nothing to label.'); - return; - } - - for (const issue of issues) { - core.info(`Adding label to the issue #${ issue }...`); - await addLabelToIssue(issue, process.env.LABEL_NAME); - core.info('Done.\n'); - } - - async function addLabelToIssue(issue, label) { - return await github.request('POST /repos/{owner}/{repo}/issues/{issue_number}/labels', { - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: issue, - labels: [ label ], - }); - } diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml deleted file mode 100644 index 05155cbd32..0000000000 --- a/.github/workflows/pre-release.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: Pre-release - -on: - workflow_dispatch: - push: - tags: - - 'v[0-9]+.[0-9]+.[0-9]+-[a-z]+*' # e.g v1.2.3-alpha.2 - -jobs: - checks: - name: Run code checks - uses: "./.github/workflows/checks.yml" - secrets: inherit - - # publish_image: - # image will be published in e2e-tests.yml workflow - # name: Publish Docker image - # uses: './.github/workflows/publish-image.yml' - # secrets: inherit - - e2e_tests: - name: Run e2e tests - needs: checks - uses: "./.github/workflows/e2e-tests.yml" - secrets: inherit - - version: - name: Pre-release version info - runs-on: ubuntu-latest - outputs: - is_initial: ${{ steps.is_initial.outputs.result }} - steps: - - name: Determine if it is the initial version of the pre-release - id: is_initial - uses: actions/github-script@v7 - env: - TAG: ${{ github.ref_name }} - with: - script: | - const tag = process.env.TAG; - const REGEXP = /^v[0-9]+.[0-9]+.[0-9]+-[a-z]+((\.|-)\d+)?$/i; - const match = tag.match(REGEXP); - const isInitial = match && !match[1] ? true : false; - core.info('is_initial flag value: ', isInitial); - return isInitial; - - label_issues: - name: Add pre-release label to issues - uses: './.github/workflows/label-issues-in-release.yml' - needs: [ version ] - if: ${{ needs.version.outputs.is_initial == 'true' }} - with: - tag: ${{ github.ref_name }} - label_name: 'pre-release' - label_description: Tasks in pre-release right now - secrets: inherit - - # Temporary disable this step because it is broken - # There is an issue with building web3modal deps - upload_source_maps: - name: Upload source maps to Sentry - if: false - uses: './.github/workflows/upload-source-maps.yml' - secrets: inherit diff --git a/.github/workflows/project-management.yml b/.github/workflows/project-management.yml deleted file mode 100644 index 1da733baeb..0000000000 --- a/.github/workflows/project-management.yml +++ /dev/null @@ -1,99 +0,0 @@ -name: Project management -on: - issues: - types: [ closed ] - pull_request: - types: [ review_requested ] - -jobs: - not_planned_issue: - name: Update task for not planned issue - if: ${{ github.event.issue && github.event.action == 'closed' && github.event.issue.state_reason == 'not_planned' }} - uses: './.github/workflows/update-project-cards.yml' - with: - project_name: ${{ vars.PROJECT_NAME }} - field_name: Status - field_value: Done - issues: "[${{ github.event.issue.number }}]" - secrets: inherit - - completed_issue: - name: Update task for completed issue - if: ${{ github.event.issue && github.event.action == 'closed' && github.event.issue.state_reason == 'completed' }} - uses: './.github/workflows/update-project-cards.yml' - with: - project_name: ${{ vars.PROJECT_NAME }} - field_name: Status - field_value: Ready For Realease - issues: "[${{ github.event.issue.number }}]" - secrets: inherit - - pr_linked_issues: - name: Get issues linked to PR - runs-on: ubuntu-latest - if: ${{ github.event.pull_request && github.event.action == 'review_requested' }} - outputs: - issues: ${{ steps.linked_issues.outputs.result }} - steps: - - name: Fetching issues linked to pull request - id: linked_issues - uses: actions/github-script@v7 - env: - PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} - with: - script: | - const response = await github.graphql(` - query ($owner: String!, $repo: String!, $pr: Int!) { - repository(owner: $owner, name: $repo) { - pullRequest(number: $pr) { - number - title - closingIssuesReferences(first: 100) { - nodes { - number - title - closed - } - } - } - } - } - `, { - owner: context.repo.owner, - repo: context.repo.repo, - pr: Number(process.env.PULL_REQUEST_NUMBER), - }); - - const { repository: { pullRequest: { closingIssuesReferences } } } = response; - const issues = closingIssuesReferences.nodes.map(({ number }) => number); - - if (!issues.length) { - core.notice(`No linked issues found for pull request #${ process.env.PULL_REQUEST_NUMBER }`); - return; - } - - core.info(`Found ${ issues.length } issue(s): ${ issues.join(', ') || '-' }`); - - return issues; - - issues_in_review: - name: Update status for issues in review - needs: [ pr_linked_issues ] - if: ${{ needs.pr_linked_issues.outputs.issues }} - uses: './.github/workflows/update-project-cards.yml' - secrets: inherit - with: - project_name: ${{ vars.PROJECT_NAME }} - field_name: Status - field_value: Review - issues: ${{ needs.pr_linked_issues.outputs.issues }} - - copy_labels: - name: Copy issues labels to pull request - needs: [ pr_linked_issues ] - if: ${{ needs.pr_linked_issues.outputs.issues }} - uses: './.github/workflows/copy-issues-labels.yml' - secrets: inherit - with: - pr_number: ${{ github.event.pull_request.number }} - issues: ${{ needs.pr_linked_issues.outputs.issues }} diff --git a/.github/workflows/publish-image.yml b/.github/workflows/publish-image.yml deleted file mode 100644 index 97c1102e8f..0000000000 --- a/.github/workflows/publish-image.yml +++ /dev/null @@ -1,84 +0,0 @@ -name: Publish Docker image - -on: - workflow_dispatch: - inputs: - tags: - description: Image tags - required: false - type: string - build_args: - description: Build-time variables - required: false - type: string - platforms: - description: Image platforms (you can specify multiple platforms separated by comma) - required: false - type: string - default: linux/amd64 - workflow_call: - inputs: - tags: - description: Image tags - required: false - type: string - build_args: - description: Build-time variables - required: false - type: string - platforms: - description: Image platforms (you can specify multiple platforms separated by comma) - required: false - type: string - default: linux/amd64 - -jobs: - run: - name: Run - runs-on: ubuntu-latest - steps: - - name: Check out the repo - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - # Will automatically make nice tags, see the table here https://github.com/docker/metadata-action#basic - - name: Docker meta - id: meta - uses: docker/metadata-action@v5 - with: - images: ghcr.io/blockscout/frontend - - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Add SHORT_SHA env property with commit short sha - run: echo "SHORT_SHA=`echo ${GITHUB_SHA} | cut -c1-8`" >> $GITHUB_ENV - - - name: Debug - env: - REF_TYPE: ${{ github.ref_type }} - REF_NAME: ${{ github.ref_name }} - run: | - echo "ref_type: $REF_TYPE" - echo "ref_name: $REF_NAME" - - - name: Build and push - uses: docker/build-push-action@v5 - with: - context: . - file: ./Dockerfile - push: true - cache-from: type=gha - tags: ${{ inputs.tags || steps.meta.outputs.tags }} - platforms: ${{ inputs.platforms }} - labels: ${{ steps.meta.outputs.labels }} - build-args: | - GIT_COMMIT_SHA=${{ env.SHORT_SHA }} - GIT_TAG=${{ github.ref_type == 'tag' && github.ref_name || '' }} - ${{ inputs.build_args }} \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index df2c0433b1..0000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,91 +0,0 @@ -name: Release - -on: - workflow_dispatch: - release: - types: [ released ] - -jobs: - remove_prerelease_label: - name: Remove pre-release label from issues - runs-on: ubuntu-latest - steps: - - name: Remove label - id: tags - uses: actions/github-script@v7 - env: - LABEL_NAME: pre-release - with: - script: | - const { data: issues } = await github.request('GET /repos/{owner}/{repo}/issues', { - owner: context.repo.owner, - repo: context.repo.repo, - labels: process.env.LABEL_NAME, - state: 'all' - }); - - if (issues.length === 0) { - core.notice(`No issues with label "${ process.env.LABEL_NAME }" found.`); - return; - } - - const issueIds = issues.map(({ node_id }) => node_id); - const labelId = issues[0].labels.find(({ name }) => name === process.env.LABEL_NAME).node_id; - - core.info(`Found ${ issueIds.length } issues with label "${ process.env.LABEL_NAME }"`); - - for (const issueId of issueIds) { - core.info(`Removing label for issue with node_id ${ issueId }...`); - - await github.graphql(` - mutation($input: RemoveLabelsFromLabelableInput!) { - removeLabelsFromLabelable(input: $input) { - clientMutationId - } - } - `, { - input: { - labelIds: [ labelId ], - labelableId: issueId - }, - }); - - core.info('Done.\n'); - } - - - label_released_issues: - name: Label released issues - uses: './.github/workflows/label-issues-in-release.yml' - with: - tag: ${{ github.ref_name }} - label_name: ${{ github.ref_name }} - label_description: Release ${{ github.ref_name }} - secrets: inherit - - update_project_cards: - name: Update project tasks statuses - needs: label_released_issues - uses: './.github/workflows/update-project-cards.yml' - with: - project_name: ${{ vars.PROJECT_NAME }} - field_name: Status - field_value: Released - issues: ${{ needs.label_released_issues.outputs.issues }} - secrets: inherit - - publish_image: - name: Publish Docker image - uses: './.github/workflows/publish-image.yml' - secrets: inherit - with: - platforms: linux/amd64,linux/arm64/v8 - - # Temporary disable this step because it is broken - # There is an issue with building web3modal deps - upload_source_maps: - name: Upload source maps to Sentry - if: false - needs: publish_image - uses: './.github/workflows/upload-source-maps.yml' - secrets: inherit diff --git a/.github/workflows/stale-issues.yml b/.github/workflows/stale-issues.yml deleted file mode 100644 index bcc1a36ca1..0000000000 --- a/.github/workflows/stale-issues.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: Close inactive issues -on: - schedule: - - cron: "55 1 * * *" - -jobs: - close-issues: - runs-on: ubuntu-latest - permissions: - issues: write - pull-requests: write - steps: - - uses: actions/stale@v5 - with: - # issues - only-issue-labels: "need info" - days-before-issue-stale: 14 - days-before-issue-close: 7 - stale-issue-label: "stale" - stale-issue-message: "This issue is stale because it has been open for 14 days with no activity." - close-issue-message: "This issue was closed because it has been inactive for 7 days since being marked as stale." - - # pull requests - days-before-pr-stale: -1 - days-before-pr-close: -1 - - # other settings - repo-token: ${{ secrets.GITHUB_TOKEN }} - close-issue-reason: "not_planned" \ No newline at end of file diff --git a/.github/workflows/update-project-cards.yml b/.github/workflows/update-project-cards.yml deleted file mode 100644 index b071ba61da..0000000000 --- a/.github/workflows/update-project-cards.yml +++ /dev/null @@ -1,240 +0,0 @@ -name: Update project cards for issues - -on: - workflow_dispatch: - inputs: - project_name: - description: Name of the project - default: Front-end tasks - required: true - type: string - field_name: - description: Field name to be updated - default: Status - required: true - type: string - field_value: - description: New value of the field - default: Released - required: true - type: string - issues: - description: JSON encoded list of issue numbers to be updated - required: true - type: string - workflow_call: - inputs: - project_name: - description: Name of the project - required: true - type: string - field_name: - description: Field name to be updated - required: true - type: string - field_value: - description: New value of the field - required: true - type: string - issues: - description: JSON encoded list of issue numbers to be updated - required: true - type: string - -jobs: - run: - name: Run - runs-on: ubuntu-latest - steps: - - name: Getting project info - id: project_info - uses: actions/github-script@v7 - env: - PROJECT_NAME: ${{ inputs.project_name }} - FIELD_NAME: ${{ inputs.field_name }} - FIELD_VALUE: ${{ inputs.field_value }} - with: - github-token: ${{ secrets.BOT_LABEL_ISSUE_TOKEN }} - script: | - const response = await github.graphql(` - query ($login: String!, $q: String!) { - organization(login: $login) { - projectsV2(query: $q, first: 1) { - nodes { - id, - title, - number, - fields(first: 20) { - nodes { - ... on ProjectV2Field { - id - name - } - ... on ProjectV2SingleSelectField { - id - name - options { - id - name - } - } - } - } - } - } - } - } - `, { - login: context.repo.owner, - q: process.env.PROJECT_NAME, - }); - - const { organization: { projectsV2: { nodes: projects } } } = response; - - if (projects.length === 0) { - core.setFailed('Project not found.'); - return; - } - - if (projects.length > 1) { - core.info(`Fould ${ projects.length } with the similar name:`); - projects.forEach((issue) => { - core.info(` #${ projects.number } - ${ projects.title }`); - }) - core.setFailed('Fould multiple projects with the similar name. Cannot determine which one to use.'); - return; - } - - const { id: projectId, fields: { nodes: fields } } = projects[0]; - const field = fields.find((field) => field.name === process.env.FIELD_NAME); - - if (!field) { - core.setFailed(`Field with name "${ process.env.FIELD_NAME }" not found in the project.`); - return; - } - - const option = field.options.find((option) => option.name === process.env.FIELD_VALUE); - - if (!option) { - core.setFailed(`Option with name "${ process.env.FIELD_VALUE }" not found in the field possible values.`); - return; - } - - core.info('Found following info:'); - core.info(` project_id: ${ projectId }`); - core.info(` field_id: ${ field.id }`); - core.info(` field_value_id: ${ option.id }`); - - core.setOutput('id', projectId); - core.setOutput('field_id', field.id); - core.setOutput('field_value_id', option.id); - - - name: Getting project items that linked to the issues - id: items - uses: actions/github-script@v7 - env: - ISSUES: ${{ inputs.issues }} - with: - github-token: ${{ secrets.BOT_LABEL_ISSUE_TOKEN }} - script: | - const result = []; - const issues = JSON.parse(process.env.ISSUES); - - for (const issue of issues) { - const response = await getProjectItemId(issue); - response?.length > 0 && result.push(...response); - } - - return result; - - async function getProjectItemId(issueId) { - core.info(`Fetching project items for issue #${ issueId }...`); - - try { - const response = await github.graphql(` - query ($owner: String!, $repo: String!, $id: Int!) { - repository(owner: $owner, name: $repo) { - issue(number: $id) { - title, - projectItems(first: 10) { - nodes { - id, - } - } - } - } - } - `, - { - owner: context.repo.owner, - repo: context.repo.repo, - id: issueId, - } - ); - - const { repository: { issue: { projectItems: { nodes: projectItems } } } } = response; - - if (projectItems.length === 0) { - core.info('No project items found.\n'); - return []; - } - - const ids = projectItems.map((item) => item.id); - core.info(`Found [ ${ ids.join(', ') } ].\n`); - return ids; - - } catch (error) { - if (error.status === 404) { - core.info('Nothing has found.\n'); - return []; - } - } - } - - - name: Updating field value of the project items - id: updating_items - uses: actions/github-script@v7 - env: - ITEMS: ${{ steps.items.outputs.result }} - PROJECT_ID: ${{ steps.project_info.outputs.id }} - FIELD_ID: ${{ steps.project_info.outputs.field_id }} - FIELD_VALUE_ID: ${{ steps.project_info.outputs.field_value_id }} - with: - github-token: ${{ secrets.BOT_LABEL_ISSUE_TOKEN }} - script: | - const items = JSON.parse(process.env.ITEMS); - - if (items.length === 0) { - core.info('Nothing to update.'); - core.notice('No project items found for provided issues. Nothing to update.'); - return; - } - - for (const item of items) { - core.info(`Changing field value for item ${ item }...`); - await changeItemFieldValue(item); - core.info('Done.\n'); - } - - async function changeItemFieldValue(itemId) { - return await github.graphql( - ` - mutation($input: UpdateProjectV2ItemFieldValueInput!) { - updateProjectV2ItemFieldValue(input: $input) { - clientMutationId - } - } - `, - { - input: { - projectId: process.env.PROJECT_ID, - fieldId: process.env.FIELD_ID, - itemId, - value: { - singleSelectOptionId: process.env.FIELD_VALUE_ID, - }, - }, - } - ); - }; - diff --git a/.github/workflows/upload-source-maps.yml b/.github/workflows/upload-source-maps.yml deleted file mode 100644 index 55b18067fe..0000000000 --- a/.github/workflows/upload-source-maps.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Upload source maps to Sentry -on: - workflow_call: - workflow_dispatch: - -env: - SENTRY_ORG: ${{ vars.SENTRY_ORG }} - SENTRY_PROJECT: ${{ vars.SENTRY_PROJECT }} - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - SENTRY_DSN: ${{ secrets.SENTRY_DSN }} - -jobs: - build_and_upload: - name: Build app with source maps and upload to Sentry - runs-on: ubuntu-latest - if: ${{ github.ref_type == 'tag' }} - steps: - - name: Checkout repo - uses: actions/checkout@v4 - - - name: Setup node - uses: actions/setup-node@v4 - with: - node-version: 20.11.0 - cache: 'yarn' - - - name: Cache node_modules - uses: actions/cache@v4 - id: cache-node-modules - with: - path: | - node_modules - key: node_modules-${{ runner.os }}-${{ hashFiles('yarn.lock') }} - - - name: Install dependencies - if: steps.cache-node-modules.outputs.cache-hit != 'true' - run: yarn --frozen-lockfile --ignore-optional - - - name: Make production build with source maps - run: yarn build - env: - NODE_ENV: production - - - name: Inject Sentry debug ID - run: yarn sentry-cli sourcemaps inject ./.next - - - name: Upload source maps to Sentry - run: yarn sentry-cli sourcemaps upload --release=${{ github.ref_name }} --url-prefix=~/_next/ --validate ./.next \ No newline at end of file