From 9af57a4e4948f270467ae7a7a2fb50cccb2870cd Mon Sep 17 00:00:00 2001 From: Vic Date: Tue, 25 Jan 2022 01:32:08 +0100 Subject: [PATCH] Working display and resize --- .gitignore | 2 +- images/thumb/fjord.jpg | Bin 0 -> 29179 bytes src/routes/api/image.ts | 70 +++++++++++++++++++++++++++++----------- tsconfig.json | 2 +- 4 files changed, 53 insertions(+), 21 deletions(-) create mode 100644 images/thumb/fjord.jpg diff --git a/.gitignore b/.gitignore index d28341e..7114b93 100644 --- a/.gitignore +++ b/.gitignore @@ -41,7 +41,7 @@ bower_components .lock-wscript # Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release +build/ # Dependency directories node_modules/ diff --git a/images/thumb/fjord.jpg b/images/thumb/fjord.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1b175fd727b6eaf6781114241733a669a333b223 GIT binary patch literal 29179 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%0DCZDe`MZEgTT556UC|$b?bAo@djG;1!>E z4l=9ISo-J?POy8i-rt2+jD=`!rh;Hx$1!#|y074jp;jO-DgV2efyW%T@Sx7Hsn??m z?|D4fKO(85RHJUyvik#Y+B7J&b!bUwN~OAQbjQqRsO|`*cd%YcD+^DS;prY?f4 zUBxM9D9~Ov-%qwRq#CB4DR6-+W=9~0*wc2mX=s(uX_d|i$+9aeGd3wDtKnQHn@Njo z`m04wN(C+12Ve>6!Bt~ ze8CT59%7W%!ZfnQ=DnuB<&A)nLK1mqpdb1GbZKZUDrpjCi(G12u$v@hP-aC|%?Y2Z zjQnTa`r=-f18MP1tbrG|FQHJ4%ztT5hUFM=9a_PPpAS0dK^cze3p%jg>QtC^fxHqEvL(BBkUf2tPvRd$z z!56m|Lu9xHcq#o$n#O9q|MkwWx&Z`s`Ug9x|Dss)UjnX6Q#Nu|_1t%0KRi+&W=F~C1h z3(*v1Pi>zEw_03?WIN?xpzB zeGIf>sv9*~&nE6437XwS=4JR9PLS#$Ed6wyo>MhsG^^FplvEslhY1w6%A~ERCiV(P z-3TzS2T}sp1IyL&N~e`IG)>ueXONEThZ1`0)kQAzbCs6ba1d*kZ{<@G4v57as4Esv zE7JHkE^nL!UN%XW;ZzV%-+ zOY{%cU>qJ+@{zDZY8JVwk}0JyWS8`*^m8apP`18m^aHPumrEgg-2DsK zb=1_}W?7cNTk}0qVH#U>C*(&)*&7rKY)UQ3tSX2!Wzw~r6BWn=)aX#PJbMmI zl`s(4WOpyGs8Lxfh-Bj`wRX3+#|DrPc=VV>-6nX$#xN1D56r;Edp)`C4!2FTJ33fL7R6likS zU~_C5CswIl9)>>`UiJF>E0G$Oql!!}#h*!2%_Xa%nj!t!)~epuU`9eoNRg50mW=vJ zq37>v(qYLD;K1j`8O04vmG)EtbV7lptq%hpbNxFw9D%IXHqtCmus6mM; zX^rS=sqD1CzQP2CtQ>2Vkv^n#dlRaXHbhNe1nX_oy!6e-^hy#gffd#^;V|4w{|f_U zY9vwOd}<8#(%!MeYlr0&xK4qD+*Hn#23FxSV6U}nMe=}N&AbQbFh1Vg6AIN}vN_7> z4yeQZtsYrH($dBxq};u{8U&v=D)b9VD@oAlK{;W!6n*f;4YQEiwNRpb>$Ri#2cXs{ zoK;&T@sI;NmZhs!D&Q4+@c6Dgh3;a!HBib7LCwDgx%5(|xC@}fqW zCf{mD=jrP{O2~uxL!CsQZ31{fLX~>?PggDk$oPQ}ikVuv%{%<9J$ymI2vsZKB)hHV zIbS}?YfODqOXC6kNZ2$*EOu^RHu4*;azcCcivAb->vI{MZA%y1LJi-WI-Eb=HtrA zIhJbSe$tZ`j@Fx6l)Sd+OLpSh<6M}OBLNvN-aT-IDvptuq+?| zHg=k7_~pRa#4?~`iD1K`tH{ZaIiqerCc3V3K^Xvb3f`tL_{`)Hh#l9H4J*-iTI_wg~l1hDK_{DWo7q%#^`mi2@nzoXaa0nKshVS^~GVUY029BJpTy1Hs)T;`vp+QjdA|5>Lw@d<* z>3XPl22v>?WSZ=>Wd!&SdNn3(hQ!tArHl1qUQ#-RXw7qJ=`mtIfEd0*}0bBU!P44|5Kpwp5p= z$Q`W#blsNgm67_zMKTRr!#ipo&*AjFUc)RV$HG^?*JX^m z!f?vMgQ?ePxGVl-DB=}~QJ|0}D^4#0?ARGR1fdd#(^Blc4zkD@YMHa&0|jA4&G67yXE8J zHs#xhd8!@EPW_FlOrF$P1<#bXig9foU@?uXkCOvVge+ZYSiFqa;Rm1&eTM40-mfKq zE&;Ph^EldMQ;f$9+S&QsenVuHtvwGNDn83$9#}BXp`XV+k>YhWPCFrPpr~1;U;(K& zkB@(KNH&P4vQShS_R5-!te8r%oqQl8roUX-Sa#()vB6o&a9{3?L>PGojpv*^zImD8 zIK|HDlO+XhB`w4f0ORUOd=I&YH*SDq!bb2=C^(u>lKv~4Qf5J}eF`*pw8s=H8M-|5 z%wn<|uf>s=-|E(^3K@%n!S%wIo)kXZ2IL0-1#_X%8C8`a_Br%tvSD121-*4N3hHk6 zh9vtt*M+)0Q#?C1y>;ej#t8%GWwgopVqgB})-$L&g zy?+UJ?T&SOA4ABO!(@zRv1km>-X->O0aICfr-a3Fj}ar72n}>8mmJ}0nU{kZo)B5p zK{CBoepK+{A({ic0Te!v4}>w{u%^*mUEs_uBBy$;1-FjyFNF<~rO*&Fi=po&`mbO6 zz@VKn#2N4N%n|7(Y7tO0CGHA$&>0a2hnf^o@|dW=8Im`F`LjAE!M}hhmo{t3G0Hb+ z;g&wSFp!^#80;k_Jh4J=J(mupZNTKVqCo>GE6u4PFlPqaqHdO~*=(^*{#HA32QMP^ zqvFLYDY`MdF)U+4MypWKbLH$y&C*!BxLLd%E^;a~9a~fV07B41C`(Gj=4Xx2fUrFn zc8#cvdm%%V$m)5wn=%AWT`{;-S}Q~CBr2*C4nOzd9j?D$r@?xx%s)XY3cR=FPnb3`GwFmSy+CNH zh6rWVkx5=e51h_(}gH*Mu3UpIOaH9qeyIol1o8> zO!NsL0^kS?D`P)1gz$WJJ2(^kt~Phs=PHxQZd4!xNuS##lL4*hd>LmJauS+>$n;Kp z8N;ei{Sd4Q^Y%g^q~!56odTAFF~rvTAk)Ai^(g8syYL%}Z9ud$Le?T-^1}m|ln_EC2?39) zh~%i!DPx_dp1%TzcRkk0dI}c=we1Pg<2;|I=k2(CPBKntQ*GXYn2dog^M^oQ?6=}5 zy?^cBkvUvLd>hs26C{3_ykg$`0L0-cZtjaQiN`dSSqn90rV%|39iT3UPlu`R2UTuD z7?<^dB^G~sM4*=qnto%*R@H4}(IM)HXxgkta_NIVdW0g`8!m||#n4+9R;Zkeuz$-;ni#2fWM1_fYbmq5vSaMk zNT)m6!h!QkIGf{bI9(lYp4;8OVa2eW!H4;XoC-DY}kfu3w!etPvxy-k*~A0n$(R`Rb~s8-9%8d2 z4`NbFn5UB8rXyZDro()WH=g-|p6$MNjqn+%Kj5}ZfT4t2&VtE5QXol#LuG0?HTYcM zBzcvQdv1Oy3k%55R04xW#EE)^SQ1l5+@l8f@T;^D2U!ZUMN;+0|KbGY0j*OZfIuc7 zkvN9?S^*%F%mt%G`M@~QdJ=)xWIzhG4f)lw&=C^@Q6>d?_kw*j)-g**gM^8DRBkK> zs6JCMpqlVH^5Cxu2VZE!(n%{hbt7AoZ=Qhv06GV`5zNmdv-W_Qgi&!=?@*fO2RY5$ zRLQ}aICq(g)T?+(l_N-yly*agNv9xrPShe8PHJwGXgc~=(=l=>Gv`RF<0K0+D;?@m zm;l05XvbR0GDt~zZZbeD*N`m_GEklAPPc7Q5(aumLc|ICfIwkvb5C;Ni9{I0{t^KM zn&riipy7g$5;IuD=QqT`)3lC0L3C7Ls8`GMDV`b8@A?}VpT1tl*OA9}PPh+_@0}VC zh??0&I625oeCf|LlaBdT&MA~bwEY;u?CL1EL6N`_3(`%X0CWZ~;x!JxpMRj$`Ct$WiH;gFTKw)-gt=III%=LU169V{iuko zjA*GvX_BQKQjWf;H0YR0BsF0hqxv0i!X+M^;xZ>0h4a8yL2&|AeVLcwV9FPnKBYn= zJtdqGos6tScLbEt@N_o2Bn%MkBhN(S>g8A?fM#@_{IHfTlPRDPy=ge83_cmTABe{I zcMUv=hGNrU{hI_k7|FoGsN`W&LZrCkJd63r3`EZ`mB|723@(b~Umm(V9(d!}Lc=EK zxy-mVWkDV0`C&a@j{K7C!eLHwF=0MRl%3m0MyAmBSL}*=ZMxBZ&TGeOQYf3^&McXgqEaw?1s2sYe0bVX$0D&kG$!4{_9PGpd`Kx`N^)~lO!N;t z!F0WKt!Rv>Bcm46OQ-Z;NFr$rFmP#%0G7xcoJFZ&ESE`XJklQd^4CF(8+<27L~!XQ zY#}*srv#4Qv9hlcY*D#kG{NyeE{T8ANyosPOz;d1taPlj81YPCkO%8@_D_X#*SkLp z=0SpFWMZg_NotqMEqJts2Rjqg{DjyjFFcTI@_gvmvz3)2o+VL|8&7ag=y&q?JfFj9 zJNWc(@#MODj4JsHlo+K>um8kUbE(YId=|mYkfxCTu>~hOo;Bx9UCk65D>BMnkHQ^q z$+AEkYNpPPIc@N)>Lvx%Ru3Qp?gk?5v0K1UPQ|HJh!;u2$&*Z$(3Bzv-)vjMslvXu zER{jG?T`b4)bgE}Y!bM3YmQm5o=jr_U5d3CP*|>^+c3jPxP>*4EkrT4jxE5nznQPBOBz1|Bkl) zkqyv)2VMVt+XaLKAo_2zahq6(*f_s8aQDAlgGgGzMU=e^lMps$49&j zTwH%>=yh`g>vh(R^M3jV(BtBxATn036pQk_CSX3=ixF>C&S0v$5nXq(^+ET?C;1@nQ#@fs*@Ft29YxnrxAV4WluH{zhong2NyRP0l&B;-$!;H?Fj5ZnaYC zZqB(R?67g$6LQpw9Ghxc8G@#0ygZ;I787eAS-fMAgOz5*V9}xlR<0Dt*sR{4oClUl zF(Aha`$!RvFaWvrV|XBl7s&zeAD=(BLlTMyxxxY3?pHzDfnVi8kj&jWK}}c4hZGrz zokE`m3hVeptfI)DYYG7R(>QKaNx^@_6GO8 zY{m~ELeXK6_%sHg)mpW}p6k0jS*jq|tB!vQKxC^j+^WQS#H2|nIDeUe-DASb0tl!d zB8J)-pX+x@vFOYNqGE+WE+MB2vljmX|8{+i1Q_Rqlon?yA%n*keNlN(!9mD9Vw)HQ zOG;GbLBWgfuE45M+!m~4Zar*z3mH`bi`%Ri*yLD9sE;KZ=hB0!K&~BeA#H>0H$gtG zMpT_rNnh*FW9lv_UGXn{FkQn+>o`V6?9hz$`H6mrSK42vA)~(vZ1Jt_|;i zc9BQR9E~bANAn-9ZCN|b?9P9%LsKjiA5YE%7 z?&T7y}vRaK;ZJ5%yj`0*A zPN=GT40SNb!Z2+9H!);nJH%BfIul1Zu|UgKoVQ8#+ea)4!n2}DY;JB5>bN$YVnmyn zI;36G!Uq*CLv==ISLA?qm0&XY*3pv}(Mu|DP|gKgbY};ofVHuN8AQNljjmT_{bFM= zDHKGksyo-&27?^O5vng(VO#6AhH>?|r_Za$HOk&AJXql%?NPm&J%~vu)I@pent2L^ zidb}6&Z@h7oM&X;T1@eM<=)tDx4DiN*&?y_ei~$RPi}O2QxWL0?{!-`p>`T*t~GHi zFxxoJ;-I1r3J-7ZtRo1OmZ-w;h76}IF_&hc`PhSGts~t9;Hz-u+=&*opbbqeCpj%D zd2Z(0PQ+0H9C!D-Yo3s+K8$Lj&098PVA`>BU;@y}BVxMgV%+r6Atue0&?+fSYQ3LJ zRoq)!tDi0mdt1#$uy+LB@4MFJqR1#dkaRz)^3rtB2<-40lT(5*os*kEm(j8N=W zV->s228*?mkn!iXlzW`MAPe7(=kqv0b#lReK@lE*0pm#Kfjxy)Ll@2RyOEt+#bEb@ zlj*k2VQQh`I6S_}gKwK=9G4Ul@wu{|>3VXQB$q8KC+&oaN=H%OYDSU&(RI~kkPvwz zAXmxFM8K^KRF`iq0O@z3L1PaP03lvGtD!cj=f)R9r1#mbrwK zWi;INHVY=gAlDxs`#m&=E`bmgx#}~x2EYymZp2vGKy7S)tM8lsMj1HAvyLmY;$}D8 zRnr1Q;i;1FfC<>1qkzqk&N>s{mD5gDQr9BkcXV3R#{psEk!!>1Sz)!v;#q5hCRHqT z^+xUDf$#e}AXhR`Dl}l7PFc#zIdw^DYVV*aL%2`GsU}6YLVy~#-iR14T3k&6};KE%d1%LCUb z9(@EU)c%u;uN>~kOj#b3d%vflsb{`$4O$V8l&Md2ftyh-Hl>}X%lxMzLF zZbZ1G8{8(F5Y!zFm2BPvORb0yH8&x$UtlurLxIjR)~GEII+o5JxYT#>6mMcZ(aQO4 zjAvDSE2e(zd;RRw0G^+|KIR8t`1S{}eX+RU>67E|2N3wjgo~H_&T3}YDQ`Y3)zqWb z*r4VzI4qzPxxDxdGM(ohpGHOot6+cHs#|T>A7{7LupA8*Z$^OPa>SwGFn5}BvTpAJ zI8@JyqB0k02ue{EPTU*M^f=PWBQ~tY0H~nfOG}wcmc=AC=%}7bjT1dKk8l}Wlu!yf z?36?HvWyjwiqS!n){SI`*%ZP>Jdbaok0@?`K4QO@>9`Rf<4tO;T~0p8T3JIOMiW}? zqUBh^HcUIZ#^8#l;DvsW)#Qyi&>!xc&?|rFY#%+&p$8c|E=iLu&9Diyj{ok1px)Qx?zL zmer?Xk+2Mx%~;tw3Nc1EwQWO7^(`E#6q0HbmZeQE_yN%Bx5IflLmZ*`&rmA=U9-K^ ze@ed$U8DA9{(KzVru2|~HTX0;wu1t(X&mRq+ttdlrB8NoVFiiv+@3DI&&VFq8s|=N zNp>M7)2F*-NEF|*>{(C9$=p;+w)+|yJ)@luj9UB%Dadns?uIXBN9J~TRT~x?8ZOpaDRx@iAn(cyJdWC;XwIgJORkssd z)hBY@iN00u9A64UcOpAj7%n_E%mgOJF=!Cy_JM{8hE?#AyRPfE&*FnqM;;V!vTR)U zXx^Z@sJUOmSivX=Riz^n+1?DX2_5yvgFC;yi4d}^W(R1eHZcaf8@pO2fVM?Lcn?W=OUg)WgQ9&mP1CBdzW!> zO(Pmka(LnL(uhY05>6-fLmo5ugFFI>{p>1x&mpx+ysnFdb50PMpVA zp2CsW!o+AS&3YVWSK281W-Fr*sZq*CWFe{aUY~IXf(uvW7wqGNa}@$=T@f0{WaET^*4!t43NktD@sI8 z_hvx&(48f6(b4ADe0fTHbjqefpVC2PChj)PtRin&*|{S11ZkOWfbeU=U-{6@oHVRk z?yD(%?nL_F->!$D(!BHTW7N$~0sX zBDMS6bEE~F7$ue}%y=WCO4=@R&`whLQ2K_u2IXORJu-*yvds$zj2t_sZns)iyKaWF zgEsR>ETGUV$NtyC?4T~%jpC{U)9$*2`;$>>sUg_BrfICny-5T}qP&ldg+`r3cVC-S zn6;w4E7(V8pYkteNAY9d?+3HW(cYX7=cGVZ%j#M3e0h%V5h#wHjv-pFD7wzL@UMvp z9i-qdaUJ~_-MB1Wzr1f}YqQVTXU_jjIgRP{y&uLF$!qi{pBF$DpT2!>!Tr7;OQQe= z#j3|(V76s;);+c|!rSU`c3`oa0FAM{VOa*Y4sPQ1YU1i~k5by6a^gvg%_18Sh5{)L zD3HU<5%M?yi6N5%gwk5QQW4Y;BpWd5Xu3U=3I%2Ay#sDK^acneVWQpNMiI(^dIhE= z+Igoaq!=)-oQ- zQ{v{L>_33+kF#6@KhC@6&wB%cpcp7y_L(-+I%%Sh(3A%EK+Linu;VTP+n{ocWK$|gGthqG|W!XqO>RR6R^?Ty!|C>y}eA-=RSF?X*V|hiP7pDbVnY|<8Nk1 zF|2TQKE}`fjpc|cu6*70E%qo=-ujWnsL@pKhss4x_k95iIm zF7a&}PG~_*brQ*>L9nDzK-sv|SVnlH(O0lZ+uQbxum+8xq1voTmxrIzPDSNFkdgK& zT^{U+k-}vtu9AW>#x9-LFC~a~axbvq^7St16eRB?h?-JEORok|?F3bnJz+?MMqm*s zK%Hw#;}|7C=l=llAeJ-|W=okH8Bp7+gQ%*6rHu$Z6rUok70t*jl8CCna?34^N5u`J zB$RA)kGb`O)<;Q2xKfyloS0*@U7YIr-KzwvPv`q{PrFLanokexW}6btVvN2GBeO`N zOc%tN`_7L6Qx2P6D6?Kl*v6)aK))G{-Z&igODhnzt;vcafTFm1hodMjjBLXSC;GB2 z&zWMd6f1yr^`r%}B89L7V9X+5$?m(^jxJ9|r{Gd30Wg6b5%L{G0#cA%fyl2Q6xz~d z4KgHux2+=DN}@mF6Y1$eM^&{%)!N)*we%i3XwL!56sv8VRmN$IfG^CSNxA^nDG z$U6lN>$cmlsEglY-$lT?aKu$K-js8{dFT-=q~Jx6bLo)1M6sa6WF6zN9*fvagxRmj zjZygMN&%mMLyA5O@TnW*$cvl{F|w@=cv5xYu{1sUU2zW|b!!9bTm>f6M~V&t>e)t- zVq`nQ1RW1a4M*+uAV}dYQzzoHRkEHz)hJ8V8ce$S6^GTWW!Pyn6-dS&5gTAbCyQ8> z*4E%?yaOEd28KJ0E5T*LsE7;*9%5{dhMlu2T+9Ha@pDPgH_2i;pDS{;Y^tHj4a%T- zcOK=06k;t`%taS~FuuMh4BnlfQ{&PCViDK=j2VG6eZr8R^Ab^wDAj`-k*;q^s?^qD zLY81mXraa?Ra^%MJwq9uN$mIFg7${WqOF!O1B}W_K{*uf;pG2#Ev>Qx$|KJLXky$H zPufN$HIxWx6~Jr7PK!-s{((JSB*4FWC14P6U`P-Mu>XiQ|B2rIY2E;gpu~bG|53dK zf(ap_k|Y*3&fh8-?V%BpIyDX4F$X0T?f)0=0|o-(2eL)t;-XM4^2>N9IioFFr#K}! zjRmU9`tyQjrE*QeVsAmtI_&U7S;eQ7D@asp%D4NC6FhhB%Jt_3yoN8U@sDt6iG2Jn ziM_5H!aT*!d#nSG_|Q5xw)6(!hiK(6mi{rchO$F*gpwE?hIPb&TE$6ODmW-|Ndj{u zdyU)=;A*mtI2`f?8?;t(nmVWB4#K_*A~15rtXpeEWG@inD|}l%t%i@FkNN6{hMSJN08T)=&V}S=k_Z* z#_xHqBp2S_F)w)d)lz|K5(FPE^abVPVNqq6`ePjQ2QaG%v7zRA?#!GE%Di&TpK?_c zzVbP=XvqvQqp(?y!cP5!b7T@> zb9EHAP=Nb}PwcP3*Vpiud0aMso%viN_)stw!rL@7SDt|*ukAbhX2ruK;+FW}0@Qd% zCifrR99n=#m|Oe` zvt&uVUm}gG7R*{bh672=23X+;MM-Nb*x8OL51jVk{Cu9To^z~}H42q2Z4X>y|2iZ2 z_nziOR?4W+9^AHhc_Vv2U~pu!o3)w|lR2G1obMszLGU4BA__l@>_2~WR19gBjVWy~ zjo2%|7~u>5$SuFo%%P}edVVRpIsDl+TyaS=QS9Y4-9xNZ!@vYyl$7%i3Xsn-Lnb7(&ZM+HdDs3jcV~e8t6o09R@H z(sz25h!x5j7U8$#UzPI_w2)#0xpSv3_S1cdQBec`bV~@?>#qf7ow=7Lx#60?V-#nc*kp-ZQ+A7S$W?o0#$+4 zJHmq>iW{)NGM(R1Io-}I+*lnaZGP68$%z>1?%W3L&1%<6GYTIBO0F^2i-cx5u|!i9 zBHI_SMnQq9Ccf{pau$3rCZjFiJNzTql?7bUcgYq@J|v*!@jR2f#mhxSeg*Llz7`krzh}Me%o33?hCp5S!yfX`zdb6|v4|j#cG4j&F* zq?4_)+b*^n1!-me@PeSaN=A32@!LRM+vjmBABefa^DGMR1T~>9(Unw>*Di;4*Q$9-7&y0!>qlG9B0&}{mFmqe9?j#kv{Xmy(i^k&kq#=h z*#$pa+32ms>*a7Otu&x&5)=+mB?1UiR;Xekvc~mFybQU6_m0E&ARvnbIln)fqTJ6x zXt)_yaZ`#U)Yd^?lj7D!7*f_9hs3%50q7iWpuT#@S0= zJ|)VbWaLhQ4UR|<)!D#D->+;*L6Ya>AC+_#j*v0wiiGwVj3CRjw@tGm(#kxI9xQ5RFj+3Npc;XFK#Ry28LFX!7q=RWVyhlINHdVseW$0 zvBL`0Jam2O&%hlj-I*u5+=uI;k&WWa_5um1`u7zLKslSs-o`OU>C5)G+li+$ZE1pJ z`p6C<`1W#35UW$pc+@SlFt;j@CP%()fj~5@yelXpF2Z}v6<#p*S{e`#o;v!F=@1gK zG=n*+dsXvTQ+%P~w7zi8EXnj`P}V|Z3C?aUhBc_0`z=LZ7o^W^3zz=^3=gDOo2SGK z@tTy)M~!=htszXgeimf{pfMV3V%2OqNrm%nUp{mQKP56opHYMNzo-ET1p^C-2m$jy zeu)2~1~~xZzo?;Vg30y?NnaNcJ-jb`TvO-pKC{92nA$jz_4m4 zsp_zw?CWtUHVY<%vrxVZ4-HYk{H0XFkID)@TyiVXkyehG)9S#vk*LP3 z2WSQ;Q`q!~K_clz8sPWp^O+g^71%N)KUv`~d5j+SecfNXxuw6%yWA(P|6r{#EHge* znO#+<6TWGJ;jH)(yJukeBBO)%n>NbmaO*-kxiFeUD|f z+IjTyp{jXM$qRN<^of!g4!MG{rdjuz`ltee6f~MH>j(X>D&oRGs`!*=v@7D~)2k84 zS_4Oy?5r$TIM`yl1E#XD;9-}wCKnCS>AS1qU8R>z%d;*%$M@*%AIQuXqs#At?{%~L zY$UV-nj7zo0<3G=TWOoD?G#KHyct2&$md=o^Q4lC)nToplJvz%);JV7;?>32=8m@O z2@v>z;h|=Sbrea1GAqsEfgX>|f-zRta{5J){PW^T6a+mZ87gKSvg+}`Q&$9`CU(#> zp&5`&^nI=E;eE#;RO@&dQzQeQo*y@-(DQmK8=k*SYeOTO< zmhbujrX;lqOu>)Kec8DrE%%B47O4N*>`fm{0m`M0^{rP}SOA@m@L@$a4%5jfjH|;q zdo!oh0hd<--7!;7vW^DJ!+upSlQ3qGMf1IT+wd|kOhp2_K%M!XDw%MnKb8t99+C!4 zc0f-D9&!!@Gc?tnwI289kzcH{@ta%vZU_8IwSFzX*>V2v=}Z}_6(ISg=<8r@k3{nP z+yrq}qMbVWe86aG)-6d#Es98I^}o6St+0IZ0beW{0mLgy=@o$IP@{5a zD6bp|m7;lXz8vHKvpB z@nGzjjaZ=IZw8nyK%m!~)7t^Y`EoK=-=cpst6ID1r3em8xc(w*G`X!Fd0W6h`fVMy_pz3e6J#e>F& z1lCNuG}CD-NEiur$lBB)~9@Gp5!p|9dr)|%;Y#ks-&>`2P^RKFPo_DkYvz zMO$K1(qjII&;IQddAMvx+aftBZ`(0!$i`!|kc*9?iMa{)B|OCEG<Xa}vldVI(slAolUj-OzmTM`hf?L1XCBzNr_T%9|LzFVQTFhsW3K;(=aC zBk>16p;*}w4Hz9Ru>mv0s+2K8bhewrF^v(WYtKa`BOUBUD%1mF8I~aQJqHgujs;V> z^khn5Qv6+A$Qhvw5JvhoSnEPAXXJGb$5f_IOf%0E6>o+wOZc;W1n*=spo>#ZS>Z8d zI#4I>O3GBqSRxAwc9{Z}-hMGVdmQa-ejBR)j`C?uDBc}Y=6FAC9;TV=QytcWk4IE5 zt^l<6BikO`rDf#}3P)teV)rt}=fU5CGvHw7@$nBT;ZR$wQm;vA+n)?>oWy}3&x8){ z&Jc|mAY`p;T0l^+$gt9yhPNMb!^XTWye6d#HC^Bib_(y&iKH3&PVr3NTHicOFh#UT z3hp-?R9J^bnAPo3ecv15&In|6VB#i5rJF0gFRqy(T#s#cK8!8Uq*I}%CJ) zW1{-`HWoD8d_IcT|DUn}ZlT-DmOJ@{3rz3EUd5BUdlI_smI&2FQC1zrKWOJ~P@)U@ ze86R^B)UugG8%y$X{kE<=K14p@L74*SlQ|CuI-(`fG- z+1AJ>mmkm>ff;Z=yE^u;Z^_iu8DND&dOTCZgNFVD2I=8%AHn6FLtP$U`OGcM&_qUb z_}_8$biNATPVH`f7v_6=x0?5V5%{Kke(=0s0d~M$T|XWa`z%<05r-T2$HmiIXg-jV z-oEk6$1-VApMhWQ36Dn_g3TcuTi%|SGz}yaGmSj`c}1KDosNVKukt?YWJiR@nm4k% zktGGD7*d0|mFKqopHp^8&yRm0b@%XaBD`g+1FS|o2OJD@m$nVdgs-}s#N7hoLf`x` z+j&U7?7!Q*!zy2X8c_ZLhL3JkKRmlcGc(Vh^ERIUhW~KFR9Ss?ZY$U`VnBO$+=tp5 z7(oi)P9BI4K=Fdo{43CVOr+;`K9QO5LiqgraufX_U{~}0oTrnBJ0ZlqZ=RVYY*=T& z&wX3rCmta5N9Cm@yl(CuLt(>XNRycG{0oXq_3f+E!}W2r+@b6JNte*OIT>aDl~mSV z01tPBS6FkWSFRNQ9STr%IW=(aCGSBP@uGHn&w(^PeenKH>Y2*z!wC)NfY6)nI=&|S ztr0IszsLQk3!u!Gpkp0 zRU2A4tz7+m%^bqB(_1@x$su+c+y#@^U;Ww~qS(4pnOpbs6Zl1Ix#Ph*ZGf=mRJw_8 zjHQEe5@6(i!!eN@X?__$@hzYRj-vmx5^XwJ`hv6-wXwB8kv7h4rfWe7=5>XaROYb9 z@Cl6&^dRVZ?$sf@NBU*u#Y4iBd*904DKq-kyz$1fZ6zU~Szkj`?6GX5*3L*+Z@_d| z?~L+R(dVi52wXP*qvLz`+c?UjpD`rmKBEtQ=Uc#j&o{}(x6P;W%gstf6YTx&^8VTe zoigv&D7b(qVetdcl8-W`x|wCcALj?;uj_6kKcjSiH9r~+KU&T-BNScSKIdF_3?*!( zGl=Xe)_nF|yRJHkMb+$V29Y?BbJBA06f0w;ualhwG)7f+YeqviLRS8~!%w#$t z_6ZVlBJ$quca8jfb}{?CpVmR6AlddEGVcp7o|&jQPSN%!D$hAzGaIO1G!P<>pOpQ| zRi3Sxz6L7%ockiiTFp^T! zE?Qo@fJqrt4CMe6ag*z~KYdU29l_R0+oM5?cJ!22i}EtBYLT|6a9c?UG zGN%hoi-=u_p|rvjR7cT?WCbAzUPrVR`{+3Jp>JJ-Z4=ZwT^7=dP$gl~oM~C8>UC{J{=#;Y@2K@ks=n617o|~JX(AX%u-S0-<;QYE zFnSMirZ`&5fp@w4Bu%)@XHgirb*-W&v7i|M`z`aW2D?I!j|Z~h)?e7doR+u1l*Xfo zIM)f0bk{E)B`0!$IwHmko4Je|Qd{uSip{vUGs9+=T-3dZ06r#dFAs+}rt6im8tGVOr8cSK-2@ zrNF`z=6I#AyO^g~CX}3-DT1MnXQye~xp*S6rARDP zIke|2T0BrV%OOe2epc`zQVT4jc1laCSy1-nM;%$t9&@UfmG_xpEXv6CE|6o~*4t#f zgBViIXec)C6$xQA>Evt?@l(F+5H}FHLPO{oFPlbbx%?DR(@t;^dp2;~41MVf3zicPHt-YzycReP@`UW{hfH5{u+{AVyNxgvfJ-BhLWpmCg{H$TX@ zlp9Gh%YLo|9%65@RS#Ys1*H#Bz1i)roI?VKRra62>W`d3rgt@s@`Y0-Qr z)bu3OAs=J+@?^${0TBTfVISG7KWd%WyCFsQat8}A)?3V#F;ymCiNjY1Q&Le*2`a_m zIfxN~nqIteTt_kn}(GqWZKvnyIZV=$&- z^om=mi9w6NV;4R@*Xoiki%b$;=xuh4QMiI0fkef4#%_Jipf9WlHkr{ni=`y|3J@l$9KdWA+@u$^2S~Q)2_5vv##6fc`Fh_B67OM2bIgBx&&Yj$>2*OB*Aqxd`I(Cq!U zpiXj%PGa(5NcI|X9HCyvs0c__y(b(qLR&xRc4Nqp&T1mQ;RrE`aEIbHs(y2(`N&h4 zbd^IC@?uUpI8#9w&FgbyrB0@G00h(nBAcjb5qjf%R9p)kH5Xo*zPK{`3;Y5D5vkbo zZiG7GRAhQmVU*a0I#+K5sxPf%u#S0Ec~MfmHYJ6fgm;K581+8Lgr6@;prGm~tISzb zVX(0CnxRlAEUfZkDh%b@&8Jp_Bto3;BAtL@-&QIc4;4H0%l(%mIAbPmRzs+~H`uUKjuApY2|YIn;-YR@pIFbA_lGRU!S)5gOup3bNZ&M8_-l z))XXzFEWlTGI>3U5zDxkF|_-oOYt&&ui$u)xn8D}E;=t2{b=D@w6QS?-mapIAwyNR zcy*1YDD-zRXosICRJ-=_FZK4tH!KN8vcFX3CaYn@#Y`_oF6|ke-ZWIL=8>pU04BnX z=|A%UX~A+tjN=7bj(o#1;O~egHiD=6PJ+%T+o?JGorH_66gakXQgj z-yg~@x(zcJ_$mT#y@*-kAz!&yPrR}VJ>}kYnuQJxdvnOWig~@QoyNWJC-BvXpue#8`8Hbc2%WtN<>l6DZn`r(PW{OsEmfeJyt;AH$+*Ui-XXq%Lim_e|F*t$X$ zTi{j&ge}f#*^ePpMaI$`*-Pds zPSvnHT%{_teRJkJi}Oa@N)uPaIeR%aE+R`f8$xqquxTH@M<5}!5tlZ}xnejqzE;@w z^_@k4aYn{-pOJ$Uqw9IWv+;NZ$}pL$_C58W79PH=cT3(cH4K8sEudn(CQ@Y!r8$48 z(#u9B5lmmVt!;f8A2LU zE|p&Sn_{S2b>ONLA4|`Ccp$stdyaV+oY#tu$bcP36pKEL8X0t|4BZAO&jAr@m!K>` z6%R5pc%Q1x1D>w93Q(=b3u?^C9DrVBq#L1d*Vg*bcmp?ghE>#Mt?q=$B`9RsnK;Bc z^%FfLw(PoN9}+0IcT^7No3^*=1qs)qDHS)Q0$qk6=0`m}M9n82Fad3oz?w5X#PYhm->3+fE_? zS0(jK3OLYQqoH8Q#zD{^tO|)1;lZ-U==wmybhGYZ$S%f9k8apKwvaXxgeVoeql1}7 zNt!?;azhi);d-Y0Dvugn6xkZJaX1l6DE}btSZPo>C@~vw|CbBYXZwsTV1kyPWI)&>sk2TDLRm8)c`0E zwq5(uKY)1v77@X%7$X@@4jb3rQeOuN((-nQR+0eQ`sGz2C!UrfzfxNI-ZhvOzc?kM z1}Sh84}jn+Mzu!MDm$pF$pkO`yK%ocEva1Ox4rw%VIJ&QbQ{MLZN6gX9(+tq>u9%f zWy!%E>0)X{+cTAkCfzDj7)cRIFHVRrE;319%8cDNe;Z~`#JsyRN?zsGZ!!K5cg_|> zpV~=W)bt_#UHXEJ_C2#xp@VqVvZBPMH+0t>{P$NR*18(K`Cvc%fegt3_vJaQE7P^LY+Ec-@&r;_~kp)6GE@8 z=5VwB1>f%zO@#>z8K$?leej4{j45~H2+^J-NIjx6LyyX!5c`Vt2Q8~W)Nwxu4{08` zx6pw+crHAtb{>=F%3+08;bh^g3=zGNMO21`ON0?nGhn{RAaiX_ZqSAwwhDtJ(Pc040c#7xbIs|w7Rn}k zYkW9`R|7H9@@UrlFtk%07CqL?yA)>mkj2?Q&Ec!~gDjd%*MmQ#>MOIoD~q?HnjH8D zXxCDw@_*x+&?MBrNFp-SbO*-DPRzq)DcTFg^J0wdDd1ZC1Hg?;(=6FT%`?v!FNZZ3 zc)?!dH+HYpvzIgd0gb9MCldCXG#))hzR@IMpcFj?)4SedrOP%w@@Q->!b;RPD%|}6 zL{#a_?hixh(P@7h=h1~s8Rl`4RjKUN*`+|vg4CbLiR^5>_Li%R3x?58Kk!t_(kFjz zj(WCMQ^J!Hmxe+C6q(xaoaqi8ikh4oiOkpgjM)-$vN%djS)g8=dJY$*_9Dp3*V3JD=#C%@L(qSPOa$iItiMu!FErw9_cBoY(?dde(Brb? zGt(rs$fnBYaM;o2HU1sMhAgkJFkDy+t%4^ifXS`ZxGgL%p%i>GkT5Y3;wIVdFqwfx z0){i0FV)bEk?h?xBp_>tf-XHoyO;GwU&A+7L6kzYlIHMqitIx=amwIk-?cEYinzcg z`OdA0k!C5!;`3yz{li@4s^FBcd1079h6|n*8hg!SduoDOg~Atr)?f6-BL~vAQMW~? zQEFA>EKg_uU7lZpS@oJD8+uXs49~X!whL&AsKjR>rb!z#w5#=crtIIxz^sw>egcs<((EBolAj z;~UBa0)n3S#9P_Sf_#s#aSmzZQM)8ZH!mOrcr8$%Mo8* zhgOABkTlM<3{pwS7~XH1tQ_;>MtSJv9agQ}wc{n^#M*2J)Zt?3fD7mlGVu@wmoBWf zu~^&2xtXM@0^(jG%nPd}`3sdlY_*WbM9dmSCZaUN2GD`%h3U3*iUpEb2=4e1IDmA( zs7dD9=z<8c7@0AhF%jhX`z=u{J7Jzg{y0sJT9+0Ok5dn74fY*TCQh=tiF%JcRFbjs z(yYl{<#k#`4JBI1p}C?G4$^IMzcwU;=qlJNBUA0V!JPSmM-n;^pj=%$tr|*x5FMxw z)lpfnKmj<+Z_gE-WPTiyv|F`J!MY{ zzi?NP1P~H%Q2?0iq)@+h6ZfvW|49rx?60ct^+yDhxXb*And_^Q1L!XXmO})B@ikWq zT14&B8{OxNJ%Aon{qSc{OurzsxjjWJ!zCNn&llY*25}Q&HV9zskeQGe?W=)&Nj7uN zsHZkCa~3#TCyK zg9)MNf!Q~KaR$fVPly?-$X?g3&p^suVVV+$I+tapYsb_UcP1GwwGELevce!nj8LCL z8lW7t_XYjEjc@#pNVNeFRhEp=RH%rAss3UuHQOpYL~M2~3Kb5(8F z<+dNRLrUyo6${%;$FExDn!1J1XSlAxICazJZd~XRU96Fik6VC5229uGoG*#rwuyXO zAD7ViI^AJ~s=Al1h=G!2^=AXIQAxhp8hy=!(6xtAQHa`*qiJ}TmgUj4ssYj8memLT zK&yuL zDm^IPw4BDBCh~%M&{lVw-=#4y#h(%DVYQIS009@gDv?&~7dfYqV)};QU^BIm#-Wyj zAL}}UZ$B5Sbn>lY21*{j8FJ23nwjXdeOEs6vP0ZDj6tEJK=t3f7ng)ji-fT;XAve(#${#?DikRyb zA;o09^p-H}Qe+LgM<|3@Hizv61<-MZq)%2Y}%GZ-d z7f(YyJ^n>Xwvdirzkf2Aemn^;%aWIzV?4)}vRMF{fb;v8+ONEH$3q`R`YibfdbsqYbck$eu)D)0+f!M(TlmgPEyKxn>& ze)j3Ke;JH$&#yeF1`mb&rdHY$Wgt;Bt&YZ=kkI$8)G1`Ip$&dLR$ zcnHkwyPl@9%}Z)hB836(nci30v=ca*y7?h(R4or^=p_)W&VqVDQ|_b-q6%nt;yP+m z@&M-i*jI+K4RSfT%H=1TTt|Xh`?_uUa${8)eP^1@pz?avB@z4j=xR03`3g8u690by zWabnR8CuO2PztFGo@)6Rcld*J%=?RE24mo3;KaOTO73d@-$)GI+|s%t)E zdndqYxG}6yTl)Jv6MO|(d%Oa81Ckp>@Yxd|Jf2O3glL%--WaygSE%u-jpwfAjPEZ47}_HroYD z?}*-Xzi*}d&6XG5xz`ecbUr}mQ6dNmT54TL3Unl*X@q{Yn1crGjQAtp{e+n7Kh!6I zzjBfmYRmI0;d-_%zMx$(VK&ac#mWfOkynC3R3TFYi;BqbxeQDSW1b7U=i1%fn)TY5 z6%xyZ2MsJUl=_f}BjXOi2n7kOC(>ga`e0XUPQ_x;O&7!ill9sJ9=cb+$uR>zvT8>NGO&i&>Devi{1pGZJnp*!?4%3@EY4u;*tCgesLtgNE6xV=hMo z*nFXL5YO8wItm8#dPcQnkDk+lWypta2%S}5O4sgVifT{-ZR4lK^BJKwpxJ)&q}7tm z@~DJ{P}@+nllEri|5~IUk^O!&Y6`FT575Ut?Ox^4kmY2@TiiNeJB|nH2ZI}a(*vol zq)FzGLwLqicGg}@Ol&*pBRyd^fk2th0S)>b(Es1$_+r~dj=1c_KDZ8@eRm3#jM?FXm1<64#js`EOulI^E#ET8-3EiXY z6t!DP&OY(9r%#hXgp{!|~{1Amr7(LJ51a`$`wro6z&VA>=!;6JoUb*^u zU>HvD-NH*uDgx73XjHv12>Kxn6|$G4g{tM9o{d3!&@?BRMrCLiQl%lp++;PuRPh=g z$#wwpG$Cc6&kuMy(>bEO;#z7I&aoLR8eW*R+neEca1Gc)^c9)?3di{ys#JDMFki*V z)P{c5jW|oqHZ+H@dtVf~BG?%g0;2*pYLAhAb#KZSn*+80QUfau=8=E{TUUQ-x_4xt zGHl+~4U#%R2CJ{i*U1ON?6g-_zrbkZl2)sl{^}GND}`j1AK9du)pQf6)mxb&u(9XE zMcqwXAqDhD;bla3=#$>q(AcEj#~h@d6cYSmU@)Er(v|zJ2s4_c!^8R`-z*y%8=+hU zGt$f7bLU3jru{mQ{bTuGCD7;Aug1x$)UzgCLFh8i?5h^qg^CI-WipA39-Uouw92ft_yn*jVlQG5A(y zrH?>k^QTZ%NI*eM>A21r`)`wlwVM)lg9j>n5{XR7Y-|xNj3;*px!8xI70Mcb^>*vazy0hy!rHN?P(II9t6pIA9ZJX{skh*HnhcC;-CLAX-!=(Vxbv0L)U;~gXD{C+`6O1U**o@lrcWJ2i%do;cMpO4fZ;N zX}{nH!3LV;nXK_Wj|(QH*D-cXG$PpWd+~bD@%5KCwuA&ue*B2IaJ#{=l`6MXq4>aB z*_y#Lwr8>BT4s8N^+dT4AHD`}$6CI#5Z#mz6JNsLkRD&dioStO-3IjIDBKvEb)+86 znko7>p-sssqrqFp5GcA6L&vCG&HF5u#|9j*=^nhHYz z&ypsDOmHQ~0lkYIvyzfcAkoFxmoI;g$XUn&^DE3@@-5eFCBJpGQ+3kY-9?C+w5{4o zy;zu|YNeRd => { - let filename = req.query.filename as string; - - try { - let filePath = path.resolve("images/full", `${filename}.jpg`); - console.log('FILE PATH', filePath); - if (!fs.existsSync(filePath)) { - res.status(404).send("Image don't exist! Try another name"); - return; - } - res.sendFile(filePath); - } catch (err) { - res.status(404).send(`An error occured`); - } - - //res.send('Welcome to image route please add parametres in the url'); - }) +const resizeImg = async (width: number, height: number, inputimgPath: string, fileName: string): Promise => { + // output file for resized img + let outputImg = path.resolve("images/thumb", `${fileName}.jpg`); + await sharp(path.resolve(inputimgPath)) + .resize(width, height) + .toFormat("jpeg") + .jpeg({ + quality: 100, + mozjpeg: true + }) + .toFile(path.resolve(outputImg)) + + return outputImg +} + + + + +image.get('/', async (req: express.Request, res: express.Response): Promise => { + let fileName = req.query.filename as string; + let width = parseInt(req.query.width as string); + let height = parseInt(req.query.height as string); + + // fetch file from server + let inputimgPath: string = path.resolve("images/full", `${fileName}.jpg`); + + + // check if the inputFile exist + if (!fs.existsSync(inputimgPath)) { + res.status(404).send("Image not found"); + return; + } + + + // display image if we have fileName, width, height attributs in the request + if (fileName && width && height) { + + //resize image + let outputImg: string = await resizeImg(width, height, inputimgPath, fileName); + res.sendFile(outputImg); + + } else if (fileName) { + // display original image if we only have filename parameter in the request + res.sendFile(inputimgPath); + } +}) + + + export default image; \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index b4f1c0d..8e9392a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -74,7 +74,7 @@ "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ /* Type Checking */ - "strict": true, /* Enable all strict type-checking options. */ + "strict": false, /* Enable all strict type-checking options. */ "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */