From 67c7b5ec44c4729e1036c4cfc7748c36fe5833e7 Mon Sep 17 00:00:00 2001 From: Cedric van Putten Date: Wed, 27 Mar 2024 15:22:08 +0100 Subject: [PATCH] refactor: move webui to base url `/_expo/atlas` (#16) * refactor: move webui to base url `/_expo/atlas` * refactor: serve atlas on base url through cli * refactor: temporarily switch to patched `expo-router` for base url support --- src/cli/createServer.ts | 31 +++++++++---------------------- src/utils/middleware.ts | 5 ++--- webui/app.json | 1 + webui/bun.lockb | Bin 471565 -> 476996 bytes webui/package.json | 2 +- webui/src/app/folders/[path].tsx | 3 ++- webui/src/app/index.tsx | 3 ++- webui/src/app/modules/[path].tsx | 3 ++- webui/src/providers/stats.tsx | 3 ++- webui/src/utils/api.ts | 17 +++++++++++++++++ 10 files changed, 38 insertions(+), 30 deletions(-) create mode 100644 webui/src/utils/api.ts diff --git a/src/cli/createServer.ts b/src/cli/createServer.ts index 5c73b7a..d75a6f7 100644 --- a/src/cli/createServer.ts +++ b/src/cli/createServer.ts @@ -1,38 +1,25 @@ -import { createRequestHandler } from '@expo/server/adapter/express'; import compression from 'compression'; import express from 'express'; -import morgan from 'morgan'; import { type Options } from './resolveOptions'; import { StatsFileSource } from '../data/StatsFileSource'; -import { env } from '../utils/env'; -import { CLIENT_BUILD_DIR, SERVER_BUILD_DIR } from '../utils/middleware'; +import { createAtlasMiddleware } from '../utils/middleware'; export function createServer(options: Options) { - global.EXPO_ATLAS_SOURCE = new StatsFileSource(options.statsFile); process.env.NODE_ENV = 'production'; - const app = express(); + const source = new StatsFileSource(options.statsFile); + const middleware = createAtlasMiddleware(source); + const baseUrl = '/_expo/atlas'; // Keep in sync with webui `app.json` `baseUrl` - // http://expressjs.com/en/advanced/best-practice-security.html#at-a-minimum-disable-x-powered-by-header - app.disable('x-powered-by'); + const app = express(); + app.disable('x-powered-by'); // http://expressjs.com/en/advanced/best-practice-security.html#at-a-minimum-disable-x-powered-by-header app.use(compression()); + app.use(baseUrl, middleware); - if (env.EXPO_ATLAS_DEBUG) { - app.use(morgan('tiny')); - } - - // TODO(cedric): replace with middleware once we can - app.use( - express.static(CLIENT_BUILD_DIR, { - maxAge: '1h', - extensions: ['html'], - }) - ); - - // TODO(cedric): replace with middleware once we can - app.all('*', createRequestHandler({ build: SERVER_BUILD_DIR })); + // Add catch-all to redirect to the webui + app.use((req, res, next) => (!req.url.startsWith(baseUrl) ? res.redirect(baseUrl) : next())); return app; } diff --git a/src/utils/middleware.ts b/src/utils/middleware.ts index 5ff0246..219f659 100644 --- a/src/utils/middleware.ts +++ b/src/utils/middleware.ts @@ -9,9 +9,8 @@ import { type StatsSource } from '../data/types'; const WEBUI_ROOT = path.resolve(__dirname, '../../../webui'); -// TODO(cedric): drop these exports once we can use this as base for the standalone server -export const CLIENT_BUILD_DIR = path.join(WEBUI_ROOT, 'dist/client'); -export const SERVER_BUILD_DIR = path.join(WEBUI_ROOT, 'dist/server'); +const CLIENT_BUILD_DIR = path.join(WEBUI_ROOT, 'dist/client'); +const SERVER_BUILD_DIR = path.join(WEBUI_ROOT, 'dist/server'); /** * Initialize Expo Atlas to gather statistics from Metro during development. diff --git a/webui/app.json b/webui/app.json index d0e7e1a..1c1678a 100644 --- a/webui/app.json +++ b/webui/app.json @@ -8,6 +8,7 @@ "output": "server" }, "experiments": { + "baseUrl": "/_expo/atlas", "tsconfigPaths": true, "typedRoutes": true }, diff --git a/webui/bun.lockb b/webui/bun.lockb index 0b8e24d9458b29a6e28e8938af3534275e61e061..d620a0186897304bc7c9bc21c92f4e29a6b0ebb1 100755 GIT binary patch delta 64808 zcmeFacYIYv_y4f5J)2lRWK23K~Zq4M=W4N z0lVk}s3=&_pol1n1r-$w0wSOSB5>cIJ#%d2RoreK#G>TRG{G!S`;SxAnyy z18Z3N34+RBh*G)= z{O>A?Rxp}UGALS6DTc|Q`G9Jmz~AiFE{?-?nZJtQEndy8`&2btbzXg@G|ANYjDH(-%vvM6Lo|)G ztJRx}bt>21)^~m#Q$Am#&Q%$?hEwd6G(tiCNVJOOZ3PQlQ{ni6j0psgQ=^`#U?fxq zJ_S{S(T1mH6=kX7tio17@Z67^WbjcNnZH;Ab21AiXSQ>k0PluE)_G=NCS?>BO{ao_ z%o&9;vSkC)!~IZ2NK!*HR3ohZ#O#@B&)MTIi*4lP;B}eR#@`%UyZA#I(_o*V6QV0@ zX9_YiCKOSo;`ye|N1^IOZA%M_=45AL#Fi$;_*bBE&f`!GbK46I-UO;o5<$&KFH7$eS^FO1s%bnYk0eYb2ZD+X9tWUx8v? z$rDfwXI5cGK|#hGCo6YKW6oc z_2uw(7vrtnogIg9E_ofQ!F&uVtvX?2#&~3z`CmEbAbK(@x|E%}CaSwnk}o$bq#oj= zq!5Z+Tr$#}YJpODomD|b?!V~4FIIywi)S3T3a z8-steG zB}=1v4P<7;|!AAeatMUJ(0Pg@ahCT|FAromp zV{{#|TsaOZ*Ifo}1^uAEF*FWY9?7}hagw254>E>6NxlqOZ{@q7sy7d+`no~Y@rwrG ze?|Mrfu_P6D5#!)jI16!166?%sK$7x)%*5l)6mRY%q+PGTpj5|dFh|F9^7T=TBr=@ zM#t3AhENT~@iYpE8EXrAP*t>=>Cy!{4VnsV2xTIa4B|sU`pgouIz*3n-cr9)rG_2b z+-c^1UhafUmI7y1K}LT59LM?R5jNX5vCPt!oi%w%(S`ofO10CXdrD?uenD1FhI7qb zX06Q4o0!>ZVphRQ8r7cA%NlV%vS!45Xcg!i_n5ie#6MiAk^7>bm{7a8>|SGVwPl9p zx600&z&Rb7m6KKE@ZvvgvYjti6~F4eg0LOfY@~)sVL*@)gXi zuM@Mgax)J-WIOk;Sr~JnGT?h~EogbZTe(s3*N+->CsbzVWaZ$h@y=_=wUD2H)`qrS zX*Ts)`gnh}F}sj_;p5F_;cWH4tz0{8GTQ3YK&ZMgeMaUC1<+;4 zc(G*8QwDE|tWlbfmz&EVI4MutQO%%RGYYcX_*Yh`UAO8p2F=WDH7Tp0uqb5Zzy0Y| zYNvhstf_1KBc@B)nKLuxg2LyFJQb=ohLJBzZ+zb9zX#RGW)>9W6|~BnUFh$qQoFd* zT9Z46T=gKw(uyw{*@3E-yP+DsU!bZzb9Uy03|hVQB{ML2xtT?box=cTO=vYKw-{XY z&4fxn3#x$_3zdgndnlOc#U=k7q4n#`ezo9bvxbd>Dz2`CYN@FURs0>@U}pYD&?d;M zpe>;#P~{JTwt}{Vwt&W1{Im5&ZxysH8+yruSfUD^*<^ZJn3*$E2Z6@Eo7kq4`-VXe zZZ`YzH&6x8$58dJ466S8^`^ncXX6yE8p;0D#139`+Lrm3Ce+T@y~R|va+7h&tcOe= z{(8q$R%p(gPGM0-(F_h`3*R+(G$3*cRkb502g}oJ@-;XI%Z%PPev@i#I{s>F`yQ&? znHj+f;e_5drk;4uXpf(x+kMA*6}@KYjq*#YHOk8Rz}U8bo0(BL(^$Fk*>JX-6*DKJ zVA>o?MbB%y(Nkb-glc@AhE|2vW-zqvAHw+>kGPMFUSUx|?u;DAdDBmtK8JW zyxd7y*_j`GZpud&s^^iLC_hi;IZpm=xs&75I2ifsYD+sq6;M4aEv2CRHyNsVki}T& z8vnJKC(%u(yUl;}8{_B9+?m0_{BC6R`~sUF1C=4AbgYrTvPN|;6;3UN{mnIM7hnFJ zk(}>Mxg*FbpP5_4Z95Mh3JY7!nvzlUo@>q&FG6dR|My40cQ|Jk8iF{B2DOvo;rEe9R@#TcGnkXeM`1<|Jzv(Zy` z+Z{0L;lH37xt|V7W<=hH(U3n2RRrGwZ451ho(CNXtqTo9rFRju9<(x4o`{8N-aSgi z)g>P>4fKbq;iy4J51Wx^3(IUplxAaCrD7DWfzgy22vtSB|1dp!1?nL`3zfy0v-9)R z({{&<0nsM{`7?6oOyJDX0$loapovfiS_k@H#q7irtkDT5M1yvY|81>iS4OvjO@EpG zOwQ!qc&6h#k1R8z_oOS3t0CX`r!jYSPIfy@zTf?{+Kr0uKW&W84{m!vPZ@7aKVyce z9aL?nIBwAC3oTxTtoVBzeR=tQsGRc8@{7RL$$2quKo4Vutos>?6N*a)$GX8p`wT!6 z?gOZXqch%A1342fXS>bL+z{sm-mMcdhJ>IR#!JD~@J7n1p`3DV5FR6;%AZi)4bHe7 zpskQQf;WL4ig#HUiK{0mDE}<8G#YsSZ{w|21vePh5LAZMsq6;#F@Jk*F#Knb6BI8K z^UT2I`-kh)E*_ld2L0~|mE+T^nSNXem3H(&Pf=!$j=;{S>PBx3RP!vFKQS{~LC8ro zCwOr6Mh!P`{P{JFer>4ywg6myo&`nrZ?0R{`>K{Pagx8fZlmJcY8%Z7Q+NPc;5e6K znH<&>s-Y~%oIWF~Aaio`32MQFpke3Dy2f%IJO{vfWVLve#cSL0tl=tKSP@x0jIIcI z1sN(=&53UIXE$|!M7>7Ea~hby`MatyqiI7onE&HvWMvm+y9FEnkmfXbGv{8l)S!<#+6wZF*ZUuSpz3?hc#t- zw(|tCqGLH!YgXHq#^4*Fl{I@Z3g_fbn3h#^7Yg#`gbe;o$#j0Y*eG_s#PqnZupo$n zUErGLTcB!qJyZ>>viO5g8Gf71UjS9TH@7x=(e-GN+S9$~Oc=%eti0T5ikEC_NOD^< z&&T-BpI3Weboogmw~gNDUTQruu${1|ohv<17GnyzDa zvD&G|l#HpGM2<6~AWOTU^Dua@pF`DbC8#|1R~NG?l%u>>hm0#s`TkJJzyEG<>$2jK zs1Kq~{G$6-)R+Iy!;@TTU>2M{(7h;>ugIW>Bf>-*G`AJGHnM#cSMo8q%z54B zKMR%PUqnycXg|it?UAL&nYn0Aex~!W#ovJ9-{O)cF!D>wamJ7(Q1!bWR27DxGGtkX zarCca&0MNQISt4$j*6O7qoC^dKO^N!a2;7+hBkrT1=ZuSB4}fUW_K7_+{V(2CK&?~ zpmOLRnTFmy+BCceSq5!|s@&em#?ULKn1N^mRpd0FJ`HdTRA=NLDKA6bhRTq7Q(fo$ z%VDMf$OBJ7)q`uHI_3?B$^$FxP?TEN4$k)5o!_+h$6RCAHmHiNg$AcXi{Aj%h)uQl z0I2l3KovmEpt8RKR3m?RfpKW`UF!H5h2!()aB?g(BOQmHM)G7%Fc8&Co`um!-3OIJ zh7_&+<@}}%d;RqK^LLgT^x&+TX+I22xbwpA8{Ip;;oj!YEIIk@&r@ek-1GJg$5!qg zeE#&kgIZM2Z?^3B1=qj*{;z%O|M7g;${#Uz6gE zfJ+T3QMrhf;`|*wlf3Vcx&}>RjoaGy(!=glKP^4%J;oTQep*XU^7dG%oIl{BWH-UD z&@WYb{leZV=DK>|_yf|C+yj0YSWAYh7g(&H*el7q1xfA41vPE467~L^9M78Cj;t6z zv3HU;_N*jBmm*n5tw{>)Md})Krzx?T9IZSw2C0*u&@08g*H0S|b}#lz`CRIk4G4RC znI653X1^q_HIqd3x&DrRNp7)UIxy@V1e+9Kv=|!1?C9)o>z?A?;inA>dpnU?SFCk4 z31+#9p`!dS-y0l`d9{XLp?7Mi0%6%+#)VShy7}pSQrrc;HzXX|g51?l=$+!lGY8~P zH;9OVe%X+)cN17Yu(+W6JCWL&=6WP~am*o0vh zIli8$p5gmD5H$8gIaa+ymP(oUJY*%}JUz*6@0X4Ydzq|H9fJ0krX_hRkz^@@Pn3L% zq$nvTU$~9@(otb=&UvO~T;3xo^fXecpU^MG-S4N34!d3aQa*5=$YhR>zARi_FODx zesdO&uYB>D$RtyfP3pH7@l_$A!HQS&~!0ss$!C zKHt2i3M6-spOz8!o&u8_8ETe}AN?}0CKnh-IKCPgf@I8=B$7$AVM;b`!a{i9d zNuf>`qUk4$N%3aF$r*GmJt_1d($)U9(J5Zzi%fvT`f^K&?@bJQo58L?mzgp=$#a{U zK`ZYo7?O}|Krtkfk%I7cSNmz1;m~1Z+UuF(CGnV3HUg=314(r_zQVw5 z&MOrp6DULcvPr>kP7Zs2kdsDEC|xDj%^%g2>A{d^XKf<*#CBFGxv7in-+Gz_S2??y*#?u5lu6;tNb!@_WNFT*zNA8 z@mcDZW{16ZE;Zg|g(v7v`Cd-g>w|GBnHVe!H(05jzw~Hw{AI>;Rt${oiPQ~6hGtrj zr9PUtdDAb=4SR{qTP?&j@8yNv6@FS?*xN%+e{vZ2(Mev~<)&9maYkf0(g^Yh z@E%DqZU?`2ero7)CT_ByK03wC@yqhV-T`DqI&<@hWH-t0Jv}uvG>Mm-{hznrl`e4O#hxnxhEVE$h1vL@Qb?CXmITT4uag*bbv|^dv@^K`sAHf>x z?MAXS(}fz$nJa=kbzv})CK2U&C53L6*0 zkWNgMF8MBkeg_BLVfa4IeD@5o3B zHDi?tDsm_LWwU}K!t8L2dxhV7c50|QCgMeQ<@s>xnVDqUkko6Y=eA_`O27A<)KEHW zM=*IqrEqM1Gg3nD!DadhGg92Pe%jnHt5oUSaOi0w_Nu_!zrh9G3pTmde%iHRZ~9e^ zGl;qy_=!y5<49V70?AGFy?Hvzr181dFXi)uUp6lsYR`t!#a}#6`&ioiu=ghN*;3wV zBz|m-Q+hDgXQdC3WI+%-Uge%=$Bzwm3{tzG_e6P$ zgewHA?K80WSAJq4IgX@qg#45wuLEnvzpc6!Nh9qjh`o1^v^a$P9etDI;j#lkE9T8e z3@h8`((EMfEhGg_Re!*sB=@xMEeI2)X?)({mo5m0-k_(wf=#mmwU6)@Pfj6>(iVn8 zFCY()921-FZ(W!g%1hU-O0a|)j?}0t{@#MqUdpLWV}YdEfUj6=TKe9NVQ=!Nb0Rcm z?I?fiq}0%1z;S-U{hi}R6Ka0KtQ2>TpLSC?lyZ&ZO!U*|rg%@n$?#Axi+(`TOfjd2 z`eV#;$(b)h%Vp`!;g||z{jE2ry6L`mORy%~5)S=1)^W!8+h(PNx{YJ?6z44xXG~;$ z`p{1+4ad~X@E4V)daq^hdW0EHgks7u{^%yFKhZ38pSo2pnCR>g--TJ1Nu~X^e&^vx)wv20FDH?xvu+@z^=nU~sts*E`Q~rigRj@ynKmL-q2b zb=?kklhzC7cj=ws&}-8JHxY@C6!3Ie>qqDmT(0W&rWH~*9Wu+;4@kz!Aw?XHgO*-_ zD+=ms_S5cR8qIc` zTY?&T&vBgV1D*HaOnaAN&Z3~-ufUl;Uf`ES!lApb<*TTHP37m=oKPOzO#$`?+@he? z;`xqqgP(p+N+^~w9UtUo!c7fwx5G^c+H6-G4AWhm<6y>UB8C2jn-{3fF5wYbpmq?h zB&cNN^^W5!&O*rxzA$whdwX0W9X*&-b3NghDCufv~j_$@`n6!BbCtN#{72R|C)Zcd#`3+oq+sulr?>guNO|&Em`n zqkED!&`O+OnTJb|+R_Bez=|Yq6OtB1<}^#h?>3KcWQh;oX_o)sJQlhcsjZ)$krG-5 z$1T^8&hao>_gLw;ExX81TN(Cd`esrxZK>h~B%Kr3Y1s*WK}roIodBBqX^)4!Nq3!H zhkGW4?nPqXy*0&i?>37KYg(VAP!dv#zinxXTi};I!9swnmN^>aB)LEM-m0+LUlk5b zy(c&VJe=b0^vhO-y-Om|Hg#&7ie%0$T9TeZQs>#3CUdWaB*z3TdR6Z=CnH)olkBIh z3A?^NLp#CEom+!tQEn8RIa&B{9Rj;JQhH@b?E*=A>q#Wpj62^-j=#^i$uzbYsViA# zYu%2dO4z6<7P|lJF2GT%50W|%XoeOd4Gbcn$^)9f%%PaO9`Lu`m>T*Wz-0A!FxXI7 z6JCTfGdR4QgTD%TK3oA6a*iFD6bh{fR=tN(Vs2gGS9mDZJ?VSTg+nJEQU|y7ObJ~| zban}jnYY4q_Y+>|90$`wj{!op9$~KwGUvh(keop`z{$tNNbjW3F{H}^{NSTe-|HaI z*?or84Jkg@n9f^cw!z?}>y1WI)Dua)lf3(o6lF-%vJ-uE$+$-1QB3)rrI8MKg#3{I-b3BYSrc-uOpeb z+rbPtfu!JKJc!U9Pe*6R(mu)Y2#PJb%bo74NNSf#C|3WOv+lvB{zyhs$B&zlOb3^8 zz&o3z{++T}u0lDK@+_7FPh@7mnR%ivK4~Si3X;72NX92xlA1kt?rF6INxdfgxs`rF zc{(Y3f554a+u0Ka|hx=)7hrLH%X5*qTy9N^};S~;wI$?*h z;l>3=jQ8Qpa+3OLu%SKBISz(1F*{_{jnQ56COD&Z9B!VU@KB0dq}lN*raNG}+lV@U0hc;1EcFWwv-eK|Q3sRMbzczgFF zwMN3N>_C;?FnMN6>x#s(HaaCV7p`6KQ06H(wL@vV`wP<5NVo~9)0@$|W!iDC^UK}~ zd#`~hy10Gco*e&{Q3%4*>x*>B*{WtEY3!MJIZ57YNa_G1IyK2Vf+Ulfc?4hcx6Km4 zQ<01$Z#a@PF&PtXvv~|Y9e))`<;;_wBS_YC+|YK5k*EbJ7fCbLXg-dla>mY|tR|h@ z#{=x`VQ=g^j&lw9#`WdiHMcNWFfB=s;6Ds|cYvur>>$wIK~fMJ`^%S^mRaI(d3Pjv z0clK9XgU(72%b_sd{#^Loj@`*sJ@O{&pMi!HXo_2X$#G#k+cMGewmvT`bK&F;%x3c z-i!KBn{9V11i@=3U{ zv=#Wl9qE^S6878=&h{K@IwHxo@_r&KVF8lH3a?9#8Ia^nMlzA4$3gcaWkoeZ)j!r$SUi5~*77^fPW} zbOluZu0T@%h+$%JE|NSE7o1wwAZa{JeEjln37@t6#B8MGA6qe0EKd8h_zluf z${1@d|19cPjnWLHPCD~?ufX+0EAVUR%g?ddPnezJ)&C;u5&3i&l48?5%PU2a^&AS` zOO8j7Ls(7;hJ-KAb_^GEN9sf#uEUYVR`P;-`wd8g$O{^dskGbg{avbe{cbZV#^yJW z!l=YX2J~gbzA_Sz`L1D%kUEgZvPso5t%OJD`BO;$j+KP3&2vZ->+}4yy}V!o8%=5R zASdn{(^uAsoz#ppBx;!V0+Rd_tPwGBd;CQ|q`E17*$-i_c+a_tJCV-z$7}YjF(Eib zg>FGg)+6)KCb*9NwwqJD6L4BzL&1aS`0tFT%;{+Xk{ldNDeq+~nMJMg_qJRRj=hl- z7(DI44Y!|_6o4NgsTP8aDO_Q%kq9eJqFw#ceY}$aQ;0CE^O8bMey~pv+{J#{FJbos zzx0=|*ZRk3zc_b#*CSm+iAupK^lPNCe!_vye(CQ&{f`48#Le@KIWIk%Q4khHXL!-pqA`^}^c0?EDHFa0&_Ed-N4 zSUPtld9NUu*koaL|M1feg}vSf%tLAd;ZTzMhF^9l96EC_Seg!{gogjB-fn|i2R9+$ z>K&q&0k;q?BjEPJjS9H%Z_yIV;jRg=lW?5&f9o87*sKV_5z>1MsXxY54BoL+Il`n0 z&RHYi6effMWYzWAjSa9eCr-C4TO_YienLLVy0huTs4**=aJ({zru;sm`*4C-X~IdaaVeR*UTqP zy~eJ+Nc{r45(%hwe@FKUO_51RvLJX<5_%koSC;prc)!5OhwXwr?b1{1Wd7n6Dc&Zy z_TU5vL3SFc3sS}4RzBr42eRN^G7GMqpD?L&JWN{@Fndz61hvI@Q#O1ix}wSx#Yn2D zif*3VSN+mcyhsF-2RIM(Op5K{xPHacUA!B4oY^fvRc@D+2y^zW`mP&HXXCT!NE#1p z?VlWvpav?dLwfCWChR50oUICj7F&s<&SYMvA;|$On)`Tv66*#*SkX^BmK2(Z)XQJ| zWaoI8G?aL*&7<-^tdgg5bxh~D$RgKeMdxd`cGB^<<87oX{Ddz%$A{ctJ2a+dAZdt@ zSeu@Wl*PDV?^nP+fE9wsUld7;b;F@w%c*TW$6U(ybj>r+D)BC-?`^ktj)R#PoZu_- z-PzzQ@8!a&Bc|goMZ6GIx31s@o4*^OpGjUG;#f6r#19ZB{9C-Vq8lt^HupY6tyWe% zi8$)t;?PR}QPoR`*PP7_RZDQ4VUca++|KcE!^tok-DV^mm001qTkcjlQXwAKy;s?d z1{*tTr7CXlb^~`1xc!kXr$kll0`BsN=ec2bOe78B-I{1z9vrf~H<3D{Nf;0!XOI+B zW}g{X&G_By9?u{tK-sNFCAq&w$|~US7JOZ}U2uMy0%wZKfY*?&4l0sVnJ)#WsFBD3 z4~M29wnpS0o_pmbNIEtt;BHjPV&mv zIk#MQB(-M-ZVpmkBo<5V2;N5OVQQgVMZUhQI&nO84n@*=h1owfDRdjsC3^AceF|q* zCs}-9J!6%5U@#C#7Ms;(3DQ~3(4R;>{l(nwcc~w>olx**AZZX;`M#+GM$#bO#Z8PaOz2NTQuhgV#^Vtr zd4@Zs6G`4~Bx?#ISNVK1Rv5-g*6sYr*1Al`xuA+yP=fkBB-uvYI4to3Q-avB=Fh^FAI|B#+XQW($_9XgC;!W;8KEt*m;!g}919!`eR3{Ra_AaM)Jmc2Vt+7SOW zY-TLv;S=`&laWm0+P{_|$wCtg-yq31#;_*Mqr!YZs%4B>1_0QeR`GDlv&|9`K9V#|v%8S&gyZo-m5WV73>V?q2Pp~7 zD#1DVPb6c!hO#GLJvR%3e03v|32XW4C8S<{!t~BDm$-hPUR}JNt)fk;Z?_^T>WQLp z$#Dp&!C@(}b<`bNP6i=q$v}w*op&RJgRjr*v|4QNJg2MG#@HJ?Pxb~P$!Xl6@QQSM zB&{iHaZFo9QaW=!0+&uUGlR*SacMM?G%_oYw9*8F>V1NAcIdr?c2VnfOE3UQt5;x{ z_cM~|xXh_@nHxM5Hqky6$<7_U%s}ExQ`~WW3a9+Xz9W)4z>$#~w;PcZ4VcVg z{56u9(sV8;}%soR{eJF(f;+HAOpVq!$;Ycw^zr zMCKG1htN5)IKk~~xfaaf6jP9y&KsjSk+QZ}u?kRibFST$6#5Z~7a4qG>ypmKx*%>s z6Omf`ix;POcfy&j?AXrt6_9jWXvV%?7tT_Fq==u3BztfKxjLklzfBU~<*vv*EpU3mXNOm^jmW?*Ad}KgVHz^c*1s>EH+gk)D zJMb)zCj}$Wt$s<(YhB4P5XrIEe|gKpyZ`2M{~suOf1|8k5DmwZ65Dn)XE-&(T*a{K zyEpSUb&qd;%Q-p9{ckPUgYxMAQ*%3CWzLtEsoHZc_xFF?&Z%$rqdflqsOI15HbYlK z60P&UH95VTT^y|Tf2SO?qFbaw2RAjQQuj!2sF&5<9Auf$JiFVAq*D$1=w9y5dYDn= zsUxBAERq&Mv$~u>>W0LKznL80)2x;V#M&IB!1y32%aF7v6QX;QViJ2r7A4dC=w6Yn z(9qMp2z7s3pA>ID+!aBE+HyOlMOP06_IxBoA!gl{9EZR+SF$?C_de$atN9|NfztUu z@PfA=Wu1_@JLVffFZD4^Gs9@?4_F<$_nbyNAIaR!tE0ansiU0d@K0*G@g!l- z_I;P6$l^*Y32>%kdQz6u&)lWam3c`qCH*43yWoz){UVE?p{f0YwShh56*zU-9L`Q4 zwGAX~gB|z{5xy+OioXa>OJJZCdP`C;A5X)X%@@l;R}P>qf7|wyP%#`D-BY};;WW|= z8Q*#vK9I>1oQj@vU&+FP9?5YC zgZ#ytQoLv2Y^PZ_ezi)hH!QW+3^DVT3OGY7MG97n$kGNpc0jUQDGqKq)D0fPm|k9j6lZ`mg3mB)_j)H-5NjEI0s! z79z3N&rS(#ILjS^W8Y=0T8%K_&&*hmaAd3I994PrSs!rF?lvaUyBFbe z^O(pYsQ3LCbJz&h?wGn`BNfuf9W^%68|pnYHhRmlw3J>yn^_Y^1YJ2)!&Ra9n(jshuZd)G!=Lw#P@7UXB})E=8&wYywsDnBixo z2}pW4Z}Qe7DV~i~CEsdBcJ!haqycC1)*}5|v%>UqYZ;5A2Ti7yHAs38YorrMx?M3Z zug4XbemjvJ{oG`?AW~r%6YUdFzBa_6q-J4s4boyg1SxnZ!VA6RcmzGLG1b0}Bv+dN z_lly?pkKQ|usaVM;OsG>djEGi%2c%5Du}A$ub^u18%w{n`Jy54A1&PvmHq*n zFDm(<@*^APxV2eh9OtOb7FF@%P&w)}RQYEtm9gqaEL3=$jJH&B$l~RoGEcvA6(2cB zGsVhIMASIcf$IA2sPyZiCpR^Ks=7u{;f-zibE)tqR__9vFRJb|_xKG$RnXFA{I6&| z^1G3*in>G9&t6vle?`@i{^ZNRK~_&x<%UAl@FmSmqS(G!^JQv@Pq}{K;@CApt?j=!P8Jx z@H~`3cQ!y(!K+YBwJkP(D^&XL+58Wn{5ZQT{uxy5eGRP+Ej|n*mmP;DKtt3f1Ik0y zU`1#RsD3d|*Z&t(^*1r~^$8gDHo=!_5a(-wA_8=w<|Vn`*!s2Yj58C_wLNqV^RtlW{j*=>5>m- zCx?G2dGpM~UpgM`_Wc(dzW8(A!lO%4HZ8ro;g%0$hE_Y)`+=`_-F?%7Nh4F%&A20G z_J}J6<{o>b|=ivS)mYiOD z;@A718*}W>m)3498}?W=XWn-|ynlN9iAuR0FPwR*aBTnT18x}k<2}3DUVYWz1%Fom zirM8lr>mT1O@34Bx4q&%dG5}{i{_@DdF0Chhn}c6t4gEQy}}nYJ~?m0@Ey-qt+DRJ zmut(N_t!@+*PSrwU}@LyXWg-4`O|Z{6hE=rdE>xO2M=bo&5wK~^D4If=;IA1uWmBn zu{(Dy|8w1(&b8}x2`}F^r{DIM2dDpVTT14vi{}1zS$8dE;l@IR9|Nzc(L=sTp(U(!JN$k8Sme-*s}rf!N}NoDp|Fcl4JB`}TVDg}DWj zocYg84KGYeeEGcWq=csDm{)eLdD|XbIJVhG-|t$zJ6zOv-Wz{3y#DC4ygwTbysL7r ze+?V{`teuZ%zts9JGO3>o|*6bw*Q-@aofLKxqoL#`N`9sX?4MeD;_-^If!|E9|}1G zkNuQ8@sdj)d*;SteQ)}BXX(^2MOR+s)Hsr}|GJ{@j$}?KciHImTXx;PfBn2+7k;@Z zJ$Ze4+TjWxWX^tbR;3Bwonzj6k&gRfhDBB#h)IY%xG$!UyDhR$!0>|r>AwJMk1YEI zApTc?Qv!BG()I(a7x46cfR7_51WY*uaLoaLPa>-i0Mz*nAmJduuE>ak0PhOeDB$ym z_bb5c!vHzI0(=?SAfWjXfCh(R`lNq#uHX7x*eT}O?^2zqKfH0U>EQQ1OYK%IZST*+ zQ#($5a@5*3i3c9u{PjasF8w0!!CEi3zjOY)Lu>OtOz7I<{7Ee*J+`sr^w?&RZAWn1 zj1Qj+jTqbd_vz^|J-ckV?bG37+ogoY<-ApIQj6ht)>=OA&9O`CkNskB`~0Dc-fZ1y zSjmnL_T?p1$;qkl;>9^FZkxI09JhTFsrwt|-f|Rk=l_QN-$u#=B>xW3>M+3fkvWF} zeirbRfFB|)jsV>I2f*SZ06#@O7trfZfG$S?c$an*;JAQ;0`^Bb{tmF}7{G(S100O( z6EOTZK>8m5ha$`V0Ej;Ua7w`8NZOwO>jgahC&1Cj2?1070=VWFz#oy-#{lY_1V}gz za4a(7IKaCCHVQZq@lF8D{u?0Y1i;D21_8}a0W|mv;8Y~*FM!VkY!h%MQuidlEvI7= z(ywb+ExC8)4r{O7{p8WYUX?1fxOe5?A-R8D@Mo9J1Ey~(nD4B3H*!4x%$HMY{93fP z@p*5(wf*g5b>a%+zTUL&(^apw*YP^KGP-e*ttVrKMv~9OBoq(YIJ&IE<1aVp+U>&? zk4@_Iuf?xM>Tlb0czwMCXA+0+DK41w!KpTPb(%4C=czfZuc>@lorXWPXzTbsw9VTyfj|qt6trdEwxg&tu>2Fy;A$>jwJI-4*%j3~NS8n~RqWhBPS-`bkDr_3x0TDLF;A1YW_L>n$q(xetG-+39ZURSdv`X8;l+`veS+jZL^aJ+_Zq zXZXWhy|z}84(Ncu7HgK z>PEacfZ62%a^e8$M>Ys(9uLqU1kfOo6$1E7z%~JmB6Z6F+~NVuF9*;hQYIj|0zj+s z02f5&ln3}(z*hn;inNFaxVIv};&^~&kcssdb-0C0I^bpk-0 zM1X|K07;P%l>y!ruu(wAh*t$*b~S*UDgY^w4FGQENMcn;mq?aKYGkuWI8rweaz$ji z$d!>Yk*<*@)gV_z=7@BQ>=5Z5X;B^0BXYe+&&cN@y&{*^fTTrAMS4fR73mY{SQFAW zvQ#8JvJVm&UKexHYhh0R$g*1CS4R$u42Y!Fh7626EHWr^LS%4cKpn`C$ZCNOHQ)0a8-05>OTGAkLWrNr+-J(c?hOsMRoSKo>8pe)yyRB=| zDE3;{ZL#jb#%_d;hxp)Yt>AzodKn$hc;)@u6cp ztg8@l>&H%(k{A8|C2m~zZL`=yH?)%Ht~J+@ofK5!MgMAk!Mcar##WD2nMm8KV&iMB z8)^P7rp~td?F?#b5dB;HN2Zv*nZm*U8sh{l z6qfU%e+vEjbq$hY+r+q!tV{10`$SCW;3G1;NyAt_a$9FQvTvpBNbR5_(Z9GoXWhom zu{XP3^iN(tvo1X~wth_L)ff14n(H2J8T)$7*-nIlPOMAp8=L2@d#YRPt1)g?B&%m^ zn}2&LEaimmADX|dITTtavbkaGunLoA=j)GS7gYZ!(yv!+r%>F-Je!f@o-mGE#R-|)?-s5*+%L9@n-KkDtpoY`Yz+-p zU`Rwdp}UXJl(0vGa&ZGJ% z{5h%CP~*#WpAC-f7L#y874vtFbCgpIIuk*W=2Ly^@Pcsqu#Gvp<&Z2Did``@c_3 zoFBRGs<*|K%Piz7R_$5k)B!Del@S@p@f+hQMD>^!iD#dcV% z0oXE&ePpqQV6(swosaoYb|ca>8112-S*$VqRub13M<+}5rwQqOk_vro70-uXL(=uV z)w=-xq5yH6y%xI=xw*xDu$XjOMK<@KkGy0IuAgjHGbF7Wx_-8piu1lTxb}g`oh?Yc zWEL9jDrxw*4q3fR;H&CUB%XGD15|~rNYxDJ9I=I4gH^ZK zAGWaW_i9?~Pm8q$t7Wlcwm#nKICU(hKT@nV_}Yn6-(n{NjN0_|hVv|V$|}k$7g+2J z7(anmnnv7San-wYuvt2s$p=ZKP8N%^m>kx{Vmc*BuOlfO89)`q_CH{A%G)en-Z;Hc z*V~eKi}5nX>0_(#z|;ly0w>*K6|EkxaGa|xRtZejhDif0R>kUF0XEcNm7S^@o za#-D(%#>llaH`p?tKhG-(@6jIo4U}AbQ74KAlI;1clgrCm1%TqkyWo{vwD*CF<512 zZHx7S|IA`_z|^fY(l-{XXR+R3L&4Z|o%1ZlyE8}cd~`Lm_4S3{43?;HY6Pfh!fW>6 zZ4<<~&?@qB&{>0GHRwfFuRr`FV0uK}(qg=dbTYy8G`tNMtX}Uq{DBIsKu@U`w*-SbQqYT zY7FUNFfEcJ!DQfA(i669@n}GGejI5j@uGJ+>#yNC+buZDDo#e`ln^M+29woONFP~juEnyD zRiW19d8R_WmJjL^c8jfV8ocTgR%**;!+%8k0eGtga{yIg6VhT^VJ^H36t>J(moM({g*(Wu-I()?si73vRLsPzy^R?%~u1;)pJP~TI@+M zHGC~81*{G98C!TBd>gQ~&}S_+AHEitR`cgR)vDgb%563&l%FF*;Yb{s;{|D<` zJLroRyB_{icwH|+W#9tRXYkqy)>*xU@Y~E<>8!Wd4PYNwYy+6e-bnfwtUdG<{Sg*C z=iEfnKBSHGRa^LG_~Yt2*G4e0w~(H;6>hS6rC@K7bZxfSBKU~ad&6S4f|Y`4Pk9qe z_1&ia-)0rJSjEL)i!Jt!#cl^vG%H5lwb&i-@`!ewGK(#NpKHr*wb)Xyu@-yJVt0a# z1PlECz6E{287u}@LbqA$F8KSvu7ZAGvAf}AOgHFui`@gi7(HDdS}X$pFj!CM4lwoj zUeb?pIoHlO+84i!^pgcYv4!sg)60Hc8h>TqPkI?lo60UQEmE3ZnzGtdc7w5~I1iFE zWrh80%Pxo4lohrQOtG*+{nwloxZi>g!K=c4q=UA?hv8MBuoJezN8nYVu)l2CN8weU zu)i(#82ksM{-o1jGH@kH_4SwkE6@$~?s1YTlww6NS@;A=6$(qR*edwRc;RYj6)?GV zHED{)s#$Ce*i?(vwAhni(=1j8EclYaQ-HY^tP7}ypC;v7tUj0we1@c+3?!Wgrk*@Y zQcr|6w|dXPt0Tf%*!rG_S4V_hY_S&hCc~5 z8rmOB^}Ip44MuzaAglK#{M+zjpo1;;7W^YvIu<&_VsFD2KW@RH7Tf~3T3zBAX0dnR zpR(9+i@gi>w8chPtPJdVi;c9{RVxJKguvog3bZs$N7wOK>Pn>nCn1bozF>! zEw%tG7WoU(^)OSQH-f3hUy>GB>}D{2oZTdKM5m(Lpfctwk~$)6vBkcIS4V^u-wwl% z^9@No5$Hozcn?WE5q6iwzJ*s$rb2aV&5!dP=>XU?=zRd{$oC|5MA&jLb!0C|9m$63 zP)bLNogWa?6M>Hc^5gtSQcrTAtDrLGCz5(1Y_-LHhF4F7t%366>?5fo!k&ey>@OsB zMA&l{+Yf(K`+qKs<~Tpj0VS-?gZ>LZJvm5HPlUY;rk?ytQcv=s8^JUrhe+y(u-C!( zaegCpC+T|2>K%sfNh&05(fMB%9wDWXbiHF0kHYJ$R|GAydcVW#tS4-%#r}ZjYuv%v z@I8zDDLt0&+0ggFWb`r8C17))+pS*lafD`obD_FH5rKr{J}_>iXPbr{RCr`EMc27ZyANuiN~ap0CvWftqRr{UYPFn5S>ImG;@jt zx`6ObH9$=rVdbo1budjGVdX7W159hcgJAKtY)vrDoaJB%U~*C|FwGociD2?fZ7|K8 z74S96G5&H*9Y9STfwgRfb-}a-JOoxB4AH5_hk7FHJd4!_Q%{67uw~B!Q%8iIZ}l30 zsUyNJuvkOwzv{`ufEU`rjZjoi9sz3srk*qgQ%{8Hd8T^O1WY}76uvE(I&wakIwGu{ zt?vRbb>uNHJ@-U(F65)JFxq#LEqD>2dLqS+wy<_9^+Z^z)#K@L&=X-{i!}#RM^=Je zVav7vQ%4>L>kbC%v;Z%1wRN3 z(c#w=om;_H!w+2dJd?bbO%&VbiCI6oO;p&OtB#B4qIVQu!^dM>nEZ7H7g7^AcKCl<>N6wP`4Q;YFxEC^N|*LPVg*OvVf>@$nyfvF?HJ_nOm z`DGItHrVdyJf03H*X%~&E32rx7kTDuusyayel;YhP}sLtkKY0bJo63MUaL0)OrF^T z_JhS{+WNi)`_W>>vjAnGz@Kb|v%zGcuwSg=955O49oT-0&9!>M4p>ZaplSR)*g=cU zvt@q(`_*EK4cay5|3iRs&2_dyDIT$kIw8q3KY|^#dL_2PpTYjLde@r@9bw0;-U2Yi z%s#NctlmN}c}DjHC(AMZ$j%LXsCT+4_}ePp2qw=6J7p`p2~3_5=9D*OZ?s z#p(%*u~;dXJfr)GSc@%E@6_-iz&H!u3Z{mIg}~&Q+iZox;;r6dut~_jkvyw+J6Jzt zU6sJF+qpv+N%s?aVF&9h;X|uvv2GOf#!lc;3+nt|!(w+@Oy_^S#gm@ThsPHEH@x2B z3A>ArA2C{I{n{408%(Y~4W>7H(z}O`C&feS>ijP-!iOx3CDpTv_rfoQ4?*<`5aKN3 zLz_oAlHLFcyN?g;6T%u;?0$IlPDk^G7JESX#6m@ABa1z#{a1$wfsHM=99~=W>cqeN&b7{pn{hvG;3URLiJc$KXQO|#guR!^8-n?juD zbpF$nsD-5WrUIYmLxt-=`&#S;cr`369ZcR@3$KQS>0K(sd65r!rY>}V)q4qE_0@+C zwtD}9SAF$0{zI(dIzYMRJm_$%xE@}fX#gEzu?_I5upv~B&>_yte5gWUqilVzz{@~k zW31k*@G9E~sz>s{`ER3D6gbW*z6LMPG=^qa>~(k*J|8;XVw>RAu&@bW^2}y?P3I7W)8R z4GWtCCeLh#SHr^Q1$vDChY0FPYv_Dicn7@BeQluE*}@;e>+wlj==E0bV|YD1xfHs< zVmsmG>dT-DZP`!6)5hh{o2=fa@HgoBpTL`~;x2f(x&w5PRs0NI1|~sowbJxUa)%y-!p6LQzX7q}k?-5jC82W%!+zYP?g*|91`~hB` zxdQr-)%y`%p1BhGu*H6YSAAWfk67$yc-1HDQCr_W_~85}@Nuj73%m+n1%1L|`vXOT zt+LnwFnOjMbhX6}!mDf#s2)y1oL~7+!@{)d$uo!GP>;N^t@(C0076n>{_=6bI;(gL zURDcRZxxTjtKpH*SFGL%c)5QR^i_-f1+V%>LpNINB)sYq_L{BlZ+N`G^M9DlR`C?P z3SR?#!(yk6Vt~DAu`^(D{}||77SndAvg5$swwMd1hJ|ebQ;%c7^+Nxz;vTI3G97~m9u(TVB0KK9!#E@3Z@s(5GUSZ*$CS$<`vt*d4L~U zu!2?02isw>idJtr*hdztWU)dpz0rm^31Bj?2w|tiDqFo-V4qm53YZKmo(=e^1*=+c zF4!)MCECLC!9KHCHLG_W*yk3jZuN@6zOYygi(L=)rNwH3$-o6*yQAm7T2}E!z^|-g zZ7^AQ6WG@lt7EZSz`n6qU0e26uss&5XZ3Ca`_^Lh!E`2E4ECMH&WmCEuLisw@Ouk3 zKyiS@_FAkV*g%W@V6jGEgDv)>#TtVRvDi;wh)xqe`ceNf(mtzqK3K9cY2W$9f)@a2 zem;QWelSJrgYM=jRe*7q>j?_e4( zr-iLh;2*ZamSCDD!j9X*7u&**fSs_|C00+^UlwZxrrGo;*h!1Ewq;j>{cW)}G4x+O z5qJtvJ#K3&6s9k7iCk(cd>p~GSUZcY0*kTOWnc=f)nKs}Yj5?Q0*kZQj0Y zZ3THw2Ma!nP|jjWwy+MM`VUl9wxiY40aSNJ!a7+@hs_EWO97LC>%b}s z)A)C`iZ26JvWi{6)QAp|2^LGW*ha9*77N?5o4~4A>){&~7#rjxG$EW%h>kB5McY&Q}v2?5V1(?3z1abO-$!ML5 z8U`5t?{C4c02^7wt8L*uV2v#{!0LSq*2H21t=@NF=UZ%$#dL_dz+!{JWZ(~A`eqfx z86rKM|8zRJ$bv%wWuZV!L<13EYZ?p zqrha0&Jx8JTW~bsAm*PA4m#yRoNK_;hz<^|EH=hsIwQ2U*jQVk&ItNGn97c`dfNNj zS}X%hozvcbslke!@fJJ{*v=|Wu!XgMUuLn1R!{qPdy8dSJ*}LVTWpfWv`Tic*kpM1 zSgT}`#ij&$jK5aDWD91&%R;Sw`k#{3lc^TdO4rF^)8OS9RUiS4=Xwr^g`$95F9=v-K@qrIz%H>X z*n0tc#~zIZ0ecstW;ED)>?A6Q*kjjNqsA_3Ozbh57>&{Qo!xV}s9=)cdw)JZ?&sXI zJ3Bi&J3BKwyL;&NshXm=@pmlv%6Thb;qQ>FPIDWfR?Ah6kC~lC`T^-2(s`r{NEeaz zBOO3mhqMuCb6R}7T1nCPYar`r=V!L2855bz7vtxzid>RIjN;d*Owr9xuCD0kOhi zt;kxCwcccv7EMxbrsbQiuE=G?oAVUaGi`IS+S+LBYoMdE)Q_p|Y_)ZsJ$%p>|GFOH zsZ^$7YrJ|O@sa3{ks^_*BUMG>^WFuKoRRV&@s1Yn-8dpSsA)P65xUNfZ}5+=(ENnN<#&+y?#s_e*i;l}NM7PMu8|}d_yP={?d3Zve0PN} zy4*wJOE3?S_>xNnRC=W6Md0@n{O0>Bwlao$ip2L&fbAl6X z(%$WAq0;36X5%Mkb2a8wIi#{k0Z4*8irkJXI9!w!tF4$h@-AgrdY0L-VAQv<+k)RA zdg8k8;%2gJBypP%DZ&lw{Qg-9V427Y7=d@mHS4<^c$dDc-4@J7Rd>FR66+7zwlH5d{Pcm2Ze_-CCO8x;;1`yhwI zWG;9P9{9se@1UhyjmqfYz+n70^rh1~Rg>~5-RH*`(srp9WhzzR$6|`xrJBsVZqA3w zrPi+g{r9g@`x=#?z;H{T75)h=1%Psl(ix6dBCde@>&OB{S)q9wmEh38;J_egS9%P9 zMov&GOke#!kMz|ZFK=#CVl06G!N8-WAW8;m!y9yZa()p?P%$tZD(sy)uF5Am>?vxs zTa8w3(8}GQ^&U0psJS~>xVfkFluKSyWn)?NJLWp>!2l=8sVao?xQ+%Y^G2f8J_9oluYlqNB)dFY3fn z06*fW)?PGvlbT$^+Y8#TSG5?8Dy`|PMHvg?8uvccOSwd;`%wB5DYsR32Z7}`ir=RO zI91XllXZy6bPRxIKFR_QEpbob5)SFH9dDrVkU+uuW%LHs!qx$xFaQqV$*djk+P-h! zamoV0z+i5`4~{RR_;r8$fCU$hpEW8jj@0ox)yv6N_dF$i2ciNf1rKu?JgEGDU$pkK z`<@B#Xw&Sq)?0PFX7<;H{aJh@+{w!3On_#1id z$l)~scd%jkealQozjH^cJPa7R#|)1yUGf&4 z+=2(iBIjOCbwdr?sKX(&v7dqyKm+F537T~XG~{-tj*B!ex^@V&U?V-YpcJDUM+FZ< zz~vOdpU4=AnSwbs_psVS89{#^RxM^{FF9B%Cod^hrs1-xph6#{qSWAsngsna@VM&k z2hsotxn*uwdAcX{sH?RnfWzg)YD>yd;9gH=ex#7~sA{pc@s`3hwd%lY#T1B}XS z}coE(3pa3PoY{JO=1 z(1y~c`XD9D(2|;z)l5nsYH}J)OrXEHi6y9q6-=VvD;IT z+!|}{RO`IzYaWQvW7+LFc;lOwF6(-^XWH?RlyDw&RHwZ+)Pjy-U}cE3AtodA{x9d% z5M?KsFMynj7)drH@dYY}Y)k74TWT{TztUcRQ2!V8x&WPkYKtyF$}3PBUZEtX-(Y#g zjAuD_>R(O_05b(L zUV)MTYd!~_vP08(VDT!|^SUsF!GRUn5hzY4uc9ZC0c5;}p<7Nq>^q8qXB{JbNu#v! z9+Y%V^-)HWGFWr>6LVmH4XH8uDyJKKx%}>EAcrP^5jC8n;9I~XMB1e2!g+`MuOss@ z&B}PUj3!;j47JeWbj(nMIE0b%RH4`(&=aoo?_jW&@H(X@RItiAl)dgIZ(%&;QRp^c@vW$o8e@y0HY<@z!UrEP0XD|^tXVoD<@6e z2V0i6zqh)&QDJw7!$KbzfNZP;xPk>$kU^ij@$@}L&zu+PmGy=3!oWm|3<(gj!@_M4 z*3*)c#Q=bgNT2=E4jPSBXwhvw`A4lPBF5xRRoLFk)PKdGv@NJH^4j>IQNwsxr*xc@K+6w}&b=tGYIZT%7en4*b& zD!DG&5f@(41`uv=YJ`m)lzdxeuFvCd=6q#T?f|wJaw<}%AWZF80KhLuoD=uSi9+)S zju2I0u!Ak*Xy6^twvMLq;{?U$0>OXMZoFBGG{zDiwR-2S(rfuWt+%Z~i=ie;*fKq8 z+-k-zZhf0ceC&mFrTjkw(RiAv0MRyzDe*^APlKPsiBGY_9ul2R&(tJtzs<~ua?B%^Cw_gBPf&%a`w`_`t8L)Q` zZRc1)skz!tZ6d`2z`79t%!CNX8Q;#f7EQ7Ngc{DG1ny7bp0NX_9=LvEo~^`U_=`5k zCT0!5dKgMJ!cdbkIIBNpl!jJyy^Eon(+nC2^%ExL%^0f=yKAri4VAx(rmq2jIob13 z%Gk)U<)H3uDqC%i-7J*+{NmNeg}Ya2Yb&vUC-JCi?g#+(f;v0qpWls!@cb2G5oQ=o zsQ`eUJH~K_0LMd8?9-c(Zo8?A4bEctncgrB<`xK10pNM#4h!!!AA8Ua5RDQRmI;@` zkCt*fSJ7TFfI1C?enh`5hIxQuCMAWJs~!`wIm`xC!LWyt?tze7l!Ax3P)o#(0Jry6 zktG`&j67$9vp|cV1c0?K0N_0)PCw@S&DYx1OhFGd%tZ+g;f8D9s)kqu;4>}IZt}U0 zsgp_v9!sfZG>?jmWvh{|DgDKuQY0WN-8UI(04u50V09fj8S9#nxM>&jk9k*p`;w z;K(q0{XA`CuWy70OsSvNWs1Edf_8G%4gg@jh4n1<#fyVyqU-=mP~w4-NuTT}VXW&I zXH+I4$Ap}%v=~09`3zp!x!beQ_f4M$2{lkPNSf5gR1MyP(X}nLeW*s6Teg*$4BdC_ zf0#V*3IIdoB0L*6Ba5o*LoVyg}cU3!j1C~ zKczRK%%gRW)LP0~dh$rEWc)C!?)Eexr46)F9Bq1x@sMth?la6Cpn2uO-p^a!jZJmG zrKl0eJN*P6P>8{g=KqRCZ7*yxvSqP+)@8)rg-hZQs6h_l4@p zx#Tx5?jURRpLfz_^rR?qRg_q{mK2VPr)I@Yf{aJV7EMY5-G74M*2+$D1O<~>xu*UB z=WNAOSl$5I{Zy@$2_Y(oAw2(^TBew-;@8nY4e}0p7ks_&u8Wr(ix6nk1S*!b{y(=M z3>nAXU?zp9qltkL*0j+uor&Ugr95BFN zuy!Puzp{2r3_6x}St)(DpMn{>b?359uYf`ClZ7_Px2&0hK1+^%(+3<0q3qvnL%1KD zDfqTA5BR3HzKu@57PQz~*N0o5S1hqogUKou+nOnBrfuB;9a0!E4AytH2IA)KMj#+- zp5F6J1_)0n8{#qnq(?usVbZm6h)q1Rn1i<$pgN7ZJPL&z{kANz zH~7Q>Jk&>zrT%RQol%(&UCHaHGpLi3W}^1F(Sx@q%TQXE8+Zi^Jsd)?%(O3Lp$NQ; z6?9tP!lVd~nj6a^GUmu`QpHT#S!KYLUh``Uwjy-Mo<4-`E$VGOvCCm5>3SdQ=hY%? zQ(836Qm9iQ=aSK_6*=V7LVyeUBA9yT)4a1^aR(#V71da!WW4(a?-B99%5|19P*BY0ppJpow zLfE}Ze$7-c1ppiznq8WH`1Wd*IYulId*#>su~wRja@!IT>dv-=TuB%6YdsJikL2}| zTsC=IYD$$KQUBk*v&#dce`2mgsQot zP$16ocyEP?QEQ@rh}=qpQ_bALsm!{lWB~QOm zo}zu^28WjmYPSSu3NYY*4tdn#?v!uF>yg@U96v${FMPr-7C+?dl~TnXCSFK;D*@#$ z8rTplyG03wAexT>&XRLAx7S$Xi^FWH5djDS2Sn7`oemY!e9irq%8>fWr{ViYS%=oN z2?p=`C|=NVt(Hm2*_|-&RYqjnSO9SF7amn-Y6Ji*-rAYb_+vWlg;x8+J79P1_RKsT zFRXa*kjY1*VK{Tb0MRm}x}Ze zAmE)8xGWYLSQyRg5hBckTIBDCjHa}k^YvIldwRl|Jt#kD{XnM&QzUmr@6!~DE`qmP zG&4&N=YtgXzDFh<@A2dMnltP@6dd~y3-r*Z9xPo=DU5v=#UdVR{sCxtxXL4j9doSH zGxQMsLrh8^E@;&t4teq>3mx>vG`vO`97wfCP&Ftz-fE-(A8q_Q%!T`u8MLL>KB%5u zSIt2y<<5ooFAk+wH9rM)V;er5cAaRQjuS-$BE&?6oyt0TIz(e%K$N0BzL1m`wAdE} z@1wXB>{JBFC}I}p+>=y4&0En2P>=guqZWQzw0ZCvDTbTATUM`mNxvTjdxU3dANjY& z+P1f59*vs3Y>U|B_saM1Vhd{WrV&I(C$Y6ZRNf()?hg|6IG!H%J5K2zf#3?{QWTPV zlsXi}^cqeFiUP7cz2HYBDpw4TSJbH(c%W^hYgWz6=(>?UFQz4CGpM6^P%WX@Z4E9C z)OxhBH+3rxEQ4u2Kg1@73<8?tQsvU-+O~BrU7D_3V(<5GQc3`LJX!HD9|Ig4lJ)~? zKd8U4+Ihg~LGZyewgjlJNT*Bi#>WB3te9;5VuVbWuj=$6{9 zxD|hF2Nn@G_lknD?Bi`*lx?6*)G0xTqnYs63lKs>ba{ZL$vB!x+9rh4%3yy+1h(`= zPG%#84MLwOHyO1vWwW8uJKos{WK8~t^4q8+JjJ**vpoMUDax-V;Y?3cC>ToJ=YSI3}) zSGUd|&7Qktky;0J(J1e;>YIpS{5&+aEBY>KrUT3#fbuWnJoKO}G)kr)kYyE$zXlEzl}rp9Q0-0*K|1$tkTy5d?ZN(5IlUjM>&UwD^iW}0<-W!GM954 z_kde0*RyrceI-RU!kiTjg(vN9q&0z_!Oo@$?q@z-_1ix$dTipwloi1{EEYHYOA&)n&}X7Cmk z8<+q#0^%46i)A8r(rk ztK*@&U$-c~70o}QNPY+<&NR*Bx3}!W7jM6M(fTlO=2OZD)1ujQ1ck#18cX%UwIt;_ z9ScYOhx7&yn|-0E2vm4MNfFSf+HvVPqzB*3aQ!$p)X`|>A*4E;PDW_8oOS?!T{1z6 z$-Lovd8op*;l1CLYc=i*R*181JE=(pbmt1iH^JjRQ4`n=-C2Cm1pb=DKz ziWphfVVS>e#`7V$5K4A1R484jh+gPsHA{&(^rYN@n|7^RO$wRKj;B8Kf}PPu^$fXI z*1AjXir0gcu>xp71*<^hrqReM;EUM0Hz{)8-u(GlY3jW)*6hBsdz~+E>bqp?=Oy^Et>z~tp~o@?iUoszCy3`2ATU?HA~`pG=z%)5DomLSs0uiFgZj0} zt%eYo06fec0p|+-4Jmm4laTwZ`FIhZ(}VgLK(PR@W{XG=l5>guaF3993zkOLTY|Ev zT9`P}tM?1%9le~{Z$}}|2g%7|!IsD|oEDON<0Y3J?{a$45?mZh=0wdxBU+&;*?RU1 zJ>kfmp(eFaN6t&#WhI9?HY%g>H=Fv`5tDH_9^Sv*l)84}k=Cz@6|4Ld%+f^)hbpSq z#dryLPYqqubBu45m}pR4=r{e4)GOLs7k%kQm-!)fDs0O-Dpe1I_+qBqjN21fdupGn ze?{Y@nQ&yv1qD!tdKkUe@WFUDC^C51!a1jWo7(|O(kuXgUF+(Be!W56=zjQc78bOE z`MmHQSs#u3!^tcY{>sz;KbQ4y&t;i&h=Rb152Gp#F=PuVxHTUCL&!tRbwG%T9f2}crA0hNT#KZjl z8U3mV0kVGA9dWr8N__m8w;6 z_yn%P`%R2yy@r3e9@2w0SZX^zly$?~^y>a(X<(qLz{P+@#6pIA+oGvz^rW9w&|l`Y z1+)n*9dQU4pEvPj2|M&)iUYKHCII{ZU@CW}*_!Ps+wB0GXepz^f}0;d)48_b#8WEP z4xVGK->7vv1i2g0)OK1xm4#2`9$~*{GTu|gt83L`%QA2*)^;%?2_@_@lqkD8V*kTF zckCt8Y35p-4TkYEET#PILDDY3a`0j4%C7lNZ?5w%iUOXCe;Sy?(SF27m^og*Q*wLwF2w=C$h!^MUU$Hrm$Pv^GAz)_ zXPMp|6nCWz^Bw;x|4!H1qqiN%tph9)U*<0Y6#F;DjNSFaoAR!ifc1Z;jvX*Yo6rdN zc8_|Y#;!l|vw_#W(R50f58q=$2e4Ec2)fY$lT_?9n#=?KkZxPuFU)bJ7bn7vgz$WRlZmR}+B%9yRr5{& zxB*~FmExAGzm&#Nn9<_6SuoDSrvgCvk&ZFkFM#7vO|N97>Rom135LVk2BF?3^acQ7 zwm%BDK7Y-h?$IhM{4!At#y*!#Ozv_vd11kmUx*SEh8Rjer-rczWraMap0V(|2h-MA z%m+QjHk=}R!Bz3@$o3aID%|{e=L-D_cr>U7-r=AJ523jF60LNl#T`Md-AnUP_R>Sn z(jU?#gP&3fo*5!qjRwm@&x@%)XQa~U>1b?OCpZOr=;0iMvGQ&qzZqHx74M9^tT$T% z=tL(i_j}h{vhHYj(%>%eE#;1ezCzX8rfXd=v~ugD(K;NVbVa{*4=j24K|+0Z(Jyc{ z)Uf!a9Jywt3l1nb|JfL$GV*U3MxTNw4_VT#Yu!#3Ji=QL2!1m!QmIo{^d*IShhWH7 z0j@CMwhcJ8C-QZ&YL~akw5h9>qIa+i#SGV+D4`qHP|rx|E)bZzV?GyuLyf!h@Vuek z-681%X(39@4>1FHELt^PV0iubYzS6qPfs|AQp)HzR5D^NJNLpA{Si{m!|~CAv2mr-?%}S? z=wP`v7s6=q{#KQLdT{NjHs|sjEihg5U6=?>qhz44dTH{{9^RqEV%AcBZ?$v1f`cML zLn)4~d4uLW--Z(G(1joXGMBDG(#@9UGG6$(67POz+JV&q02(_uIELJMV_e!&03POw zt>jWE<4w0k6LyVQmI-J5hGGF=jYCU5=*FPmZ*1Gtv*usu2Btlhok8pMt&>%=T=$MK zj2b2M0iV~=_bYAtTr%#)-aSHYg?xgoVUCK3WzxFD((dUM{ zm|r=`zXW;X{P=Tcf|Ib2MF$~UwkhC^j)^&9@D6FWHn#3TG#rex!2rL12-*zZh%%%`lp4-U3A7+76119R<56j?h(&U_)rZ#Q)vfQ?d zb}g@4Vx#jz+SL!DR01ZHXJ3NawAi1sCY@#z8Z6E}3scO4nYTZ>G8k~Y7q_u|m+#I^ ziZj^ZW>Pf(D8k|vEGp|B2Q=S>ia-74?683+d)lEL^_IXL~qOH1>WB*_`bGNC7OP%Q)IG zav(Y-L&*r7ZsNC`0>;@yeZ`?Zle?F*A`SvN#eer_-;~)Gj7nZ-iW#I;#GlljKL~Lk zX@)tTI2a8`5tJ6hWc|%W{xQ=PQ`|?@cE1}T1Wgc`vy8r>g^Wm=9A!S8#+%XAl^zU+ z-1xdGVk;?Vbgh?Vx=tu45JGhD#crY2jiIiT?{fgw(*bw;Std{YWn*_?RvFGPisD%R z#{huik%2S1mI``#qzo{HO1GySEd>B})zkSgl+F!-#+(9hj__QX`0TdZ^D{V?HJalO zkSFN>s-I|Ic+b%xJU8^qKdERhzK91)#ZAh|9{CG3UjeWufETR&Vp2r$yBkEa zIN1rFpfhT=A3>H_0iTOU?Zzo zj_z0yFrPvUkp<|{2pF+wavTYC6{ylk^z|yW;5WG`Mj^b;yGlDzVs2MZ5_G23xtrI2 zOGf8x@e-WJIZ4*pL>*&QLta>rSQPfn4}#aEam(yT3{YIBOcch}Z5KYnbTvXn20&8m0*w za}5%(p7@UDCjjOMeV+hpc6P7S&?{Q3SUdk%+b;HIvWeX5go@ZxG=j;!5Q37?dJAUm z=|mx0_mOEVRD}GJURQvO#bcOBngVc1ACqr2z%eQ8G$dZTYNJW7I< zA}Tfpl&+wGW6;26T8TIFe1B<{=HHCEIXCP$eBjZTxjgJUDF0Z%rBLKp%=Oa6sr^_u zRuRQ%=vefA5M7@FZxo^yOIHD49=cU`cN^ATeSc;K@0>Cs03?vxIA91UL1o8jUfwxu zbpkN71a%w-+$U+nIQV+FT3dfSr2K-54Akej+sdcfl4&pPy>NWW{Fp{tC!mMZ=q^7NlFvkB>Kto45t6uu`XI~vO@P!& z^Gg*uo9??MP$$63Td<2Kf~6Pe;Y6*6_s@U>t%)6C>gO$YD4q{d>%6R7mIh1$_w-Xm zv}}^LK$%F@CTo^V*OR7AMw5MM^<=G9o(1I<{u79a5kd6FWUZ#shAK_bOis6h6hlvB zccu5y8xQy*K~N6)79~t zvG#$%5xQV0N_e$?aneVxtG1iugc4oR2t&jEhPW8byWnz>VvVma_Ylf$9FyO_(mvjF z3bqP=wo!FOEb#L`FTAPvr(Hxi_zVre;wWJ_7DenKFO6<=NvnAj`lJ~{+TBIW4BX8g^xdGd_=PPeF zFFNqH9a}0^yv(t`GJfejwCjxndI=N%{?%gm`{AL1;Z|DGLn}nejLg+wAoc?r@vChH zNF9{T;@c~yMFQ^24wC(PZ@4LZl>nbBWDie&`)$T1uJ%Tn2xNxbIRB*7bMKa z&m7nClym`yu^v~#@>6i)MOUqft^~?BVtr}FN`_)@s%Dzk4JzQjt-EEgq~ZTE%sF?G z+78vqiU`WvffnYRe`hV+_*+e?4hL5eQ85m`&!3Nx&^Jzw(caH7`w>&S!cK6rTGBV% z>$+jU+2l`qU}E4(F^)%LbDwvJZBz1Ng3XpF%j)uct18(|}{N)YQrXp#xFY1BN};$%Ruw>Em{ zI!nFi7b|&^!dZi!T~wPk&x3NxwkvvfsVhQ&|EACS_d3ki>q^zOU0b?BJ+c}>KQyOb zu5I)M{HB0tep_+u=J*$y zr;|^8MZ~3L8L25+fnv72D=6bRdtlV0pSXWlpO(SRfnhY#W)>eA5~ePnHqly09IvBllv8W`DE&^ z0KjsD8>tQwc=fZmL}J;1@!dKj0?c2!z~Ehql7zKcbN^7yrN^NjZHhc8nx-xIAYm7x zY0m-(QL%>f49~Dsd}EZ`cYQk6wa`cX;UEeT0e^O)ggf`#@yO7QTi3VNOR$bP(~#OP zL@PG{!HTo>`u4y1_ig%vfDp7-ZbZp|Fg9&OrwdRtz$jm&xA{I<#GOWsFmL{mX%BJ3C{76dWBrcFwo zpZh1deiqiaY*WeibKZNdG~2S@Hr(LVJLK7L(b2_PVejgw<^_byoacS}$@FyGN*29C zzjaFVmW_788ZJQ(mNZjDye9qAdrf|<{Wp%dh zz-i}xGen6v6n?fXU0JSqm5ak3LLorx-#F~!0!mFR@Hn)K&j@9+zxE0FufQ2B`}cpO z^7C$u&+xkfhuO8+pX0t-jw2sDby$D(Y)^Z(LC{CGr}ZoFlq%HAIJZ6Bz`OT))MTqO zqD6PdS+Q=@>@^RxC+9TOxYM2jR|3+A@0D?kZ`>VMzqyWXMhOYIH~4g*_6%9R1C3(H zT7cxp$b~O`Z|w|Shs7LI!;tMd&}Kj=Vjs<99MXXrZ$ZU59q2W(joUlWfK7N_?(q3` zJf3%;s8zt{86!vSSm9rb_xB(UK=Uj{_xxihaTSCuG=?5+)XI3<^#A)_rB8i&xeDvY zeKF*{8o1BKP}pkBuSc=citJAbI`HS1+6n)8 z-RO`YLG0C)=}2c*Yh{eM()JpN^H>4NzF~4l@>`?TG%k|)T%NcFr0Q_`yPt7>C;D{_ zSfa=Mo37Cc*kCeoNm6Rs@@;jcM{Y9eT%~+#;UMU&$TWr7u_CMClw)D}&-HAQL?gb! z9^vNoT7h>h@{M&`+5a(5myDYKqWb?`?~O;h(WwoPu^Zi_q05)2TUGC#zR#u1LJSP= z%otmHnZm0Jt@rQ1z#4wX^OY}#UuuJRpluH3?@miLLgq?zr|lc<()#a*NOyl^OYbtp zhW6i%fvp2?iA(Vh%^WE%w|kIlDrU_40#&sNcB60_y?jrKNyT1M^`3I^chPbB&#fj- zUxUfQdl%4XIh0@~f4GabG0-Jl=Y8h9|JR(PY-G}CQ<2#>;$?%s6+p0ilN5Yzhn<%Mk1PLKb^L35nxb}T&HX1C<%*16TR!f)xj}(<4?#_$y}LAD|8el@cr|mm z#mE({*7=!c;+>aRNrhTCzi|(}mO{#Ifc-E>?(83)^3|*F8aG*W8}H2VTSLb5a_w60 zGEUSp*gs=S+O1V9ynKjU$Bm1y9#=kfex1mF{vH3;*G{{%TWhEIVA&rST&_!}ew_vl zFBcLN5*lO)2`U%SDLANGP=z$>UTxEFg>opx^=Sw1&$l?3{sBpmEe=nj%pYim{P#M1 zL@s|g_*eTNIe|lZjIgo^4a$jNiga}Frt0Yq1*w4ISeo{vIH;8G7tNJSc^$k|#Nomy zV~0Ztsdcz=*|U@J=p8QX^m16-|tXb@bm{!?24RDHWco_|0zE1yFt z+Mqf*(Sj`w`O+FIjz4K1L>%GhSPK_@5Z_1}>*&}pul!9H3OKH%&X*mElFKvAk=7P; sEFfQ9^El?EyLeTCsY$v+(a(1}I8ZTn$0GkgSn6^IzqIb|j;nqC4`5>pdH?_b delta 61431 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 JWjoL9{{UXiv_=2` diff --git a/webui/package.json b/webui/package.json index 9a3f112..7c9010c 100644 --- a/webui/package.json +++ b/webui/package.json @@ -26,7 +26,7 @@ "echarts-for-react": "^3.0.2", "expo": "~50.0.6", "expo-linking": "~6.2.2", - "expo-router": "^3.4.8", + "expo-router": "0.0.1-canary-20240320-8a10e09", "expo-status-bar": "~1.11.1", "lucide-react": "^0.336.0", "nativewind": "^4.0.36", diff --git a/webui/src/app/folders/[path].tsx b/webui/src/app/folders/[path].tsx index a76c916..332cded 100644 --- a/webui/src/app/folders/[path].tsx +++ b/webui/src/app/folders/[path].tsx @@ -8,6 +8,7 @@ import { TreemapGraph } from '~/components/graphs/TreemapGraph'; import { useStatsEntryContext } from '~/providers/stats'; import { Skeleton } from '~/ui/Skeleton'; import { Tag } from '~/ui/Tag'; +import { fetchApi } from '~/utils/api'; import { formatFileSize } from '~/utils/formatString'; import { type PartialStatsEntry } from '~core/data/types'; @@ -88,7 +89,7 @@ function useFolderData(entryId: string, path: string) { queryKey: [`module`, entryId, path], queryFn: async ({ queryKey }) => { const [_key, entry, path] = queryKey as [string, string, string]; - return fetch(`/api/stats/${entry}/folders`, { + return fetchApi(`/api/stats/${entry}/folders`, { method: 'POST', body: JSON.stringify({ path }), }) diff --git a/webui/src/app/index.tsx b/webui/src/app/index.tsx index 0580b27..b3ab52c 100644 --- a/webui/src/app/index.tsx +++ b/webui/src/app/index.tsx @@ -11,6 +11,7 @@ import { } from '~/providers/modules'; import { useStatsEntryContext } from '~/providers/stats'; import { Tag } from '~/ui/Tag'; +import { fetchApi } from '~/utils/api'; import { formatFileSize } from '~/utils/formatString'; export default function GraphScreen() { @@ -66,7 +67,7 @@ function useBundleGraphData(entryId: string, filters?: ModuleFilters) { ? `/api/stats/${entry}/modules?${filtersToUrlParams(filters)}` : `/api/stats/${entry}/modules`; - return fetch(url) + return fetchApi(url) .then((res) => (res.ok ? res : Promise.reject(res))) .then((res) => res.json()); }, diff --git a/webui/src/app/modules/[path].tsx b/webui/src/app/modules/[path].tsx index 03b851f..5e54d94 100644 --- a/webui/src/app/modules/[path].tsx +++ b/webui/src/app/modules/[path].tsx @@ -6,6 +6,7 @@ import { useStatsEntryContext } from '~/providers/stats'; import { CodeBlock, CodeBlockSectionWithPrettier, guessLanguageFromPath } from '~/ui/CodeBlock'; import { Skeleton } from '~/ui/Skeleton'; import { Tag } from '~/ui/Tag'; +import { fetchApi } from '~/utils/api'; import { formatFileSize } from '~/utils/formatString'; import { type PartialStatsEntry, type StatsModule } from '~core/data/types'; @@ -114,7 +115,7 @@ function useModuleData(entryId: string, path: string) { queryKey: [`module`, entryId, path], queryFn: async ({ queryKey }) => { const [_key, entry, path] = queryKey as [string, string, string]; - return fetch(`/api/stats/${entry}/modules`, { + return fetchApi(`/api/stats/${entry}/modules`, { method: 'POST', body: JSON.stringify({ path }), }) diff --git a/webui/src/providers/stats.tsx b/webui/src/providers/stats.tsx index 81a1ee9..921e345 100644 --- a/webui/src/providers/stats.tsx +++ b/webui/src/providers/stats.tsx @@ -1,6 +1,7 @@ import { useQuery } from '@tanstack/react-query'; import { type PropsWithChildren, createContext, useContext, useMemo, useState } from 'react'; +import { fetchApi } from '~/utils/api'; import { type PartialStatsEntry } from '~core/data/types'; type StatsEntryContext = { @@ -44,6 +45,6 @@ export function StatsEntryProvider({ children }: PropsWithChildren) { function useStatsEntriesData() { return useQuery({ queryKey: ['stats-entries'], - queryFn: () => fetch('/api/stats').then((res) => res.json()), + queryFn: () => fetchApi('/api/stats').then((res) => res.json()), }); } diff --git a/webui/src/utils/api.ts b/webui/src/utils/api.ts new file mode 100644 index 0000000..e84b678 --- /dev/null +++ b/webui/src/utils/api.ts @@ -0,0 +1,17 @@ +/** + * Keep this path in sync with `app.json`'s `baseUrl`. + * + * @see https://docs.expo.dev/versions/latest/config/app/#baseurl + */ +const baseUrl = '/_expo/atlas'; + +/** + * Fetch data from the API routes, adding the `baseUrl` to all requests. + */ +export function fetchApi(path: string, options?: RequestInit) { + if (path.startsWith(baseUrl)) { + return fetch(path, options); + } + + return fetch(path.startsWith('/') ? `${baseUrl}${path}` : `${baseUrl}/${path}`, options); +}