From df61291315f2be3bdb7b317c2c016a8b867ea616 Mon Sep 17 00:00:00 2001 From: Maximilian Krause Date: Thu, 3 Sep 2026 00:00:00 +0200 Subject: [PATCH 01/56] docs: refresh README --- README.md | 40 ++++++++++++++++++++++------------ apps/docs/app/repo-banner.jpg | Bin 0 -> 1153475 bytes 2 files changed, 26 insertions(+), 14 deletions(-) create mode 100644 apps/docs/app/repo-banner.jpg diff --git a/README.md b/README.md index 2187eca0..4cc9ff0e 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,28 @@ -# ๐Ÿš€ react-native-boost + + + react-native-boost: The React Native performance compiler + + + +# react-native-boost -![npm bundle size](https://img.shields.io/bundlephobia/min/react-native-boost?style=flat-square) ![GitHub](https://img.shields.io/github/license/kuatsu/react-native-boost?style=flat-square) ![GitHub last commit](https://img.shields.io/github/last-commit/kuatsu/react-native-boost?style=flat-square) +[![npm version](https://img.shields.io/npm/v/react-native-boost.svg)](https://www.npmjs.com/package/react-native-boost) +[![CI](https://github.com/kuatsu/react-native-boost/actions/workflows/test.yml/badge.svg)](https://github.com/kuatsu/react-native-boost/actions/workflows/test.yml) +[![License: MIT](https://img.shields.io/badge/license-MIT-black.svg)](LICENSE) -A powerful Babel plugin that automatically optimizes React Native apps through static source code analysis. It replaces standard React Native components with their native counterparts where possible, leading to significant performance improvements. +**The React Native performance compiler.** -- โšก Automatic performance optimization through source code analysis -- ๐Ÿ”’ Safe optimizations that don't break your app -- ๐ŸŽฏ Virtually zero runtime overhead -- ๐Ÿ“ฑ Cross-platform compatible -- ๐Ÿงช Works seamlessly with Expo -- ๐ŸŽจ Configurable optimization strategies +React Native Boost analyzes your app at build time and automatically applies safe performance optimizations across your React Native code. + +It eliminates unnecessary runtime work, replaces JavaScript abstractions with more efficient native equivalents, and fixes common performance pitfalls without requiring you to rewrite your application code. + +- โšก **Automatic build-time optimization** โ€” improve performance without manually tuning every component +- ๐Ÿง  **Static source analysis** โ€” detect optimization opportunities before your app even runs +- ๐Ÿ—๏ธ **Move runtime work to build time** โ€” precompute and simplify work whenever it can be determined at build time +- ๐Ÿ› ๏ธ **Automatic performance fixes** โ€” correct common performance mistakes when they can be safely transformed +- ๐Ÿ”’ **Safe by default** โ€” optimizations are only applied when behavior can be preserved +- ๐Ÿชถ **Minimal runtime overhead** โ€” optimizations happen entirely during compilation +- ๐Ÿงช **Use with your favorite tools** โ€” fully compatible with most other ecosystem tools including Expo ## Documentation @@ -17,8 +30,6 @@ The documentation is available at [react-native-boost.oss.kuatsu.de](https://rea ## Benchmark -The app in the `apps/example` directory serves as a benchmark for the performance of the plugin. -
@@ -34,12 +45,13 @@ See the [benchmarks page](https://react-native-boost.oss.kuatsu.de/docs/informat | -------------------- | ---------------- | | `0.x` | All versions[^1] | | `1.x` | `>=0.83` | +| `2.x` | `>=0.83` | [^1]: Starting from React Native `0.80`, `react-native-boost@0` prints import deprecation warnings. ## Installation -Install the package using your favorite package manager. Please **do not** install the package as a dev dependency. While the Babel plugin itself would work as a dev dependency, it relies on importing the runtime library (`react-native-boost/runtime`) into your code, which requires the package to be installed as a regular dependency. Read more [here](https://react-native-boost.oss.kuatsu.de/docs/runtime-library/). +Install the package using your favorite package manager. Please **do not** install the package as a development dependency. While the Babel plugin itself would work as a development dependency, it relies on importing the runtime library (`react-native-boost/runtime`) into your code, which requires the package to be installed as a regular dependency. Read more [here](https://react-native-boost.oss.kuatsu.de/docs/runtime-library/). ```sh npm install react-native-boost @@ -83,6 +95,6 @@ A [short overview of how the plugin works](https://react-native-boost.oss.kuatsu See the [contributing guide](CONTRIBUTING.md) to learn how to contribute to the repository and the development workflow. -## License +## Built at Kuatsu -MIT +Kuatsu is a boutique React Native agency specialized on building highly performant React Native apps. Visit [https://kuatsu.de](kuatsu.de) to learn more about our work. diff --git a/apps/docs/app/repo-banner.jpg b/apps/docs/app/repo-banner.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fbeea83411e3a59ec2cdc5b8a4ec3d3a7d4ff19c GIT binary patch literal 1153475 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

t+;c!|Gl5E@meR~FbH!<7&D?u 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

K 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�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ଟoi)k*n9z;AsN*lc_ms67OO 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

=L6w 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 S zTMvbR%yzhG{W;uPQR&jIymFy|g{n!eY75z(8t0P4EvjL}i(l;o+@tcfdl z;Wv^t0_J9%LE`gh{ojB0fwh_4e$%OS4OGH@*W~;Ie>B}H6kUFH3N|M$r=X(<=e>

;p{_aL)wMc7MsSb%%#Pp zc!r)0=>IX?Q$QRt8ini}BMq+M*}Std!DF-)U58;kgvhA@Z&F<{1^OYNa9-9mExYub zQ_U8;W6lyc6ENx)#>~4rleD)B{Id$;Qlgjfg!JL!qy7Dh8AVHf8`)SPhEYEIzezW4 z-~K6u98Iyn-ftPTMR!GIbXx}D`gzQ5VV8bC{cTpCRQT-s zw=_l0y1*XMXyOa8EHlKs_^9qhb|br1x^{|<6YjZ{dnjCr#zhaxy1T2q|IF1aLh48m z=|Cw+i}ZLTb<&8z0&S99fRfzxB>%sB3lZdHTBz^3{~$_mA>d zrtJNqNk$jPjP0FPQLx)ecm7?aKAJL0^0Rr`Al4s}WW}g`3-R0xb-sE$$9A6kRodHA z2U(MHXL77ZEtkj`cFm`q&9Qf*z-pOs$>PjizJBvKU7j5!c1>Ae@7&iE8jppYzVy!- z+77!7yDi!jZGbrK^9SKA!C8L36!Bh8UwdZxpmZ2l=m0t&KvyRsfwv&y#E&EoGTpW8 zLJ~c-WU|-#SSDPHED$;!5w+C}ZB=3$0af_Ix1Q5xNe)^0@L5;6N9hZ9ATj>upQQJY z<1ul$1e>lHB>k}{8}~bQ`dXc^th$buf&%oD0-AqB67BjnHFCyi4@Ir~bGU%82592c zx(^@1Z=Fef|4h7~dtA6B{f=0US@X>K-=EJZ$f@M_LR4bUT?ElPOOe7;+g30M^|d7=6|Ki zPd^wKEeFDM_0bd~xKtC*_1I=8#0Elp;C?tz7*2&=RPDLa5mu%@vDb69^8UAwGgZ$=p*Ccs$M{RZSYSl;k6plHLf-5dz zQ?L=X9^(>?S5bt#ajW9yl-T5~qp0LBM|@cQ^*QZU)&4#TrcR_xjk8c<`O2~UioBzPm9ic=(;v2t6w7X>8d6a(fJOiW zK{Rd~W9yNZVCzI5$)Y^}KaQ@$pQ``=+dC^nMrO)h8QCKvMJYQYBi*>J%#eFg6xp&@ zWmURviF-nmHRZnxNtqC z9TtId|57jTF$S}C1G6b1t7YV5Kn=bn*ICy^WKn*tNBv3qO}yl61mzK3ODijsIEfM@xZfIxyDd zRO0S^u8Y=eXC=)PW|WCtZt; z1%oI$ARh5~-MR5TUBl9ZGr-K+k%ehgqfa`FYgzKO)I;ij4^=Ce0)VB>!MKn)z3XG5 zY!`gYJ~a)8C;%LqB#DdT-6X-XXyr8)X(jW`iBYEf zUydVGIo1`Rz*QGEQ{4_oJcN`Xu^R6+goPF}z;mz0Z8tIR*;kzU9@k@ofN6ofu6k+) zGd}nMX%{fhNQqtp$=o*a&dg&EvuU(;{U8ElP@Q#Au+EMUw6YbypdFjRfXgUvG?!aB zB2uea7fxp>Cq9EWJ?Wf^#pA1%S1r)dFTk@h$Yh3Wh2rc^bW;DkFW0#-2>AepSh%3P ziNGK8t4tPV37?U_9*%Qs(5}FAh^d(OYt%sG8rdy75r7y9OO<2~j`ED6BC&oyC^m%( zPK_ELF3nMwlQ|g>M=yy<6W1GBCc&uDGDC0tDIlR=b*1D$_qD8_Z~JN3OGxHY37YKn zzL1bIGAq3%!ZY4`gdDekulLF|N3n^9;OFGJ6`xpX-bE0?3!Rm|p499t=9 z26ylUsCm1SGfOx#Bn633XyL?%8mBhb;WHj(}_)2sXhK5rDhGTKs|Q z88JaM=0MItQA*Ls1D=uJmn3o=%}e75&Xd4&lSqp^9Y`qqrT3BSWe7EWGSkXzVpYEM z`~|bzinL1nZ{M|?W%g8_xU;GaYT0O@-S#*fSXfn!6CQtoe|l`UM3yk;p^HtcsWD0W zT>WDg+A)hedU2HX5!0bR&ZZUTa)`P1pECS~aH-c04hg&gr7t10d&ga_t+?@<(`Bon z92?mkc7spTA=A^SCB(XjSM(MNpm{v#;RB-ltz3b)yt}Qu-3I{_%!||dls*l)M0;IC zJYb@ZjGh)F0_ao$F=!RLJ+}gyAv*Y$pXL~b#wRl$nKF5UbfGfio z>T8}WmTuehwMzBqLuPd!znFHeT6hFHH@TbXGGqm4bZ@~37&jKpd$i=8^vLIlz07ic zA}`0j+rY%3nsY1@!`LdwFleBF-uwlj!MX+G4o(Ljm{s0L|32e3!t}UR=mD$GYX4HV zpZ)`R9>jubOCILGZ#nvW+~2B$A5$&JKFQ4b$*D2%5u5ejG=i)&AF`qJRvR%!DH5rp`J18I`E)|X(SG^ zMi$L8x|e1fQf{rMT{sdRjT)X^mh69ApvVfZ>okP}k5NvkOZzrrxv{VAY{@LOP4Lz` zy8<#gn91o@$}?8E4{OX^oRT0zsJLp9Lf0v@!UzM8RA6Ppx?gXTJ9^^hCON-L_!{H% zJbK92jI{#Sf)V$DjkHF_J*1sm1pRf{tE*Z{o6{7Z2b~=Y`?q+dudy~VcSJ5!p={)? zqfT~ft6cf?qf-hcZXF||7_duu+O^yI9VB3Bbi4R-H>+x^MCxf@7^Pq9RkB%+_W_@y z=`mnWB^sM90o7eTT3dNThallTL>XTpy2m<-J%#~!E8~6{1L`T0wnt|>5V+Pm?OIng zQ`yONS^2f7Z&H}peAu~Z@iYSV;q6Ky33PF%hypzye3JPH$XO8-X)$>y6&(0qV6gw> z?5nVdylQ=8^E>6)Lk9p@a7Y>n#@y5az=-X-W9k*+Uik6ge?2T5yN82&du@6Gv6#6o zn>ij>fEKNKm~+Og@>T>k>P*53ZNZD?jr<{=eWiVFJDSQP8mOtX7E}63RLwTjprEl(w#2_um7QjO^&RMg@-`d{^x7plS*MvxXa;utv4|e#L*zJeR60_ncYWl_7^w znsG=x0?l3;L-3*kdx#gP<#mw-9Hf8 zxTuqu&EKg9ld31ss+R}o1!3nvvQhJ^-H_X4w!kduSye?b!!NmQW=41H2)i4oC7KNG zT9Xf!dSPS|q51)BK@ZA(O_s~p2{XGnoH6iFK9SFfpxNEe?BYcSIF)33FBovIiEK>8 z*krLJ&vNkh)|4lVHrF7%ir0(_l9&^1FXT}HxG#*Szr(Hk0x)THUGnYo%GENNlL8lB zJgm9ZW2QcIX54{c$=pE3K86a=bPVX)P14!oZz@x}#tP08J4HuNc(!nQIcADgMRE-L zFlrh3l3pc*+pKWiU@fR7End}d@91tJQL5(jgvN7GuuGs1bb@1Sx2 zfU3gH$D7grV*tdFpIrIsY=R;;RE}c8KB*-3=gcOKrf)$X#1NBE+=Dy@V}Q(H<>NLj z;SX-ebC-@8S?Ib+m`MjvfA>ho0mCmdX}XsB42%Gn zLmnXe(~8ZG`CZqIhnZd4q?9wwi9Ij;!p-kWvaxI(Y_9-QrU&22K0Vj0`MTJYQx>nk zxEqppvbn(5fqf*|Y~ETs*>W0w3UfVofLNi$=HqmlhWLsU3&S<#G{8w_Bih;$%c2hY z()-fe>VK!=Kqt_Io}=CMk~o(_Pah3iiEEFWTo~nezNr^n;uyBb(aqp1TL}%j>HMqR zr>;VTrV6{6@^x;_W(mS{+|ZvV^g}0B5t&r9UD`5j<6rHjKIo1(uz!&?#cCD^Hhm2)zUoc~WD?H`f?>EBDyZ*4cDJw~iEs zjT@U5Og4Z+C&1^_JS?s$MsA&K);9J{9d7@k5wc!XDG+mt9@Yfni-}x2&w~9mue+Eb z&id25R|m%}Ba&x;?Hd(^OJD_uHUs+UiIZ#Z8|4cgb2w@UyQCl&ZMqcYkiozorMBPhR}|PqWuLyO)Z$60Apg!2doq5x1rIb@;Y|l~y(Bs!=bYh-QC?lZ$qtTQC|FO zP!h-(;r(GYJ}*JeFReuS)Ke0=t6<-u7xPQx(oLJ0RR;S;a;lY^4b227g&~b2J zFiMW|u4sQszZtcQ{bJZ@csOkz3*6JSPnJtvW4#LXDR}uR+4tk`Q5d( zEgmqR?D&20_IT4PfS3EKn7I9mz8Ms^;5@_4f0#)gH6fxq6-_#%zzk z;9m$F#K)Va6S%PekOO4EH3IJ|(R)|CcBwm$*g*WutEcDvQOix@IZLBNC)7Kdf^#&a zOEM#!pD(%p$*oZw%`#WBIjIvr zR9fkZj2Pegsta@xG~-(i4i0c{s>NF-ffh756TM9Q)8hrRkGM(O%rYj&Kl6YuNnb8T zyd+610R3O`6^3!v-Ny!da{63QM-bgz3=)1f-)-`}AWO4#yJwMI->6U`DkgXe_Y_Sx zO>B#FbleE0C49%l)}bn`vyZgRFA0ppTL*H+I=M}BcN9aa-_EgVc;w|T;9-c0_PDOz z)5dKQ{nHu!1%jskMcP1{pIhEQ*nAA^6XcJgq=Qn+#xV{EPdjEyZVnsJNL>l6c>9Xo z-#Wv@Uqv(Yac6bNCBHWkf`m(kRX2eohQjOo#xl53v(NN!X5-ESuB;m+ zgZ)B`|ow}~uA0hE7`Qt=YF~fj~dvDG;N$vcem;)Hr zdu%tM$MDDz1GC4Nwz@)!Wix*SMZ>aH(XqGO3Ye4cX1p=FKMwLiPmQ2afN_#JGzsAe z^8(zVhKDnSYkggpTW@{62~m8J(lX(iqJVC7|E3Z!sC|j^qR`i*9CoLlcV5MK89zOV z-Xxuel&I>WQTvruA10XN!vue4SOayy@9*)HuRMc5e8Xu#x7a)EWXRMU0k~rt-|oy& z0fJ)fi~h^T)$Dj<%t*x9f3i%E*WS2@FAgzXTS+qL*>o&|1J{A$ra1&&I*kpj+KZ7J zdQiw7A$7pxrnacTNco|6FJYF6`VkuH00Kn?ZqQwS8y(zqKLOs~F4TG%~qsNdCH9+e&ZrPO*Zx27r@2YTF*IF!0g^Tm2Q3$H1KR#wQ_CUh&MMNmsZ?JgH>_UIDA7OMTJD}L-sCo*$LBmVA#}}i%v62i z+F#64e_0H)9WuQmlNz<~O{svd|H+)~?c%P-iEQ>ja6)2i?JpceZ*2onWWMuhsuK;_ zSeyUxS+qjJo;bqQku!lk+bi5FId1N*`TT<3Yu+dNxZ5{T8?}JG89U$W{b-vCr-knS zw7X%Yq;`;7KBm;hAfLrwrSfbT>7J!^o73pCY-O4|48ZN&-V23R;lqRPe~e4{XRepv zL@#P5yCVyX9oaL4`FUs2%a(?`nL6&E$ z<5OX-h;e2?cDoob2#DuDXx(X(JmlxAmM~&e@6CG(%nzY4-JPF8VP7ciE@ZM+u(?)d=eV0_|a#Y z02|{}eR_bcU#u#5TN7(dpAEX!7F&&pU`8&|y$d2_ZNCRNbBouP@&}}5_~w@u5*o{* zJm?h{231P2KzB>m2wCg1yjx(#qSEEC0runYDaqqN>GH+QLDy&wxJxE@YO}TzT)%!O zwKI+dQX^=gZl${u#V9F{j~|t&=sVoK)MFma2|4Zz|Ma3G&)`__Gy+OX3097F96#9% zZQs#yyc#P)Jl9s_dp9&p^tl!LDg|(+GBK|Di*4q5HUd4HY73>Y$-i)cxK8xG_N%dg zZ#89gKmfy=B#}jCtG8c@hD>!C*#Xp`HNRLD|7fnOh{`q<-M&#zz{clUO$`e?)BR;u za^bPLQaBvVSkmRkvCiqd>!3Px@z5KJ-as9!?|THVL_`nIcqW~{CLe6XMc#>Znp6Gq zCfavvDZCq4u(9aWtg%$;WzKEXjl`hs>+#`ImD$5I7sOW_^+asy8iXS_wQQno)l8#T zIaEK~{ywlt@s+IJ{UE1baVPZT&;{_soe1H#;DJFOCr_Z~jZH}C;UA0d33AqMgXSDb z1GXe62$^Tk{0vujS#K4O^{y(wuDp?_c1F6Al|JGAh?A^hGoH>;w97xJCiXSJxZ)qw z9o-B@c~|JpY`&8^T;EtESzWrPzGoA4_ydcH37OpANax8U{xTrR`wD?F1dz)OJ1P zl{NkZzkwY=A$$gN)$S<|NUL|wS7>qb`0nI&6+`Z01Lvs$r41wq$f+$FB75m-51ybCMXY4NT&*qkEB zc6{dFkPl9?W9EXoa|dKG`&a!L#G$#5%s<#&_Su~T0g|yJ_&_{j6LC;av@aSM8vXda z)MwG_Ehfw)M7#2ngY&qFkJpu^rmptcEkMo0{1NLV=u?>82$;hkW{Nynek?JiRC0Y) z?o#;md^Dt(*Qh&=)InqxjK2Z~LjE0Fjqi9xC73pRefv+g;Gfi&HEXt^WuJ?ee#vkj ziih)n&a${LC{s+P|7`p|5@CgP-iwzHunsuB2GEs@{88yofpC9V=hI zxT3iJg@rmqQ2jxD;RN}wbCt_Gpu4W>4%kHKcn`4~dAH?hdC&Vtb5}BZNpW)vk2EF( zE8kq@rRJADubqZmK@fZFPo|r8BZi`N@`_g=1!phS*G-funD}v%bi-p=J@r|Zqke&D z!7GG4!@R$TUHEulX+4U}@Bbp2>(AM?V54&0-DdowTcNm&(;)PEiV&3r9PpO@S1rteCfp;(8v4T^|3&0q|0%J)Mqx`A!_|t#4r|s2`O=mF0 zD+=;?IQwe#A-sy!1jhnUL^=9|hasOO36sJ9WaWiNUmFPXbXeru#f(dq&DZa8k}}c zq^bX|yq0dvm2UOI`3{B}z?1DLbh_SxY;ZtLpHPzRF8=C#iuE~$9Y5_2$Q)8@TLZC_ z9}N5pin$T=X0h^D8QBM0R1|em(z$~^*8dZ&z(cxhO$>YCYW)g1thAz$~dqAGa}6*f^(ZTK}W5!h?V**zTla&YEbP6V$PAcGAiVkb`}#=w369&Z}+D zxn$P~R7cX;7W42>5zNGa9N_#=`iw(A_6}#16C*A|@GN2U7q#AL9)vyh-#W;utSa@* zkuMJvA0$obFB1|2E7D5@rA_{bgb92lpSz$bCXta|0rYqQP$xMUh)JBoCBViPES-G@ z1zx_KACW0jCBMfdNx6N@*r#;)R~iWY`c+s6{0Dc{(5iS$Lnxj8Y=r5{wVtpzp7$3b z4~EuEo`o5#J@n-U(?En1>i58Es)^Ur-RZ$#)L`o^QC-Pbf>S(=KLh5O7O4b>xbj;k z1jOCc=3h|I-#Vvr{$O)C3m zd_irV2eS0~EZJX%gUeX55`}^RjmL76suym;0pAHvz_qzzKeG`uoAcmYv{KB4?GLAI z`r{x-eU+o5xhlc=2-f%4pt#y!Iwzg!0ADWA#cSgIWMle)qxBZR2mzxyymxFn9-2TH zscp|~C=gd*wWH(^QzZ}!l&%fBAauQlSkCzi4pW~di+6Su>}~>4XvNo0ou8sWs7sm2 zG$WbISOO`U0K~x zRhXbffa@DB&$iw5 zXE5Q)MZX;qWzPxkaXiX;lt-Yp0ND4LLsbk_@bGxb^va)@r#$z+g>}4u^5m9(MVY@2 zbT?peA~zlE!=|ADu!<8Ph;-Gu>C@Y$5dmVCxzcZZGmoZBJmWJGQP5IGVajEH8sc3g zL)j#sR#w2Y=GBuf+oz@|rrLvM^l(6mm`I+Ob1`(KLg;nh+2)g+GjZxbg7bW^cPRx9 z0|cj#hiVKluZH;})pmrdqIYwJ(6*C#n$0|GiJbbt)R062V~V{FPm!moXO((%z)JGB z8{Na$RYpawP*C8I@}$g8(a@p#c-5kVlan1)aSVa>$nyL-r!R(~A&rcE3|hdnz`;}{Y<*0GApw>gL+Uiq|O-~8Yf+ghq~fyPqVN`YHLGCXx)3@u&B z>k3#r?B6PT)2;5vc&5o^vr4IaP@Q}&VqlnUnd2kR5GQq0v2iXK2V4%KAT_+?kHKuMSOEh#MNW zO&H~t)_iJl#T<~%c};a?9MLUayaxfE#nRmsKyJSG4VgdKq?0>1GdejU-mW|4UtlpJ zvb`KWjJeFb!o0GY@8W{2nxR+4UIp~Q9&>NWJiU1~;{^P>EZw$l7PTFQ3mWY5i=TV{ z)IaE$0;CCx&7J#GLoHhBRSs zs;?k>BtE(a8p!V%iVn)r5Jg>%7Ol4|d4L*5JP>P4UYF?X+TEaAq3lDt?B9-P3I5gR zzGx1!nT(_*J)-`neBWDP*9y56FOYr9#EF4Oe@Y&3V8-~g zN_L9HiQEwiGrE3JyIKq-iPNYaP6r(-m`3)=07|u33dTsyxZ^Igl1BMmEV0h1(fP^Lm=NhZXvL{p${WU|4 zomn!Aqg&|V3Fi3z-+~j0vd<5` z{E1#emRi~660zQ)i)N75my}|un0AhFM#`PdjbAbBL6Zv;UQ{6Tvr2`D&A&;<;=P6@ z2Bdz$fOo+7Nr;~4Ag4S$3R>~>h~BK&nGetqf_k@QQ!GBE4d-0XAt;CDug1h?=}Iqa8=0iVPJstOgU;Br@xj6esa}$(YOhRhCOBIhdA`}e+%7%B+pNd@*o|M zY~b^7)`zptv{}jgsdI}WgMmYGT-y!10O@763}~MKL34vnPVs7L5US0>b2JTk)xay` z?#{B(cZ-8tv0DtakYiIU@rwAq&rB`2$2r?&M^6y2_nv;8Hjd}X9a=37wvXMtKR5B8 z0MCOjdMKO6>iV0Mq23(x1;)^}MX503Jta@9{X;aYd$wfgDGCslOJB6jTC{th_SRhC zaiYZiRL*`o|NbyuyAcmy-1v;OZ-}}H+Wc!LAb#E`O^cVBoZ@OM?B3)M>#aFN4ALQN z&Hw?{Xc8;do*oD7Jl$8+OnZ2S>3W_8E97HPG zo1j`my3bl$aE|t_#|%A12i2C?ZBW zF*YZ14gYMiuI!2|=zjR*ZU6qSHOIF1&NgcFvvsXprt|ORl|Pz^@&CTx{W}b5^TKS7 zkT?x7n=tfBbnHoulkMF>=ke=>iov=L=XQOyC5SaBmWZjjleaR@GNj3~S1lLK zF&`E_LE8$dEU7u1RE`CfdZ)b$KG?r1HN9`Wh9Tkwuh*0;BXaPtwR#8bj2M^yYONY^ z;NPZ=m?@E8U~1b!bV)5Ebo@)Azl!MYS&?v?ouh58i0Q`%-Z4IVZ18vt(64)9u9801 zF7%`~{L2>w*sEi5vgk@1C3i8>++x1&-Kt|SR z(UR@=!f~T%5`#UA`2xe^4X1-me}9u1#d#SYlae|5f1FV!cmf3x^XdcRSkFSKnVpTo z#awMKN43*uIzdN?=n0kW)xF;eH7q;#6FL2p-4P^U>eyrdOW)l*`8j&lrX#=YtveTe zEj5Q}>9^)YAqP8as_xp#c(^>x2#|nDi|ecq^GABu6!glQ7(5{cl;RA2!gt&bb;23A z9kE2_Jlz}(>!JG{jZ{IdLj93tCEPQqXLXl4JB=YH+~EH)2nPBlThVYOLN(dV+SYIK zoMgwNzbubN4Jma9WO?jwl2DZB1HOVTQjQkV*J(6kC6_mvQsy{{(R0$^SQJRMlP5}2 z^MLVDog|gFeeF)3mbv^Q>zWwlvl~hH1;gV(p|Ut-JfL3{QdYx2D?LxR5AWulf4s_3 z=$uwF|JG`pyT(e4aei4$?s7(T*j!`lFK>l+4+|x-_WI^cLS2mahT#dmi|rg_7Ue;m9Tu;O-T^TMTpwUofoOgAOZt z9|!!b-hnT#3t5Zxm5=;T&?~YQMebg{9j+<}Ixq`&Pw<5?=ywOC>Gs#+f45t~N zrO&mT0teWjV^x{9wBXE9y3GjwulLzqIu%J`~_uoAFtvoqz#l)^LQG) zrT{0CmfmH#e_1K8iJ7mU4ZPMWDY=6>@Ts0YA)N#6cz_0izM~&5Ox6bSVpCl3ea~8C zO*`W)?u1v<+c_y+Xc4O~Ly%CT6tZk)b-_sPT46%39h<{gHBsDL zg3m)WDA@BKZfJA$O6aa<%)XpYMcLRQV(?tjbA54hUM5uaSro)zLMV8F7TtxJS&zYj zO%-Vh0A}sf4M^vxZPR-7L~w>Ryn7%N-sbD%CeTuh^vpi|`duLbCLX+gext4o)(4z# zSC z0beEd!fYQvZe3qYw00B*JRx*U9T)y2uJaVi$!}UDD8Rc5fTFZNPnfked;70AoF9CZdV<*8`LP{&=A6?%&W9?h=C;BaM|U*R`^Oj*YS3*l zZp&%r^Ky6$#O#~j$4zhWNh87&R0~K~u+Fu40G6A<(yo?4J|07Q@?y_R<5L=eY3S73Th?W@cBJg&)%(t;6%zko#s!V&$C zjOg5;0kcNWl>_dwh`QO@mQT859H*0eb&P7XeVd&^8cv{{NjRM-k(8kwI2+pR0_22j zuE9H6KeHP}4i_h^380?^H@U<2c5^oG^$b*jvj&6TTpR_*@cB_=g6Og;d;;bL2 zoK+rf`!PChd#$C@XAS!2z!BS^EaODHYzBSc@?fs!%q(Deb(kFq<1=$}^?Z$(TXA&> z!!h&{3t3Vm!_5?B?6w{cIC?mO)oHQx&VhOY(YET687D8i^}4vIoP1~>Ltl>mIxo8u z2ogkzU8fndY{8EWV}OF9G`A&z8MEPVQOTaSAyv7*%Fg74bBR#GgaS%IolYA7z3YWe z=-u}?LM_+_9{M2r$$f{L4?B8iCghR-#>d1}9!*(qD#<$)Ds0{guvIUOHQn9q}nU9bnR4^5Mbl@iLG7!!}R9r$pAIXNcq^VKgSJig@- zj@5vfjt~Z(!ixhLvnl!4afA^&IcH@#L+}lKuGWyn&-#~9h6y$v9&kX%=q0rjuM7di zkBY9z3K_d9?$LvtQs-FjN~AJ=Zk_MT(;tt!5Rq^SSwYz|VPVH67+DcDQ7d_O6W>{% zqFu1^&kQC5IR@UEHQ7p96lpRR4@9j3S=<0q{nLf@cl5*DR~5hSG=ErL6$>3@6u-;n zRn1`U2wbOsBE4g%hH=1S>xY`{OmaP5hv5E+;r1s%k7qu_fQWZyB3$5oY7PY~me@eX;+ILUr$(RFL!m@&o>K$Ld zrZBf4mZv3`KE+xl4LInX{V^FI3+rCrrbS-B)34p?DNZ!w8kvv|6*t)(JBr9$lViyI z7H}RY9PCU%eLsel@#H=)`&#VgzjA9d)r+2x-v5B-{qyqA5AJkF z8`|CaXy(jpu*lR!yHNKEU|k;>HlCOk9l&J8SS;@CstSY}P^uM!h6%cQZ2H4Q2F;yw z%D}}zd!#$PgErlqKKMJ5W3F|>-_9&bCMRroJH=2)`+o7|@qS7)>3J6DFZ_6OdVzQ_j2LFB{_cjJ>9Be^9)1d(IkyU_oM3<UBOH;-NlQ5LLA)M~|u;v2;!l^^YuQ=f49{(c^A-nJNS@Nv z_idCXf7_O;sm;?ky7-&3>5E=ath8r;}!_3b)n*Wne^VsYk7YiW8qyy9x%}U`t7brnqH%z z>GCj8a*&^&fW()3B8)G_hA2(hzsso~S{xpi+HKdi17h7(hvB)}`q508QczRit)}Zv zb~WK&`ZWkf8DgK`+TP-z>;bvnfMW9CC}g1Sbi3Yhv(5ck^Yfaa<{)4E>-A1o6O1q*1N87Yi?~2J1_*kWwC`vz3kV*L)KF1d(C&^Dg_@6vVD}gr^bq z2&U$B`S@TWFfX!#?%9rV_A-73`pM0G9Tyl3Of?O9dip)3MgBVmbiZ~hGjLc#d9q%J zg7b@sMD~Xx0HoxTNEjZO z@EITmd;G>fI>`w0WG`I}b`N*&O_FSe=;YZc>*902rBq}OkD)@f&YVNi^ynQx?*9fF zRXay--*L)+7--vMHb_WjBvSiU^;K-{t&}O5SdJ`U+erjE9|bb)9NK~XItxuH@wk@E z*L;2VOna;@n$*kj3SBI0xgy7FpEE0F#KTzlDSvm9utK7j7{~jZP;JbO9y+Y&e0uL( z{Krlx+`0OJpUAD)d4s_9i0fDa#%u*_O2$8hf1FR8o1ZwG4JTWIL@VtA!x%E><*)16 za*u93$nwL|9*CST77|f&CZ+QoA3le?vH(P#WmaDouO09n4tl z0d+XS;w0r8kQy442MSe7QWkm~vp(dA;#SDvYY1)31z&K;hTG{ssN4y*3Ffj+%6#C9aV}+FxgeBz9@e~2I%%tne8E@ zP_#VX)7j*cdKfA#=*@uo?x$;4Lnl%K#pZ4?zw_Gvf`MVzEe$m4Lb1Rz+R{MC``tjW zY75{F`dJnX^Q3o`LYbJHkE~sEO_h+_RLM3*)R}SUhCU0DiAekqAA>#c_ksBoQTfOs zqQ$ZQh8xjY&cFFbWVcoH&Rx)!O3)v9oP0ib>}V3^;xqHzJv5J^Ry`ANp9gXlQ#kzX zQ>DkC^%(kv0>fVpqsrJJA#dO!?u0I`v}^;(CvQVzpO5nuA??CFS(a=@`t5mGm=Rph zfqv0)J+-RZ)AWVl9eR5K6r$;ONlvLJ4PQ_YhKaJw$p1+u`^$e!Zf=R8xdLu|Sr_|> ziIaKcJI~@m_SQW6_&f4nEFz?lytj9xuJGk#W|9OFiI;kp3ky*H6#>=%>4Ar$H|bDI zt;5M732QOm&UB5@p|tDPgWUr~Y!~NwuU>W@57WO2LM~KIQTu0(2t&ZIafKFYqcf&+ z={B;Z19a9RC4D$4$sM_?K>z1@CzB==ksf`pzkQ_q^d#y`iUQ3S=>v^> zXWUy@UoVJZx1KqO{N<5yh$+i%7LL%}ey72v_aNUB=13Piq+VMsMTNGgtVwD;zT z8GwCE=w60=C{#(P+dE?K^Ksj`mz~_U--kb*9VAx#=F$G{B=6*K(Vlyhi>(%umz-5Kq9}0Nr9fm=t+_rjEu9Td(QA!TWau7-!HB@`J8S5~OgJnR2jD!<53 z{`a{cGz`d!;~VQ`W6v74fj&fLdv|qW1Q8$O9?fK*&`YkG3D`Tp51(FW|7JV8z*Og1 zJfSaYGQT&CC>rA{qhFw68ZlY{Eo}*3KMplx@}>R=+|vxdZ3lIj5+7xJu^=s|>FC^v z#;t779^RZj@B~i1mD8{SIl4XRtngjc5osQA7ESj1gT$130p(!%F3g_k=sEis`~Q}} zkKZlUSdL^}T9Ja3gc%ephuIWT!05ALD%D{G0{ZC;)_H}pC4%wHV6}DrJ!PjTu!4M- zO4i-;)N0#28^mrx{H1D&*o0!rK2AxWSOyMJCM8XWaBT&sM88h5 z;{iQ57e68&8tRNY0<~2QXKHj48y&W&HJ`cS8|Da&rK_ht&+#;0PnL zfkU^S{JoM>NqsvBpJqeK<347I%V*S;1vgfNbe=o7kLce;U4za+-U*Uy$GY=oI8{aF zge|f)E9L_6U0Ywl98-Fu(p=7r#LpvVy)LZH;hth@9J1jD7^)T^)IVnG3CnC=Xs~09 z0*Ud?GUa_QH4sa0w2mkbHQ>%q1nd0@MjRkV4kWv1Q3)6XIw4ec2qaI2cov}8uAxX3 z<~(+!!dTvLF_Xi2k-rI#oMIsH8=Hh3|H%egZ7{WCOeXA~Wke7pOcvR}f8`gZRP18# zg9j+z(b>SXw2;gip5zO{@vwZ4Bdo(4xN;}F7Blkm)qVc5)T*Nom)tDA%!#ufp;0?> zM#_vi&^tMHH46Yfz3PdgWP2WXB%I&|N27Az@vRBRMIosa*naGa;3Tel>a;}`p<*iV!sKa4)`U2+>BfZmd? zdC!672s%g9MrFcM^u~1k$Uo)Y9J>{6{$Y;M^ zC+yKo8}S1JMqj!ofGw~n=XDc&VvZ|M0OO!OagEE^Ob8dML{M&kmiqj=>~5$AZjX)J zZY9U7H1&VgZ!2WgJ1btYV3?4bqRar%uw7~$edvthkH|u)WHro5bJ{{?F|UbylVt zz60DS5U#S=;5!KH4Kz(s(&zS3bwC0yXA?jFU{-$G?IsS54t+;01AYy|9xl5(NvRJ8 z0)v%7DBwjRRf8f=EyPo?MbH$3dn2UeT%m+Xi}1<$u?`EF^2#*|Q{EH<8eo&hi!lfn3~eC3zVq=U8!k* z3N_bCgy$UbDyro+f{oKEBjgW3rk6~6@8)ri>A+)@-QnsK)5#;=nT;u6A#|fqbOjaF zifX-dy*2Buet^3y|LF4~ap!lr@0^)a2ycJy9J%w+hb<|A+T(JlChxSTrj1 zz>2NUvG9i*Z1k?z{AxkYT>%^=7q^4rH|vn3?Qk?6K93T-{y&C)hhy@HtUSBaAg+4J zI2MU8H-85E{20t#>@oo7)w-A8;oXgC@f$RmH1wdz7rQP^#p3A8Y}Va#o+=U_GgiWw zVSI72MM_>R7^=oLoKQ3dKHmS`)i`u6%8Fs|UL>OWoIC3)qdO*{P znma`Q+W#MeR_Sn1Yfk3-ylc(X$S3#sw_+rip#O-K=cLj`O3+|10FD6R0$e2@^`EV9 zw1DNER+9!t`NyvimN+H}{&i?N{8a$O+_x*IqkvQs7)9!aP}oX}gOCiPw;KbRc*3fjgi z-{@0SSMz*e{Y{SLS<7o;sbekR{v(7{?8eWwU`ey(tj{Aj6D3aI`e~CP0 zaLM&dzt&|hf<1K(nt(AL2;JR{kAvB6f9jGtUh}Y2#iU%>90dCo2F6U+wjk4mU89Re z+etEHA*SxHhepJ^s042u_$%;JE$%;>>D*px_c)-GeWqUgceABDt`d>3B+15(0=>OD zkkMgMq-ou2A)oKi)YbK~ApHaWEG~Ao2bXc@CLwq>q-ew$Vp6rrXRla|o&=N8EvIpi z_>87K#Pd%=-``WOO*gX5#QN_YX1@R1I3O5GT19(u@YKLW!^FAF#p)0NKo7-qeK4)( zpXb5!mq)QC=iERg%@E1Ww+MNN?Aj@}`ByF3u8X!y^r<%H=$VkuMiK{qo}R=uqGsup z7){kkR0H|+aJ@xK@gFobGyv_xvJrC>BM6B-81r=gnP2TZNmD3fVi!zPPgPwM!Y-6|$8w5?92<#U-*s zWM0=*_PS(W?!DjN`}6zX8%~+( zr(s#l>e9OKCLExl&xh9>g*$sS`}e#z%>-?3&N3(o1Y2PRf|On>e9`v&j0jCGhOz z4``=wfZ`JO+Z`-wzUF{2a)b1D!b6(}9?od3g_?-OTZ-?ayjRKzYiH>j{wN^oSYXH} zwP4b&AT;)1;Hh@!h1BJoH5y&zE}v=wu>Qyelmcd3VU(C-;7gDURT&UR-meIkS-j%S z=Lh<1so4uYU&{Jzg+b>OHE!xTqwCRtQZi3;W)PJ7)AB}2m&AnTh!f5EO5~*$n)F}A zGVKNRkv0C52>t#~78@PDD1GP8)6On?X7=s%8$$tgjuO9Zl}sRL?q4K~%|rb-3P7#H$;wxEv-Fkbndxa6i7g@lBPRcZt4LYgHL#LgvUM%{=PpmZOJS%C9iO$BN0<9D&v6v^|evcCLdl9o9|i# z{9&EmFY;CX2kMhlIUV?85?$EjYkUrLBuRW2UZYGkpJ;Rk((#8i`w8xO;?jH2(KelD zPS?O15A+*)>x>cSU%iFOK8r+(DHdEd<%MzY=meOE_y@l8`ilQLqV$3>D@Lxv<%K-_ zPa_qmG4$!r+*Q?r-IB@PMHpihW_*8YxGe4G5M-2Cn zOW{NM7M+wyABp2{7?KN$^v1*+a6HXjEB~mXa^=B=e45+gFBE=P-^4UP0U|N@xl2Ze}w?Bph zOyaD?(`YgWP&Y(N2B?5GTVwHh{!*UmH`Jhj_$5z)dnJV-si|=0rF9?p2E1g!vLrXq zN`unhlV}=e;E3ol)_Y*)*1D&=9};J|LeeXC&VO0lN~$HitXRFv2R(S~S=8x~)qE^Y z*Qv|5$Fdd6Xbv>>Lxk*>>yz)`rn|G5qf9{q=N}nIlnbSok45Of)g;toY{lAs-E-o= zf~^7j!_ZyIpPBt25I=}Ae|F6W;G;7DRdT7G=y#s9aZV3Z5RcV4l=?DD5bQ||4VyoR`7V2bC%{~PU7K)sxiy=|+BOQw z2jr7q9Bzh%d$aK`1^!d&r~jAj69!~XH_40w`!8x+nz=)N)qbmd*A3|s0EljM!TQP~JpCiY8`?l~I(!K*nIP^+OoZPMv;OxA`u%QD@*fL` zEn4S_n8J-Cm%SMHC4!T4hqDXZ%JS{!p=OMN!8{y_jan6x3KDmFe2G_h_vSVD-k;Wv z(X&V00CpE6C`%2>x89wT!-U@J4M2BSqDz^c8c)GzGZ{o*{RmnTK@P1sq z`Xz(=O~fECNkD_RwML4}Ad=XT54P)NF1hF{W=GYu>EnhM4h^&qrvo_83b!{Jke z+zt09o^OT?tmiIjz~4H?n@GfIkFaqt8ed%4^ce`>U7@<{;W&oO0ZaAG9|L#OH;AHm zwmjM{Kbp|}k#NS67i?%GlTG*KB&{l&-GdnYixYJ<3dd+vNp3~OU)%hpD6t#+*2cf; zL{>r)Vj+)@*haK;WsreCVePP(Ywm{Ss3~%&u3Ws;=42c z^ch(r19zt<4(#b%CV_jEQ~$r~Sw17-9$8r>fdz<*|Gb~A8*7$lVWWTz_zCrkkggg~ z7Qi_M2JV=D-GYkOT9{UydzN%ToxL)f>%2#lF!WJXl*wx?)N=Cbbvd8%&0IYz61Q%9 zRgOkyka6!?K!o2l$c6ij4m*G*lWuLHM|XD$0Ezm4*rjmtK%L(6CkSWP(+rSWL@0l? zKo?5$iygvjb_jc8)my(Y!y!x^SaoCfAnO{l*>5Dx~ z7wU=#3gBLdkAq7eab4dm3=3^T0bfAuE6hh6a0nD7Ov;FYG zv`a{%QSnknC(ISK2W8K+=u$6H(hU~ZnB;diPC4+-`EYaQ@hUHt8=4Qk2&vas44haP zxVJ~FmuZ3AvujQPeA=w;ZTO_TcIJ1T*>qS3KI;Z`|^_y6G^o1IrJgW|q3saP3fPYdt_g zk2Mfh*70K;AG}9gf-+vbfKZ;U8sJ~5JaT}W^#?lVOb=C%uF8gm$fMs9+7SI;JRzg1 zCRaay@dzo&<&!BTm(m(&8-VS1YV;hiX295Yt^L1k&c6J5lg)H~Z;}6txWybFom2GU ztvA|vmy5RIuc8(csvutrf4I^qm5?vjx_-00gE;3~K^7W{N*+s-O^W+N@cV%NWoGf zF#r-B`DV=@xLwx|W1a~1Z-;R5(`dh3CU3{+DjCvS;mrIecBwV;d*sy!0rI zVVqgvOUMrw0n`2m&?ZBY;WAqCjeLwY5UXM|O~6nzcK219qMMD(uE;3=&MNfp8aZCK zgcbhHZ~W$zO)&EX6l8C6if%psc8-Gg7kEfR7?)GBpZ4B=-cyoY5ZtF@YA_PXszLY% zICHuHxfBGe{lPx=H(aG+Ly1Dwafruy+b{dHX99X@bSuxXwP(?Z=Pqlrk+3@=*gQEe z+vk7cFBioUb+`yBXt!8qv2bx@yKQ-@n*7_;JD3M4;Tpq^+$;&-M3V>W){uA;Vd;;( zHQ{i?A(;ODj}s%7p`@prnBBR0CHMC@y64xh5sZuBR~^Vym+2r9qD!=zSAjmZP%vPg zCLkE85d=GaoRHA{7wJDom?qO)HN1AGcnS1HM5h8$MKe=6^S;9`ht#ykJSv(7t*5pd zq#8)PSn*LKHa_x+H;oN^ppuxPVr)3CochQ~jVw$GowoXPpHNI1yqZQ6k?km$-M`dK z`kH{@rxOuePDN_5+f-L93zv{J`rF2a-N5AEZ+^~;%8x%t${v)-+OKB!O1>zg*Ap0WHar9hD_ZreTWwhea@8M^KVrT(w8c_RDM@C2Nyw@9;LE4+ibM&ZlR89KS~te$#;3n z(D#mpuK3-YgZ^Enl}(L@Fqf$=FF-~`6-@k*ocLu!D*yAcYzbaVle2}MeQAu#f&cHD zvlu)ug}5y1m*k?z8fLj4a)-PZ1#dib{Fl!7S0iS755gh@C@3oqNI2rm&7Boglp`8= zZ@xD_cduGZUmD_mj~h-_v*GIfT78M?Bhs?@nb9IRe!6k@%*FCuBf-T?Hp2JU@pOw- z6MLQSlu7OuXfN&mcR8Gt%yuKR{LbLp6GO_u-H4(ho07`GyKSQ1}zi zp`ODppPrC^lid2=ckK*rIy?PEJbhnF)GE;TSm>&W#2&+sAE^%qt)ly`e~i|5nC{oAp;?o)BEDX21f5F9E z=Y&h_#sPbX*Km}DHD8@8CK)WEL?>;_=ZF^Jyn7bdaE?VeB((xWw63v87QToqZMp_m zc5tUQZ7C^*DK&YN)sSg*UZ|$FWMz#KJpi46W8AgG6~5{(yp>KHeI)Ww-7{b%-nEi0 zo1ahj^7*;L?oQ+2^xl6m9>b~4;YV)sL<6=GEV8BVXRIMrES7PB#O*RhJG$75 z189>@EFU>pazw4)waSeOM1THR>Q?l}jJ>E&lbuG3etdFg{~QoUU-=&>Q#vh=7@Lyq z9xd%yD02M~lF-*>V8R6ZHJI-cwnYiu->Qtz{|R^Cl{><1@!3y)G{f-ro(p{9y;5^x zd?#RSKvP`yPQT&WTmgVuCZD6nU=FBL_(pDasQFz{$3j>984I{p3EP5swk^Q&W|cXey8h@+g*kRupn_uP|Xm z_2)f`%jm?>{)HGgN>#V5&r<6Xcgv}%OKY8Mef)j;1gQ)1(DPQfi?Y6c$B&0e z(866sq>5>;dg>C?C_SOdS@owRa$^RDs!g9J9LisLW%~N_*Uw3I0#Y2O0!366_ie+1Z@D;Wl2%#VO@hStcWGws8Tirk@pH^Y3Ni6t1T zN4;wKCED7OmmYnd7vO2MqVd(d^1ZdDRPFqM`KR_q?8ey{E8*q@ysu1E#9$1gll1Z7 z?K@!kxUpEiK+R1ix~+#bYbXaQc5ku7+@{GT7r(9!MoO3#LHg(ux>A@IkrxSK2psqt zMS40AnB5VQ({~)3T9_psAO=<$7`z^=7+V-HbU3YnT$h{p>Nbr22hyNK(j8!Pk4QT+ zKbwv1K1PG$j$0KBUNxDfrV*q^l;CmoN+C$%nK*VJjNIkC;OqpX8weqm!&9<`=1u!q zvC2=iNJd00Cd~&WZCc-BwLZlFS~o&-U|8Td-uCGI)Xa-0%W>;4OMXW)Z}uvHG79^h zP_rpxrUrv}*5nZ@VLqSa002W!-ZDJ=#DPer9VFs#Sdw5;kGn>w3=i|ebQP%A zlXvs7C5XZu!vV)@hAXHoFSxEv#whX1^pOQHLg)S^zrsRAStU85d$}a}{4*}3KiOX< zg7#m`1sRrE0)$A~9VpHmD}FCmBqugNDgNGvE1KtcP{8cKh_UK7qLc(M|GP|Yo#w(7 zMNKlDrA*&39MI6mnvxtKu3vF{0nE$k7N%MfQ-ri5io$jrnVb*M+>FwX58x5nNIF_5 z`EwANOG!O*WKpBov^V0~B5LI%0+u-A!!rx>06p~-zlcY6wx*HEGvD_O2ed}OD0uE6 zkeuf-F_!mquykg`*ia<3vfE!IKx;vdXlw`k6+f)Q8E}vulPByte?nY;pajIyL0FN( zxujUXC4rD4(roVq-SA)kz3=7k$9SJsAc6e7uf3^ThGEp>E29cYJ|Q|^JM90if@{$h zYf(JWGHLVCrF$HZcIysvnC_h-K=KNp25@`68*0g5`gDh3i8spfO$H9^FpqsrreH1k zRPUH%V9d=rQcp*|H49I8U~FJtp;?ieLTR)`~=0EMe({+vtD4gSMNM1}CHm*rT87*+a)A@Ia_Sh4H6xszlLubT zd8Zw-2paNd;vuWjt-LW`pcR^U!gX-}htZ+4b@Q4s-+&UpU|f*h*se%Ij&&zY03>$G z9KgDSf_BoSjz=mK!7WeeI*JZSiptfYk3TAWhJF?C&|E5WONZ!{B3PD#&05bfgr8Kj zRD}y*09FouB60oT?z9=q5H&Q4u0n^n`3L07qKH$w#;=bz64q38 zR}Q15PhJkm<@`$8rY%I6UYCgSMUMav?U5_g0nmsvs<5LV=bi`|DNf`M>&rLL0pno$ zBc@VagnN~P%hq8N;f46we|q$@`AVlhPdULY4g#;)8HE+plXW<|bU2hO1)$y2AE?+G znux8k3G@(_tgI#@;Y3{1qT?sU_IFtpR0$sZdO;^XX$K5tiw@QRLmAppjGdsiaunaN zet0Kk@SCKk*D|y9l&ZqmN?Ar^o%_sSYI6=gjx19S4HvaaJXn zT{8v%H8L(f$nIR%CA> ztpyYH3B!Ks<*s(i2bv zgnZtxH^Q9snzjXf0SlP z8OC%{+4BxJ9bBkF4v6&R))e`Qzc=L*{f&I{ z;Banf*5%BSdg0CGkzKBySkfh4nPHf_r+mu*9;wY)7&iOcJ$GmnXvXd~K+5!GC1qTo zV?|N z0#=~2frJ+D?uQ8g98N0!HG9nv`9AB}s9d?t$l~b9zj*G1PJskhT6pJw%%x?asGYF= z^8t?o`2oKwInyxLYg#JI{5BrNw^Rx<5s9HU0A3CLlm&$u#FKxjx>V0szyP>7DV6`#7bt)hR0AV*l`JzjB{t%E%1K z)+>58ZBbGI9GshT_!DX?faFD^8jDmZUN9|D%_k+h-WW@oIg|x zL;t~9{=Q zbLtPkgP+14NLUN-nEA`El1ema%%X?V+c=>sKjz|fe$9+7x^a?5dp zdD&A;vYa+HGpZ-nlMU$Rhp?ypJKbB97~tepo`;eEd?wglu2;ReS*crLdpMJ{o!;E( z$-x0WZ;P+a`eC+DfV-5Cj?nK2$oBK2^R~t#DO%2N{QTq&o?{*rnp8pF`A@Op0onzc za*wkwxYS~AQeZ`|A^~J=U+m$pd)}O?DhIs(j0KoAmNeb9!@4gb1YNZWVRM8v_y$83 zxEAQSYKNR&Et$#d%ZR~Q9A@?DVi7@04C9&bwqI*rDZ+n^5=JgKx;9jCL^$N3ttR@2 zc`f>}J7nV!+opUEp|uyKK&h@{xiK;Nf8IH7)dH&48Zdi?$h-uoI<{GCh3+Y#6(1px zd{M`kGG8*N8?dj4!HML zz6-Pd6*T}Zm9L@>R_M`?>3B%#W4~81)XUwpd;jwKXNaaQG0h(MgTtCQezxEK**#0%g#&qu42aGX`KEg6*_sV+P%A&;@b`up2zScW-5J~gvC ztA~O{>wgq4asRc`|E*5t{$H?HYy9*e^%n*zrNNtQ!k|4&+$t z*62toMr?wtoAsi_*pX!nBl0#&2Rh`IJM2!vs z)1dIsL&e2n+#7qvBlXUO!b<_zzG z-h-cL=?V#mfDEW>^dU#2;N#~tF~Fk5hWt&oJ^v6OYIdTpQc$XH4{+JC*LJ$BEeA`l zkWzY$O-Yc7vB?6Lmlb4s$??sj?V1y~%X_FRI?KE=7u|^PlhhR3cUP$X#>rJE)1;v) zO?r2z``ix|V|_@daGpD!E>Cd;&kdEGQ=LmvGFQNC8Vtp^v+2pBNK%(ZQkjF2Z z&}+Qr{iz1!V!7`CY@KpWeC&tLCcIWD?CYuHPR!-+`jWl80iolCUK)XfFatyR-$%<0 z?dQIf2+DV$hz}B`*SRuRcdVW2udFQ3OSrmF%HmDC2DJDrZe50-0;bidDjyf?iX(vJ zZ513W_vfltN^soBvP=6nnwENjQx%ZT|3I8t=Gx9D1o+kw#boUhk#GbbYVr8VoFOzh zo&Q+r)phO1U4`RfwYxIe|WQS9SEn9f_H1#4L-h)z3{KBZ^9^~$!L7Y)D&l%*AT4U?m zy&MceuyL7&1ChHIx0ZL#)N*0}MZ>$Hg2gmn(6)Zp|NY@@sAWOa4!$Lqugl$3GtjXn zYUA{5`{q_m)YfSzFzm9+4TP>|$a1HzMEA#OMu;(d6^lNPPiJ(f4RtZi{dwh^cR9VG;%YrF!^i%7AtMSqq4hvJVNU-1(Cxpy4+}&Tfz* zV1W?60QH`J5M(7*qGMz2dI!82RXrs9C>tAcmrkQZ1V}Tvs@>#4GCsPcFw{{=>?Uj9bXs!BV6DHllN9d#mc^_ zmo@9uKgZ9~LmK&l{#);su9w7hx*I+qDC>-G_yVZ;S#&(b>F{v;48ShCYH9BZyniGr zV$iRZ5=Uxlbhl8a>~xD4RtQObXaJ-fmL|Bmaoh2YKot2Vus=}D1J+md2l%DbA-xSx zO*_GhO4SVqEykA=9$#Y$@{MxBi(`DfDLw}W5=Sx7xoiHwUiadRol}4$TVmtBsPyNZ zMw7RUkF;l!VV}#==GW>R)B*mR6waa~O1L<~MZaZ-6x}bG{KGBTxVd0-;K23C@kem> z?3?6}_T_bw&Me@)IJL7%em%3)2#P`k8VXqxxCdO;M`%4Q13L8`@=hY zYpa4xBc42)nU*+x;g+-y!^jUGrArOcHViyL_hh+#1VIJ`Xtz)#@;89B)p-RC#*LPz z)ib*vh+gvxY5SQWcL6|#!YTHtMR-oZ(*}rvw zxVL!7jrxQ+q}C=*7EPQtwE_~HsuFQp@RS>0932QJz5tl_+}`c))ia8CIv`-iRX2_y z1QtIQ(-4>y#}+wC;TF=XmNWIz4Hk*H|nDI$CEH>hO_dT8#nE0 z5UcaiY5SaeT{&$;i5w{?BE=MT=MY2eaM=7&JwBif!|bl1^6Zz5u7|AlKeZBmJBV=| z5HYO?<``zw6uf4-@u11ciCmnsdqT=VMXA?jPdEV%f<#ZB)k_{>cR8!1g6F=_l6PK? zObyUyfMByz|Z|XKG^JE5dXsf3acNvob@xS^q^`Rv{?p zISCW?%Rg{%A--YXVkdO`+`)2d@22RU;u|6}=4JO>(x>W0@#z6d2{XN?MnR0Y%%HKw zt+<)|QHPFvz5Kv+-EEY2pkmQZMahxJ^NG%fT{^y~7Zu-c-I2KJvasb&H5gQ>KK7Rn zDAy9_`nVRP`*}xJ{K#@}^r!AEU#d~-!8i`)@o~IOz+29;@^s?i?@}(sIg^(?X zD7y`go6}G$)wn{Y#Ooug^g;HH?btzTrO=#>{p==y>%hDAzdk>BeCp&TTO`%(tT?@c z4++$3ubJI&cI{g5{5D=Q|9OpSM=7ma8j{knjFPG-nkGyPl}-C{Oy4^;Cj@i=-X}c% z(J>x@{7$l6*Dg;iXx-0@shwJ~LnM^sl{{|Akqq3e?mJi%dL8-L;{!IPcp*&>PyOrH z(jmE=-Bgdx#=7*F?Y{0%YA>3buz6#ehX!x+9m{chg`d1hrFBGcOWZQ-AMD)sgvjW*Z7dQlDu9% zR|u(Xdydc$bx2XWQPJQ}2G(TSKBxe+g!dKb*N?gCBNI%Sf0A8POig~GN9T;bWW?HW z76j<6%Rx}}wt*vrFv2K&p9j^7_V%ttc~6gTr)&LnYr|-|w|T~Pi`Ok?ysN@dhL>p_ zUYqMV9AW^zc@93p=cHZ#W9T(W^tXnoFl}FMU*D(*`Kwc0E5q*Qx5oc;X^(=v!oxOc z_%t2)&Fzn=|G7+94r^EYPXhQz0`;ljm(9lmauBsw{P!UNpi46&d~RR6tcHMfuji=B zItFk6v)rm{all$W(jIgL-ty zFvp2R;{DRB*oq**gM)|!oi&}X#RFr2C-B{34qmeUN&wQcOdc~&47#X7FSm&P*?g-| zS&&?0^7D1#`EdsUb%c69_pLpf0tXnUG?K5PXM(>qjhyxe84f|Ji@s|xJxADd`)ziS^o z2p_74x>DrZQDvuVi!vjkCVnrlvZ&8>}$a0>Yp8X(WhL!<*N=s0@^$u zT{qj3A9c#qG*>8ME;!t?%vJ!LtA(AY`vvu_=CXj?=I^5enmZ0Do|nkIH!X{@w9|Ra zTorc6z03ttOAg~9MpKmm*yOZj9i^M=bTLF9l%X8$FVI}$b0 zo#XfqlU^GCN!G`A2d;2DQ8{7n;9!3;LEI%}8gh_m7jtOR!-JCmIEkRH?HO+>GS>Eu zq8mB}em;kdg1fx>b&V!m!j`>fO*>_THg=ZKr<+^RE{-O^QeeWUzfLV-HiTL%yu@uO z?bEV|CVhb1ux*p^HnC5(SNW_KKwpH5+Y=mi$}zaJ$!+I!>Z-Pn+M%@n$F}s-rNI0E zu|!<&cc=5F&l#(v~jWL;smi+Mffd3C><7H-Z*yVu0{_u}2(Zm zwh^yp=OWyoY|uAc>;Fjpm=4mpaMKsy$JSu2G*I{|yMJPd@PbuZ73|ifqEC^62onV@ zO?uiJ8Z|}v;Tu#lGv5P-+Eya*Y>N`fvpknbH^lgWX|MRfO3R{ms&LD%h{da6WbNdl z5+{CFvsN!}xk23Rkj8j&n}P$Vl9b@_z87N5E~$@iT@OW0%x=V)TV0qsecfYqXHfrzb!uG4F57|YB9zLRS!~RP#vTDT$Do}U zC~(<46=J;o@p#(fJYguZ_pZ?T1f81b^WSxQ>yN6KrBR-7Z zblSK^$JIj5Fqbu5QBIir5fu>$ScY8U7ZXXF%`_F@Fl5^=T5zv(){P2c6i{=aGPwW* z@Hm{y7SJ1#IfLejG_lKdQgx&!H#BvjQK@^d=en?S6qei#z%dGF9&yAC865aKhL%M} zxp#a<;A^aj6cT6pVQRf*oT9ctNp4txhsEE3#uUZu~?-W+?Ei?KN`+@yb@cyr}Phm2 zt5Q)wjUwwGjR^xkjms2;_2ZD*`cUB)g2w4&y7zQ-tdUi zjR~#^D^LX}IZNT378R&|f#T z%#zmBSHGa`v^z1nw@Zq53L_m-wAr(0?51oM1!KmWyGV8pI+2A%vs&U;wcw*J-w9KH zYR+PSpVsEO`Gj#NC$r|k6Hp7NDI{J$qWCd8N4Mbe>^27Yq?H=p4fb0r_0$e`@Jr-F zhZ9#fh=sbb=>r3g;@G-n*CMPsgZ8n@H2GRd)CD0T1xCc*q_$>thur+&7$JReu12c< zo&NA0Ub;0I_SiCE`RIlL$0dCYiF4q!li$C0%3L;IR@dq&iqlSKyV6M%OlO0s6}Q`t z);R;B8$dBYPD*|h(2^#0(Bam;1h#wdk}m_c_$sOiKNta`$#;k#oNY|P#IkFEd8Bjh zM9j|Ai&PLme85c;+_v9MU*?UA{~7O)Thr=WOLz^~hHLCgRBr;0;#S4-{rW2fa{Ped z`o&W|;(RLkOIzURpr!pS)EMsy&a&l=`18cK9_lQT7RH43qJhFS1e>?dBFC*sENbHd zE4|x?e*Z7RK>3p}-X_nARWQ^AL1^Y6)~H{=ei+zNS;d#+WtKe~BhK7;Nw>Sh5f1uM zuk;vFy6DYkOY-%<(};#qgfRY%F9Un>tWrIBdcndP?tRS6%P}U8;{Dgqxqx$HGB8$X z#AMPRh&A{H*Q>C2G29*)u~1=2i}a|~bI#*NACi0n^{o_b;Ty;2(MvK>cbR*m??_GV4i|z}b7#dw`%AoSOzL+yfRqf-K6BQ?ViVMZdaG2FjntNa`Kh?HfnqAKR*2BrZ?LM!!3)Qz&@H9ME|U16U(}8C zl#IOQQ!VSH4w&|_5jXK~ax{3=A-X*Z?Bxr8XNMTVl<+@R?rZr8O40oG(gcWMx@t!; zs0mcR!vgNZJI)A`lUD^GYaDZltuur)7=r6EfnmWjFq-TzIK1 zvam@x7>XrPc{hdO8=J|6wd0FLr(yvR%R%n6FHb=DmllcfkWc5-qB|u~p+H}*VN*7` z^SNF+O~NJ5Y$Z3Tt9KWXmFlh4zg9-SkaPa6t{||HqC@>heEp@8$ElaLTAR6(q<74* zdabmOW2T!`zGi_iy?oI{HViNZvfu9K`m2G7PI~gnh!^B~iLnQd)=}0HOug3f-3HjU z>+QaCad2?Xhf=Y_cZ)vWZqFD>NWWNq%dM%n_|r=x#v8h~cCiar=YIO3DPSQ^P6<0^ z=zWr(a;$-1Q&4y9b}=)^Ev^%_ze_kWf^NXKMt>*02}}(j(cS>9Wn~to&Gts7e_SpM zD{tLFA59Q1ho55@H3X6UCPIb=93xMX>8l~kT}*t=w{LO)LdGdda*e;@39S9-e<0;A zwMje@5})4ql~&{!%3)h<7Vc-hWwq;gG>R_^Meb5P>^pKh=3v-q*x!*14iQhUusMsR zw3490kg+58;3N{RkoM!3oFYY3W%kE!gi&m+d(UN=9WK#JOuHbE2A(fWyS~NGyRgAS z#5)DE-5x$MYPrFBkK#{q*&|b!6Nf96m>-SBtHdGzGxOfakY8Q&I~$7CfHjiu>T5G# z$#@#Lae3Am>=nW=SskaN;F(r*+oYxJSplTs0x8{OK`EjO(iQO~6p%S@9FzB@HdJlV&-XB#Lojm}uj$?ZNwJ;=gTBpSex z{57REI(N-U)ufq+_vV132uPV09u?KH(e?f*8YpIdh&Nr=T&woZ=L!rQJ)0PIq*;RTzKg^TPT6EbqM9v)3N0g>TRDVU83r^pS=&WYaA5@*HR`fB=p@O1&dxRgI} z;yZ>D^t3IVt7)N5Ko@kGU~?Wh>)6oW+9fAvXTCATG>P~nt(O4~w%D;tj8W;9l32w) z)Z)#UZ(H@w&Iy+WxJ=X_47qEK`T76a&UuAi=SLc?sH|?u!&RBpZ1K9*_aAW8qNXo%=uumL>-PX;ew9cfUtturqo2Pwa>aMCpZq z;WBje9<*`Jo&=gz;(VekO{TSEC8)1xg&=id%~JWd!d-8HmAP56JMWiIvJx#U9OK!P zw;d0+e(<6#yI}Algl-@TF;Fz)kB}*)dHZ3p#od7YHmzex>%{;LO*Ql;b}{ma{vQ-Y z^x37hONOt?>89v*UH@nj5igCva=;YfXsm z%I~L9W^o!8ScIaz)Y&z}kRT5ANKagc^cxnd{f6Uo9NUW1?SrZpy7pV`mFU znuBTp13C^yAM6(S7`R&qQ1fI+Sy_A><8*aBEQ*s6BbGmBQ$W|Mvw!O0bt7T4t2h%Z zz;aZXa}-kKGD&Jh^7{{W`?j%#TuOFhmNOc04}Y>ItQM6%o;L0nHsMP-2C(dWoKa4z z_HGosOZwfbCP|fhX&5`zgtU?yr1}<8@K}TA;Sb$b0ugY|A5#R(_+H+Q{n~G6y3dmb z^GL0{ZVSD7SIDGtG%(v9?}t@96^aK=s(#V36zdo9xn1F*{r;Chir;7p z)7sLtx}cWM*q8YIuTMZfvr|4w3Cjv?27fF3Tx>kQ2BmSELEIpsso2p&q2mqU#qLAE z?TCgz_kX>XcbRdIgZMyIh{sD+THP7hH=70`VEQi>ruJR*U9b~IN68iN@{eD;MTh+O z6LV}?8yxheSRenmE`v(9b#r7_ULGsn9o;>cAd(rHfSUrg8g6s5W@(RDo~D)*Dv-12 zd9yc9{GGGW+Rs?eJqtsaF>Su%C<;G)MhHmwbxb+~-i^e*D)CU)=to&=bE4D6kL18F ze2#PVt{1WVdSE^}zt=6U#@ZA1TY>F6Tci`TQJ9lZ!2uO$Kf!Ua%Ot}B6{S?P)Kla6 zq8WTfTVH_o<rk~aLGj-Vb&$Q$`{~!+HjlAyM9|@ z0b!b{Y8lC_rozGDyyqj!t{EMS0BIp67nnrohKSc%{ZY%n>H%BMf508Uw(5l^K>x0g z{Hm4tL2f}7rs8qOh^5(e`i7CR}o`EB?3gi-pH-*1#XApM^47eQR8qCweqAzRFQ?T$opl2#$!c0K@dG z)wE@wPajSADq;?9sPE#4Sby^IEmD{;#|tH}|N97Mk$+rQz|r84E1`JJKM5uu>;^K` zswTtO;<`q2UYBx-6OYijCARCpjqcsi~U`6^v z4h}HtD~q|nrs56*FAf?-WS>v!<(3pVgU#S;e_`-84ojnFwv)d8{)Aebuh+V+Tr0kD zZDV4WGq238<&qeCga^CwLG-5vWT#-nOC0?gw}UzF(QkXGi~ex6Nt2to`6F( zJMyeGkb78UGd|$=F!aF~x9Pf4r>8KvzXt#ZRcmKe!mT#_EoQJx z{u?4e@5=%yp=>+EUy0*)qfVhS+Qnb`7;cUq()&N)z{V&a2pRUlB{Hs#*N70`ld~*E zHtN5@e^jPBU`+%hg@-%mUj2lqU5ZJ?Mm;+aIj19)*<@O|-lZ%5BAf{)0;%?GRCUcE4osk?_jur>m+4LWj^;4_;xWz)#O3l!ZJs^ z$Y9s9TS-*vxwQ3I0KKUW=KxUA69w4A4UNZlTsb{>GH`;ibB6PMT~}Gv`CGG?hjfZRLP);cmlVxwqgXN@i*xeszH7kp2%m2{60@H{3+v>tGhcubv~o z6`XothiWNB&XwkLM>(?@+t>LUlmQ3C-Rp910&<$0I!V8BkwPo1+Q}L8RD0dw@H;D) zptDhNuzl^2YY;$*U$MN(V~r${8CNqNayfT*UI$0qHB#7FAi@>7cr`(?YBEA9YJc?r zS!+*Dt(&37n<~&y+y!8jv@JKtmBujrEV6EjM?f}Fi38&jRR7G(6FBg{yYTvgcQ{38fvO{z(%Ip7$do)c4J`=DC=jHB1sh|dm9{Jh5U_0hy>`H+` zH4OcPVLADL=%*)i!qo8c1Krh`j?E zj$81tw|kmko`-vU(V~gtuN~Q<;OuT_h17lLYc&U(SV)U%-bOYYP|S$Q^tVKgjXe;u zOC?M>oV41?%;2}-nw8yVFI7%f9BRgnHDx4S%hBTnB9-&uSX! zV*vz6H8yYSW2oQ0pL#>zg6Q^N4{TWp?q+QHLt8bY-d-MmS_l5} zGWzw~)lfsE1MS$C*1>F1-9eF+&`-Eoi$Px`WG6~()3gb1O7MvSTA+mXMAmJcQ~i0a zNmG%7E5Zw<`RA&$DlcV43f8odehJkQfZ-Di2<0NW&)(RSO8ewR^nrhVpn6*x|N2S` zU)M={_VCXQK7a>tNH})*Q^JHJ@Qm&f%w0@8k1<1BE~lno!GyUxp2>Y?k`W$ReClO+ z)md9LTeTGW9?xdmg*3{Yp^AZ<{kbpGTHVS5r3*y|T~ljJG&u=X@ZGCwe_f(Z*WZ4X z==|+c5N+`rpB76QsZZOq>8HTyT)K|_OZk2d%0ZW5q+-N;2@uGdc-Q079;6P7tr21Uj^#v(-r zq?#kRvbcG2To2NTe$mX>5XHmLCmWZe@q9Do6Bv~yv6TXVjqI$sD&}1cWl<5Qh%UdC zXA`^iM6h|`CcVjAmiox&ORNg8Td)&un<)n%h5tYmo&D;Vz{ar+{x^=zTrO7JzEG(+ zk3P-oJVkY^IeAn-AVYXJ$wUI(5+qV(l&~_rKfM!<_1+yk(aLu2j^?oJ*P8Bn!pAT@ zh~CQ<)|X11vv4P;VG8?Kl22p@WRK~bBr^bSXxMfX3a~gAoYgAbqW@~|9{KR`gZ4H$ zf&rKKy?uyvi|)|2vCxIy(tM@!@m5QL#+&4i%I8%9bU3K~q*kIh<=0a68o~}8OUF<@ z&Hj#pIBRYD=e#ZH7Scj!8t}x7z#bLjC3HZPlJ-;gXJ9G7A(hBM&l$s*^<}^2#Rf{Xd5Xgf$6k$8!`$;O>&UJ0w=}T!hh&~? zNq!>~DU%J-3{A^-XTRXL7JIdb%rB_7kH9gaw%=jv(TlOA)Oj3-z=w9|j|Y`K;?#k= zK|+ZR|ADwA6*Dtf79o{#pGx3p0EMGU2;3NyO|=ac>f{&THoQi zC#F^DZLZlW|JgI5e8*;kPM*B(>j7}>K#JdJ`RX`R$Y03{;))g4hY_kg`1#r{c4qjQ zPeoyEozUIa%tGbhIe!=IN~8x5p&_^Hcoq4Apf(W5N#0zu0T_i0{Q2r4`|!N|>8RMR z2jPeYQ-2>H@6&U0&XyOA(~rGNZ5WoxCck?mJE*VuuL=O`%{Z;E+u@&(;fP25U*{vV zdm#MJ6_zBn3SKA4r(Ap)N7oA#ZEdnYRj-!Z)ZTtI&?R8nE&)6+pd{00!twzYJ4-(U zMeIB;jAE*&l@y~ECx(3t45mVTJkiRF4ZEboY=+&-57NzzU8hzyE+w9c${Ad+xH9rl zG>}|l#YuH?gz4>|jBE0KRfl)BZS2wf55(&&*t#4aXzo2^9^G!K?qEbZ6X6!QX2pG@NwSO zNFBKAGe?^`f;V$m*_9oUbumCT%k`PA_!*8kYzi!Fa(_xic$#59D1g8ngah#;Q>kya z-F!ZOFu(RU+0Icj?Av#7`gjj#mx<0Yqd=Je2WC|^Iy084dZ-=kUjZ3D#K+#aQgro) zp|G?_rtzY9g5~>e&Cf1h1^qo}DMjkt zo?PCNmtMOB6g1;sema8pfLm&-s7HI4vZEtLuN-^CThZr1{8>7KYME&RFt;7d-Mq%_ru=O#B{CeJ4b57ixu)|Q5rq=D|IX^uI z;T7=oA(oB+j`Q}xOVv^VR459}I6O=PdpliNu{XCI$dNYoL-*AMFrRYL*w~T=bq%X; zBB*}VY56|tJB(OaSO{JkJa>l9qS}wNm97E6NloL zoBWZ}TwthD&hIb&=k0s%lS>Zqo_LYRVjmuhxo5BXRgcxNj`Z0(!3FW=+XWJ z_0}!r>zPuN8Roq#CqYp;u<}iFsV?!8CM^BB`cc3PuO`QIo2nMDi_M|q^Kz*3tEo{% z=-K`!P8VDdtu5_oV=>*A|0J!=la?0L*jraZuDRsF|DHix9l<0uok>%hwe+jZ&OZpVS0WEW zateJb2O^D{(x-=cOVmva9v|T^2$DX{*7pCSRwba3n`JaG8FTpi%ZQfe!^GI$h2kNT z-5DBleLWLzsLn%C8vcT=*vnfaQdE3s@JB|9Ws%D0$ij@5wBx=RXBabjsEB;gIhOHx z+4!6547l~-%~vS;3836lWKSwXYXwY|^WAuf>U}{Q0WXrW4auX0G7%EyB9?ITSRnO8 zPk*mr3dSbyEuTFSk~&iUyjtXBa=fMl;Zy>^&z_X(ThLQe9Xp)GRUeYb+Zz|K(R3sn zl3_)0anbA_oA~Lj%4fAS|95bw>h~~nWSBtC7VAqh>vYN&@30@Hs zOOL%glAn39#I$9!jP3jG{5V_XH_NcErT%u(1E@qR56n`5{bYcE{%C8VVx>h1IDEAG zoMRWCiP^aAV-g$!NRSecoCQyrn;~fHi34S8)l!L66X8%~dSve6?<%7}?ruaVuerGl zE!XWPr%^m!=IJo5xws9ukQTs|j#sMuhik2ld=4DSuJjiO+nI%*N~klb z(Tne1R-TcaL~eg7Mh&m@mQ88xGeVijGncE9d`W)(HGuu9iCFZToW@OJ>6ZP_i&sv# z#?w6k`weW(M!cD=gqx|9dr_aJ7?+tHSCgx%#nLx6Lt8Sj*!nJ9e_lHaa&4 zR(0%E19@GZCtEq@u(m>ja%wS<&05HS+J`8llFFIoO$SA8#n55X6uawWLz)B z5snuxXK}N?kSn}$wWD|+vCe?8HIb^Y{+s@Jw1WMp)c-&;ZRy3(k~?P$yf5>0uBDP|mK?2?tc-1E@y;>8VcNj_RwF$cWpaqjh`$KC+nxRsyppZUD@a;2E$}3Z3;31yW|F>N9UKYL#UoD@`HRqAi~bO1 zgpde82q?$CUDG6BhKOT8qR0=e19-job#%nE`YP*Em#(D7WwIRXYI5VUZ>$5e_Wp0> zTwK$!mCOm=WWhAi!MPP$l19G6ju^7OMMsvm?tF2naWksC|6r4VXL9ZJzqMJ?izPK( zQsm>&j0<|v+`OJ+!Wm#L#s5Y{E}`(!8#d1n}eLcW;yNH z{TN6wxT@({uV0k>L52zC8u(r3-c@*9;PLH0MtS@-<9 zT4hgQ>+N?wA2rHTnJCj*AE;6YL#6zH9wqHsq9M`qG9;HH&D~K_(az*vd-HDBI~I-9 zivzZX>SYCkxR7Z)W~q73$Mee`tYffx#?k1}4|A?c-wSJ2+{;D9E!TL7{GkjOyb=}# z{FZJ_U1`o|?R!|>+^v~0fM_(Ezpj{j6ww#N;@DAAI*l|$?VP4e)NX9xF^`s3<)8Fs z9rMztv~#i34Up;1%-PM7qH)f##HoMGXnNd^GQjU1K0Q7*{-}B#g-5_OWuE@AzI3PN zPMztsNce@!IBkUy+qR$^f6m0taoev#51gHm05K?*dGl4d-3#%u?3tF!>&Y-p`w>a*EkT}8om0GZhuzt)*-f5OV1 z*3bTh(Oiz#5^-O{PJQu9eJe!eUbOjG{QKI0%oS%;IUE_<)U9Vw9J3E7dSq<+yMoPq zVh&4F=%?NpKhA6%u8c_3dxe<0%ihp5`2khnJ!T$(5s~4@6D;x|k%B%p`FRszN0GJX zJ!QXs#d_~eL_$XQCi|SHUo0ryN`uDuRX$DCYR`;-_cR=WQ7jXYi=SziGOL^|{5{e`A_?qJf(lFzfQ+Po$eySuI^|ZkY=GtGvK_oR$^) z`gVh<>h)Q-Gs$ZXkO(!5YWy5@$!ofX8usIpnB-H!a(V+V zgp7i_;W_nzzbcP^a?B zm6d-V0skCNz`wWm3q@I@5VdbVpd*bx*gEF?l;64KB|7`yGzB5bB?1jxH$|d5OPr%Z z$TG2>xEfsHIt_Mn=&i@wx!$ZuH|Hw=V3MYEY!mo=!ZCbGjbE%ps&22u|ichbaP*P4ExC01g z*h0wFMf*nA<1=$eYrNzoRRiCxfkDx}9`t7=Ao&zM0b>oDKIlY(nc_1Y9eH;je7&ZY_g*;GfT!#d{@Nw*-j;8 zB0T4^jzm67N!^LV{qh88x#sdrxQa>zEi&&@2h8a|kU3*%P~5*YSJz4KdF=bLprq^% zoeR$!E)Ig)Ugz&CbY`V=V2rU$maAJ^rPRNSzMwgrnP&M7)}gqZhZo#agMPe>?Ip@S zn`~G`d9E2eMlEPYlxcD|zklNQU{Ly+ypiI^m@eh&?wQgy?YI+1{d|7h{} zLb*A5+)Jk^6$iSjNwQEiW?*saT)LnL5EUnaA0ZrXlLYJpXxK z;89ZT?u)tzh!}+e%{!}h@ePR4NWtm}i0xl6K>0fD*iBHJ?TE~#}hdy{f* z<{prn{s;q5{eLCq0>eTi3}(F7gmC8cS^9{pY4!JLP=2`*|JBLs)njsX9xXM0fQ@HV zzS=JbO9kQ$rl*^NYz&c@%kst3fXH)KVtU;WNxt>= zttVc*B+m7<&KAtYOdnZ7540Ydg*&58DR@IjfGV!#XGG6R&fKVoTcwfWb;WxBch#}A+Xc_r_t-02YBpiP?sN9{I@SHcOyRHR@yyei@^qM}5 zC7}tcr=mVXo7USlW7Qa!-oI6)cEm`Sf!8r-8ouZ8?!L0{aVPu`$u)aZnI>fGm;`D_ zzm&yEM>Jt*)nQKh5URV+#o;F(m#e=v(Me6DpMAgF(!cMo&g(9}UC8f4*lpdpuk2}B z$fm)*qvO)cw_G9gyv!Rsx`&O0ZI6_nv-dk!>jN{yd@47*;(5-kUl_zAFQ`S7Glzm@ z;CH#^mBvmeLCUCrG_&VDw|~bDX(ANw`lsyCptx(sNzIQLufBmCvW^XdG`7N)-+vEl zSjQiJqf?{c_T+PJX|8XR^}Zz^4>>WEm~{ui4pN_4{1(Y8Trq47nSy5+r0D|)B_eO+ zYrSFasW+$5;WviK9+HJ5K4$(#z(s5YbcmVDL~g0rApi<>%qwnzT$9J&GZVS=l34=Y zLAg}E6RSA8k6)}c2JqZ208Y9Y>sxyO^tIKhQfc93H9HO-!Yl6HD@3uE*NXUhR__}( zVvPTW36~VZ7hk2^vZ?>tN;w&s+A6DhD)p&jy?APtNkIEKT?cQ76$#_Fhdyj+2lVf? z=%EvfEFyikvu?(e!yd-Gh_jhlr~}L~0s>9{<}IQ-F^mxQ+AvhDEt<*o9wsU8ENRnr zVLZ?;vaH8nDw{_<+$YLI_6+Y937W*s({%5(s}&XrG`s}Skqo5$9(O?XpKwVQ|QznykEw`&jf zm`GmpW0uvL2^;F~S_-JC&-An1N)0vU5UT~dn%&TS{8BC48$uEEAzxWT_$q%Je*U^=g#PG7x!um%DNM7 zGSKn1$bZW%`ia_Km)EEOa{Y&vVIf9eHHSxvzYimu(TpAs_{O~5GT$)c`qH#d0s>Ec zb~cJ@ELYzp_bgr1T4<|uJ)imgOYYF6XITuxSI5P{13FAR3&RK@Gz}KNj4KDAT4#0h2xv9IBCJ~{g^EhJMItZ@+t2mZ64Bc-xZG7 z4$8%?loVx|xfl5=NCl4TN1>gZVTRRBM+xH-8^B8jEt)~k&Cia0D%kf5$#IrR$2ka- zr?qgM#$E0*<}X05Mt$DFPPmhez&BaJ2vKZ%F3$zJ==P8=SZeNz!;bDF13RwOqpqS1 zaI}&So-h$kgzK0`~wXU)h)X%qa^(C~2#_!a#Ka8T-8)^*Qa$d_?^ z?5p9h#0Qpv!ED{M+%uy5S4%K!?OS`0+9lgsSZOJ>=DV2r_Wt072YN}|GW_bx5e848 z?7XSL*g#!Dy_#9Tg4T(7i?qrrpSU5ZaVv1BRyN3-S-JSILN7@sLPnha(IvRsZ->;0 z$52;=vCjVZ>3!4<^|7&9*)Ey>_H#n!!!hq|Uk_<}rC;yrb6^Dnk#~T{Bu)RH^A^^p zN}65#v&2pQLa7>3D_VDje`*^Iyo@d2TdzO(kyps;&aobmfopz2A}>G)jm+2gHoMAj zu-e0;AJF8E?TWl54Wi!*ez^fq_5mN57cjA43Ncl!&>2Am7S%bx5S$OwLX)QSJ4~Iv zW6pdKOU|7a`1AGPPWAb2w%ijMW&@h+)O&Eoq}-G2=hMY4t6<$3F!(o;)6Y%*u=>y<^-r zz6UX0YganllI7%sM*rEcP&C;;D$v!E@#9NxweOa@_Q8DCUR0F!@`mo^E79JoKwq<2 z{(T-64YBHkyugh0DkYy+91%H1W|=gI=pP@_IO@$}i+MFSNuG(?r$JE*-+-VIfPU7x zBO@x5q7kqr6tJD8ck$Zdo7e5IKSy80I18xgiBN{UpWY6Svpp1FyWzW*Ygh1M@27K> z?`yNEnh6=W0^|Jj_~hpn4xP`fPds&n*w_b!P`aSu-X z)-!#$`%*S^(TUOKjiRo|@8O+MhLkg>WOQs6A5;!<90+h)4*>%fzX-rw`<7E%0eI+9 zX{dFeYR;u9$M@VCVN3hM!&?);FS}?&^b#j>1<0_1onsFH1378gYV6@Z*ze_?^G_Td zr+)2-&Y4M|fGVjgI%{R{%({a5H}*SXXx6W$^c8h;u0Big&ZoO~1;msqq+(h;MTzM2 zOB<$2w$n=pZMwu&QYHCEya%i_)+)$kWfmJAGt?tiH+=4yRGj=Q4W$HJb@5o|6m;hY zSzgETKh}w4||{utr>GtojuQzR zeEVUru+G=cc{DBiVuatUS=S0DQNfj+m$6KjsbDiypH)?was)0yz+^`P+jIyf0X{kd z2-%V+uayYjl5JPK6r$rk4t>rt?_(Jj&&*xmz4(+mJqsbyRM(}Q#w`yc;oSh6Q0CMU zYh^crv2GInZNY`r2$b2i5n#5)p>(;u?Y$m~3{c(gIS-U45>FMKGqWATRp^Q+aOnpo z@Xwcr`hD#L?=w4%s}bNW)Ft?hCSc`ekFHjGd8j`!sa)4P57w+M9vL`wum~Pa<~hJ- z4z3w1e6YvG&i+HU&qU82;46Sb1EyYjq$~HJ&+JY!%d!~LPNgN`9j~^o%cVHb567w} zdBYG3@D43R45#)e4~`k$#qq=)2Su@N@o9$~z15WpW%qhLBG5EN0u&J@7nS5{nzs)H zzEozkr_~8^a#%UW-+Phjm8c+*B&s8kVu!cR$#do+U@U-4#^tka{ZgRTfrnl)QeGt9 zmECz%$VqQKlGgzfUO{jnGvL7Pv4)T|ty?ja@%6e=iO_(^dQ12QziZc=rYmiqVeHo- z@lOK{(KLcmEM$hytGy}lO*P}l@DNOe4qpnr%W0UDx-ik)woOD?Z|y_ zvb51YpFoAsl--3Ts@`UHmOu^03+M*C92xd>wF6wFCB}YMXy#Y-4u>x9_(k5JCL;xno-idMri6qmdx*Pw7Cp{^{eF zCMj=L{kSEmU)Id-;=`e2sYv#G@`AFg#($v5gl!X=Lu#B;Y+f|n?x^!mRF1Hx=`-Gk z=I6QZ5|4dd5qzx7l99StZ?%?I$Xt_r4d=hBtT?WbJkGJkn&BG#ih4+6o~sRT84^AXf&Q`X`VC{ z%mN~uCu+O&)j|Q8FQGCW7Q|LuA%>cnb5OO~;*we@(P4MLb{07mHUZQHe9}IR+ROm9 z&}|QErHdurN#9Q7XDnFjcnpVc=n3dj%RN1Tm}2Dd0|n`dC$lD9I0DIqmHx%5dyEA{ zp9|Nw(p2$(yoWhtu+MiQy_q+Pw16R8Ge?F^s_NqR?Yr1#?yFK{x_ClMnFXv`MGZhY zDl&SG3HZPLHXLW+vQo6z>B3eN6aczEuyR%nih5Z=I1K+~T|uaTqDtQ?3n==}Wws5U z?!B2{gipQZkx4MC;I00Z9<@}kS>EZ4s$z4dR}&Z^O-bUV1zOiLQZ=`T!`Ds_>Unmy z9Edfhg5c(YeKcy30hLrmO`~=V7VE)pE_S?0U{msN`P?URa%Pa!KbqElw$P9Q$caEm z7z8l5fY)Xde;3~JX!RV7{SjcL*)q;y5@d?wk`2B=Cjq+2!pZ8F zLAUsCX>jqr112P;iwZId={*WU{&|FOn!Fxx?E_)vDMLNVBginV8BQTh!2tE&I)(u! zTKWw(2H{;h3X_LXuntShr^mK-{K}eeyus@Qp1qagolpgYSqOmtB*vIID}Z z%&<*{KO=-+2|os0i_Rkx0==zv{FyEF1p6;L?80117*If~!s@lNfO`M%XB5@qunj|{ zd}F^}=^#Pm8sRe%e>aoX!}SSGmr9sNV|GxG&FUY}eE?Ng!>m|d8*w_%s-*Zl^5l~D z%Ym>?uvkJI%lLI3zIcoIdB{s^%Y&aPL_Bp1b%XmStNPGdV500dH?07eThE5Bd-oc5 zIL!xbf5>lDGY<4EJ=KG`PtG^8dcJYCxMsmQ^D;;1Lj}nx!c>)vy!9<7boL8gHGmag zMe+foXl%4loDYGaS(Na=M*L*!kh*Rv(QD*ub!y4;Y)b6U>vP^4z~_bR;y5TAT)s9+ z{Fko1gW7XMZg5^*37Z4;>wuw3SD4Y^8xA8$Ux#`{?L}>jy0INxBkKL%mgCH&$ci}M zwlE6$=sV*IlCu6q;#8tY4pw?PfSc>3^OqhFLNX*r*0uNk`7Na@@UwSyvbM5Uv)0Z%|s*b!+H))%Q~=E%dD>PsGUF$pkw zWI8gp4IK(lk2;PmKisCRGu@DYC3?tH@3!*&eA(Q-4GUuzHj{MO^!quzHn(~|z6GV< zb=P6fmCqXn?12~${r^9|`1%xEn02OH`uv-buw!$oNkz`~Ug2>bYggu1N>P5wVcj?j z7LBwfHlRvABK&q3et!@Ai7QDJ6VU0Ioy(t9nvib!UUk9y`TY+^A8*Oy`b27i-tGSo z#=tjgaG1I8M|%h$K{xVguzIt{gX|bj>rwH-3`(4lO*i5q!9*h-Ul|sKa;|2?exE+- zM8ZqmqaD!OZuPq(yA^L{OP(VTa6LDl%t+buc4A{cB7U)gLmo5RtRzsorE;2hp zQM0S00-=|FY`rlxvyo*(;oLqJJx*d~OvW-FIr9`pbF)qBcRe%n~AwPZH>QO|mR z>|qrDbv*-kyx8ciGZR!amJz9C{Y$DXFcDiV*G&d^Qo# zg8=X?Yp_2fRA_69)Y%5;K7F{KrZ|g*k4kxp= zUeJ*X)Kz41M> zE`iX0D&hS|G$-Y#|Hke3pUb*(`JWJIXAE_-1*W|j+hpvM?{4EHZ_^^prgbT;E3Q0U zEcFY(+)+6C{$jNlKaanbN&!>pZd^q!SDSRiAPWv&<6b<|`3 z&lu1M(hS_xYhc<3N5SF}H>noAaK#$O?`pa{U3{lkb!G!I09Qzi)gj~%1?jo#40q#zEsq6ZW_*Y{p@+zsByLMWkk7^Uw%zV?3>4ILX+dmV+ z1D*gj(THN;2l=2?tD?NX9Mb6f-8%7grzVJS;C#D*TW*Zfp!)U!?E#@i|6P#k=VJocM0Yyz@GvE zF;T!`0QdJ;s=>_!5e>(nIj@rAD>*XnSGFD*b0ePuO_V)w;m$Qr0dWD7`20MUm|hSs zy*D+Td#xgiwX~FCeFdKsa&Ly*MUymT}hp{_Ek$%B# zSX)#WAZ*R}iuXgR^&D;}|7mK^K3{JpY;w*6>ZHY$(X}IHx=S{&6A!suO*jBZEA(#F zVS2Lfr|$##cPBxWBN1uHMB>glqNqaZxpKcv+8!RYb_HYCNDo8Qpr&4ZeR1CZ^7}c^ z^#_ef%aZDf{ZCV&wkHM#LGFp${y%0&Oqg5LqfM()Oic+aF}Sx%%OY9iOPvSMg}B6S zd4x-y`a6M{o<8Fo^A+fp4`fvz#BmZuxUz%|@|CgQO!fJ{aiv^|Rr9wduU&4ZXV(KH z{wXATM3!ah!igSDfsuE-K>-#nfiHMUNqo<%!Rvp+D0YnK6P;<0iO@Z?(Vx1kyYG!s zG!6z7Sv`Z5pErkTMXYgw$U5FW)u^%W6KdK7w=;g(bxE4NJ>I-QW_sZQ;e23Hjryfr zLHxM?KMRa<<}NI@%?H1#N*$X!X&8TyOFV8g(;`v9@}`6h>fctuc?46UlEY~nxMsS6 zNne?};N7)P?4HrZXXnXV$vV-=wY4AAB*$R)gxYVPJSlil1;g?&Z@G#*JqkYDvd(Su zNBIBx#Qh-c<6C(}>~(fwDX~IH`N`kDL7be|L8%gQ>lY%wj85#%%PuyaTnxc&%BkyCn_)r^b+ zzWk)EQ4y2$yXfyGc6oTuX#+uHHQE zajEJvaAb68adOu4M`@{-1Rg9rn@lA6TLOS&PGYTCm^W~YF1gzwni{grPrem}HcDvU zZ58+?g~JubE8V29h+n_;K{&%=r z&saJ?VtOqum`s#?iOUd7^;^!ebVBbi+rY%1<{gq29s5q+6lU|;`UH=;@>gC2c22I$ z%mJ2$1G2haL1C4i3cOkcOF2q`zzS-xF`c)D2(HIpO}x(kE0?sAfYScO8)RkFH7J)| z4~J8KT5W>YJ*ojha^AAruk-}~fphfuR=V@$i%g2Eya|z~H7u6&#A?r@d4NZIDN89y4?$j?wBrnQOvjSC%qhF7a2>-)5-!-@h)_-Kkhuatq z^dn$54(@i02nRVa%C=L`x5_6WvOO6?le`PR>_a>DHhscp)=JkbnzjnoD{5=0D*>MZ zz6#bix)4F)#3J}f-r%2nY;5WIO40JgfVqkvO1=3Nnb`*OjD$*z?cRC5;x198#IQBBLbDPCEDssD`r1|%H%*9Xg$jV|ZKdW(*+iDvOMXj7QXvRgN*5UTDmQIwR zwg&A>%4fXmS5FX!-^#cRd@YP~6$>tHKX$$V71B(ua|-L6hoCRMf4Ch`qx;+9WOwUY z?@Gvk-9Y~+CZXEL8&0MQO%+la$XicF_Z{!}uzzsQ=&QN*?S&jM2vmLaEA@4O$(Xe) zUtGu5*E|9mPTqd6I^DTB&OFxZcy>M5;Kl`t98~CJkRZD+D{L!5)P3CqK_=5LBZlz1 z%iB;?5b$8AId9}q9B;Z%M&*k+M)HLBUkoPbB@3F6lMpBC2hRzXm=7q3-}l48!lvh) z8Sqm|{vTpPnAO-78)3>I$B((Yw|Bubi=gYW-{oj-Dlg|m^IZ$MiUOx!Y15HNxHD3^ zIlCEy0=5f>nZtqmUUuep%>_)Q$sf6f!$Dh*xkwk;>8-rhBf-XaOO+W2lcV||k~4kN zA`E!6Ar)@AP&%cP5VI#L-Rxwpnt~GSsY0|RUym{*h0FVAF?c5GmfXq)t#?bq8kCl zrDm^1f_Po1kQe>9_`OJ5ly@pGjAQP8TRJy=CyjJS2S8P|tC8 zY3Y7;_H*p>aY&o4SYkMQ*npK1#~Oc=rnZTOEjP6pj#r`R0_Z_a=HC7mhs)i1R`62c9r}1bS*k8J57$@eJ0i8vvTR`P>jP1tA zy&Sfp9-s@#R#wfM=wZ?{j{X}`zXn`?{^bYt`k(k;w!sP)i)DHxPeHNW`=>2KuQV6b zDR(OWVOQG^M}YNJ=86s2PN@muR$OoSin`lqO_6Eq_~v0!wBg1deC{YPgF1)6+DZbw zYt27A%`3=z?teu>@V2T-wfyP6*&?meIp-{#$9 z6*Wi?l@`NXdY*Mz{>sG{0o<~$OF2wOkS#<-qlGw!h3#%cY$M*9qI$JDq)u7j>zZr) zc)rMKN!%vl{TvH6btT{x0<;nbxHcTbbnf~oHEmX{|FZ+)2fSu$q~;Y&(r?+S2&N2d zS@k5QC3(u8YDm=*`K)+C+pnpEUYZq7RVX;Dj>ZzFQnH@0%GP@naonH2GDJ+nJz$XT zHJKjVy8IvL+&+@e6NpsE1N?bfHCobjd$rbAzh@?(n{N&+-V|VQ)4DkR##{vSY}B^6 zb|xJ1a@-Vmcp@BwjztMvfIdWW^hEx!sI?h6o<2&h?Yu5S&|UaBU9DI35d-vXcRTae z{Vl_qj*73fiM+hkgjqq=J&3h(*3#Gb1m6zNx*%+a^l^F5S@ga=Q*Y>#xq8Y+)h8Xr z)i5C7)>^+E-MQ33=xnz3(?TD19#Ax7u0KEm%mDKx6B-Jq$i2Y3Oz_*vmMt-v7( z)7;y9>vHovY>j;zVYFNRpu~+cijHrx0#hU{!=1Jfd0wk>RTfMxD?otmFqr9N=a@3+ zFFF!*Ej@r-JAbN9(E?!;IVk0o`nG9*9%nGdf2WP>$I$VbeX4)>{Y1c>HtWn@&J~n(u(EJb1ArCo4TVn9WCm2vapo-~}^hVM_6&nzcgBT_Q4nqxc?HAvH@rwR!dA;_z@^|QIK0@&& zI^X@fgH-_z$jv_`6)Jekn0*S0I=j#W{TGkCx8+{mIOb^*@Xl2B%ZtuG&NJK;fvteB z)Sy=7tH;CW7%&(JpOx6zhdssmt^dus&LeHxM}7%qUbo{t=AR$@tf?O68=vvT+^%h+ zTGCqeGY}v_;_6HWfVgOZlch*|#YySoLuuWT2EQH;i1f492=eE1unBHqO47DbrIm7{ zHM3#Vql`hZQNEPGZ%C84(oB2U3OhpX8I&lgCdI2|f@^XH=ICElKqL-Ka#goH;@5M% zJ4;$tn*^mZIb0*ABg5q7)ou~PsEWc*r5Fh0?|FDG2BKo9Kza1du=H9MqeL4fF?0X# zNiJMAGO0gsC%{Zbt&EPRqJXOtKonH-n8>trPfsHeatfC~wzRvFXUag=x8Gm5?+Rw4 zNx>$#YyXTfr1t>S^5rlvtHwP<-k47GZ1t9~;#D=0f>9Xvxz;K;?(23dGwcdy|4FK0 zl9|^4{M*}qlcaP#?-TcVza*%cSaDaj_dF;NsaQM{6=$WR^Iqjj!`>eKh%Gj^iYa+G zS8MQldo@0t##`0&a)jH?<;WarPmqGgCbMU!P0mI=ZC+TYcpXVyIBl&-!3rFD_Auj&r5qRP@v{d*HoH(s}Ip&)Hm3e0(za8$G30%Sbxe zaO(x_!OA&PB_QatiAL{)#nrX}mrmxjGZ%wbTJMWDH(b=d{%z#8h2&-b)d$@!rg~=5 z=2y(AQzR_C(OKVUEeFVNpDqwEy)-KR9g?e09zbga+-&f>>zKYYV&v-~zH|q{0hmKi z0njfG{aI|(KP2S*o1h!%k9pGGy?hiXH3(8XLrT@~FLIG=F>{;U+F}T!DsoVu26z4EG6#e|Y7g^cRaecEU6x1q#eL2atVc^gt0jY|D-$@<0aUfh zIkXK1DP40Ltaohwp&a;$r$N{Alp=#1(3_rb>)b!0J9hEYJkT=NE)xkZZL!w?_ac0- zC8B+6<#}=@D-?SB{0q*z)yQZD_2EhD5i@ag^R^$fgH**ZH1cUi5dlJw=8LfvJ|m7f zH`CM{8p{B8*0E*In_c?J;(~kVz4aLY=^FUhwprd`SVi))Es*k#$$63KpeL^E&U9i+ z>xQ{>TLqauq*!hHw88w*5QF&jibue69xuMqUw41N)!=w8m#dDL5$=1PLgt){2U##C zXQz}dS->#;3m&#vbYsuRTVU))pN_LuY0RYS4BSgi{bTDVxrU}NVjcAuIHbOzwTStQ_isyAH5{ z)gtlT^f2pL?Njen4a<(xy)qTM>4(zS+fzK~Kr}N-@T*Pqa8Zgp#+x^0hs!(mo$su> z?kpW7UIHS;ad6`da9S3Ck+;+Kud6BtPESY}>(Vu2C1tb#+g#J~GwDRlacMctK|x0W zm!g_(a#2ZOcSv>UI(*|l5R92X*+TIH?lxP#?c7U83u1S6Uni-mge7?SX)Vp-UAZZ* zUNx{sYZcYu69RfOT1o)D&at zf_`Ue9BDA_cF@3D5w>6-D9ST-Jq8&`QwpD-Pw2pc8!?vuR2G&ry58>L?6LHQKPqaT zk8QQ)g?E4Ke=Iw9&kYfk+7^rS(;fOCuFhZb&W2zaY{h&Hu>g$nS?Gzar6!FVjHs$e zA2{WV4f3z0w^ZyU(?6xjqSA>%g?3XamtT3MTuC*tnf`vU#)Mne1l{ml>hx^6&b(8I zPwbiDL(JWV$!&#UKmAZ#RMeiP>z|T5*X;KZJm14Ev0gHG&oPY(71h%?4}UWDleCbF zauQeYHJHdM)g63ats5W`jHTlFENnAbxt7!fDjE1tCzq%YJ zfllhYZiYw9O|F-tRHF2OJFc6;v4%y#$s6rVN_^qnmd^OX`@foake_AcE9-xc0oXoJT5lYQ~al8TdV^y(l`+QYGxq+>?>avKe*Xo>R6n{St`b!f6;X{MD z+cgzLLH;yX(bI13yPi#ctk-G!z(nV@m`L6KD7x}^rvE=aH|0tcA%v7OXXJ{?kywMDm1B;w7={re)~v>8GyDBM-~ad6W4u3~*ZcK)zMjXO z|AE2)nU!2IV56uB#W2Xv#a0b zpA|l6U7xtnN(YMjR2SofJGP*QR2(`m_MY$1y#D3yI;Hh{D^WbgTy4#{%RFX@zjycv z!SCi6h;?l3^X>}^M6bnt7-8hg*;hqEF2{VHr5OEjElJ~Q-SdAkWy^N~Mp+({4PxKdbn&u5=jc+KPQUNeW}c zh3pr-JJk62+1j>vNP=+0IZu(#Y|?}B<+8?CBb06egOg|=^>MPTdmrmSn~G+a!6n}r zUe@iGI;Xs!#2+NF04+#2qTF)ckU( z{IC1jTWY}@K&A|%wqSB1iZDT7;oskw0C3uSxkdVqhrMdnhi+grYa06c_IvZ4N9)mS zkq3|@Ws)OcMis|F{NbNf+&&SMFjkU%6KUNTGdK!>`;lt*OwOhYM04Gq<0L^Jk5*DX zOd-61F6zmZ><0Av+a7AgFyY$#2I^?_?_ZPRWa1u7+4PvSv0|;v8#$@B|-yCW^kuvqot4Il9R62g!icwz+h7pKm_HTT;>Ffc6g5L zs==teHT}iXz+G`pt(@&#KcRZ%A!xe^R@o!>O!Hi`XxEL zgQL;>D=FXGmJp&g7gp3xYqJcFdqpLMOm^yxN&VP3#dI0e~SE>Q|22 zMokRRO}WWSf*f~)-r0R8MA{{f)PA{Dc<}}$dEPfRB;!>56`iP7(iG54M)48iy@KBD zd%X(ulT5l~F>|?W)PY`{6dS$JUMM$+NvT*+_bze_BEzEa?|P~f%|7cAw4S3Bz#G#*gM0QKu>FV3v` z(Ayaw@}sNPX*mvlJjvn1YCMyliuQplY_SarGcz(t0Z*tqxCp1WC3APZDOx(FE;v_T zUMqm)8u*(fan^W`PGYrY7gcs9A@ZJeSj4yq3wcJ!%phXcM6w>3#mMla28E8WZlQW_ znyyA;9@2k|0qBF%WO^FpBjSq>rgbA7$P?@xYxcRspLh#NM=g}RLH*l@$nSV=X z)GvDK4v8Q^mL>`@(lSy;alfgEjiid<9t;FA9DB@5IQ-%zaer(3VP1BhopcCKx#X%} z0ZyC`CRtg!xQ{9>P8{4bL};VCft^I0P_SnHHEm_DdUz&}L|DTk$?&4(OlBc?(X3SQ z_jCmb@IY|$J)9=nzW z@(U;+wd8m)beyCY9Kv+MiTf(`Z>cH^U#+OAdNH^SbM3pxBW|U1BRW1NF3Eha2Mu)a z4utwW3_HFkM1r??w4~%G|GDpVFBVeHsGbZwed_p=s-OYgr4>V+z(o>je#C1ZMFGMt zbcUt6&|*!h8DpnG8F`MH&L)n}R37CT`MeP!f{gEg6b}X6+r@&R8X9~Bgm@0ZqEw0+ za<}yNZEL>;Qw7y6Rl8Gjb=|jW@>4&{2)HTA2oAp0&^};yQeRd<2T_bW@B8h<@4i`R zZ1fRds#Od78kV%-$;bB)cYQALI1~P92YvDW_%1L7bt52G|CtS~hjE>{+`n#W_Y17l z6T|4087XktA-e9(0_b~v>onlN#1R9=cWXWU6MF2AZv>RmG{Rmz8SYh+UPp}sTq6P8 z4&o2Ok&77%3_*-{DUHWO<-=Rf%nt_p1O*PsPIC!46 zYHJ5+Ek(^ys{uLT@RUMhPoLP56-80IFRFV?VEcubnl+mKA82u(;7W;SA*sS2_oSj<(vFeTZ0xa2mult|2B|L39a-C zc4Kkk;H<<0JJ+}HvaRIscA)7HNDiA9HBo*XTE12q2mJR%b~&xToOanoK=;HJNXYKz z7poZc>ha9l;Y}-|6>O(`;~HAnY9*l;Q7HD|)NF53DUf0O;RE2M8f za~6UG@0;b{B0&M^Q6Uaq1*dShG@E4Yov*+7?PsrgIP;WnZ@!Qh$)K)JQTW)3T6qzg z)Vwjd$EiQSrcjt{ZcN?X5NT0R%jve5U3tL@%>_ zXsv0_vvn2(Wy|vP)AbsYyI-fxn3H~f1nKluwFg!rbH@T+tipI76uMARxDUglH&8D+ z0jDOn1BY-(Y}lX%)ni>p4q@T1Y1xy~+_a^JwQC+*KNHI&<@EAym5qv2%qUg=Iu}_fU9iPOKw>tH2v=4)iIy6=-dEaRgk%w4 ztG^>4^b3Vg+>%w!R0wzFA**ohc>rJ%_w@Ik0|qd-A|1d$z9JmMPS5ju81t2D;QZlK z=>#DCz(zD2>GacrYJh6r0}S0`7%xA!x2Fd>+|nZ)DUkmg4?o*_KG$utn}S zA3mylj%l@YZiUym26c0isdf$EKY(hG=z zq-TFA-_9>E+DPOdKYn;`&dp7KvlkgET|5jNPHX`rc4TZf$OA2QVrBFSuaaWa5N~Cs zR-DBI{u6#j9_bZ|A;IDym&7v)bg!KHqVnj>(bSso6(1ja?=bG>R4&c9lqNE!ibnwJ?mRQE3$D&<%X6U8Z`%kEfH^!~=2I5cJTx7=1iw4D!$i%2^TCM6- zEFc-?^xSQCvn{+X-pq~LAC-Trk9nvyBtNtB8?=_*GXckP6yVzeq>+X5fb;c(T!9x} zH+!G9pONm_uwp(@{DYLsSFqH%7WJMP7fk2WGq)^H1N80beXO;d!ToF*7eNz^A(;so zwXK{%0OyKyg&8&z8fYA``ZOA+3#*&8F$}8Hk@ouR&zPT8P1$V6@l+-kxV{FM_bhbj zVHWdEXWX%n(ACyrs<=sxTk6_W&vo0vsN;pM1zuJhTADhekFzaiZbRL zmn){!8YZHTMCb2z_rfatgO_9~r$^-2X>wUhgU-X|BC84``&N`}7Q2t4>-XarO2IY3 zEE<`#y(7!L{5dG)tO#b*RLbu9sFh!`oy@vw4q@WW2;jhgpI{T#jJmolQGh8WM99Sb ztEk+EE#JMQEqiqcp<-oiJsAoI;6Zlk$etrdp}30i{@mxQqN6%8<8~o1-i!(Bhsx6P zVaA}$#L!N20HFIHsN_5Y3z$(0)Dvg&8Ued3k57q9af5j!(i6tUXUD_ak)l_QJHoc{ z+iY5gIh^QCA}qXnQac(T-v7kUu6Mo`F@5do*7F`9zPa2#yV}^#mnfI962~{=q7@(GG{3JOd zP?UFN*>cM!LQ{4oyhtJCwc#66$*cLTNw@1&*Aq>XpnnuxirTP=Mojp>>@ZK?o97;5 zZH5O&J3=KzZLcT&>g6wN3Elm^wTA{<4zyd8ZZ@=dVPds<=svera_>i;Q1IzpD%xKx z-|AbJ4NtQsun#Qj4h_c;{{U^JwWaPg&D#9BMgQ|qs#WYwaF6kS{B)jTYGezfN?=eBU1e?{wyvFb_QZ@&$FXI_l` zxSw?QPU^WgO=r$)ZyY|O3Lc8nk^7!Ro2Iml9H0p_{ZJyU6(F_s<;fhE;LyD`W6tIV zJ$WB+qpQuq!VbjE({^!ONC*B8fg%4V!$vQ}T3`WhKygR~PVI&FWedogRKr`Dr_>_8 zq*>c6t&mlaV|kKNG4L|rJBwdb;aJ}q^pFPe0+pkZLSiFtib3=RkEJ?=?#i&2Hz<2l zI-SUxkKbuU5%9PzZRL4u{N?B)>c8^~UE6ufm38|~#YI!9~w8oqV2JMT@e)1p|+Mc~x)NoB(S^WbvBMeK9FAmIquAX|n zylI$M+k}_g0c#&PQl2Gx#z})k#IMPt-i<*MuYQUxJMYgXJ#3O&+V0|KIz9B}Pwd3w zLxCr)3&v)%5MGFP_AP?T>R(+3Bu-V82y*^u@?Ut+U+``HbYTzTKLv{@5Eteh&8`?` zzc@uy>A$t4z9blW>@074zl?OI0B^+*D9~F^%oZPPX;@R#S3~)?foJGPfHg6Nv8Fcq zL&gf{N1R0Y_2%Vb4iA$YIW+J;Uvv1|ZVN!_<~*W`bPXts9_ly}YI-@4>$-0fCi~5j z=o|Uo<;4XpU{WTse!zh^Lo{Pg7CE8C;;_8d&eSh!f`s#lmz#RiDxjksEkB<@?!qYu%C;1{wC5T03$XGk2_VDFo*AUC?ccUnBOcac z3a5=2ttkp>obstl4Mz)~i*$cm50r=r2(ZCoxcAK61HfbKbh`4%?)d8mDiywbq zls&q}D_0uh1qiWYPF(#Ts4^G5e4ux#=&$tXY5Pm3iiLaJ3(w;^RbZd(@{>O*@PwK4 zDjW1TY+)IRsVoW}Zir=U%&5j3KJo5qkwn{4gbI_NdzC%Im0Hey&PkBJ2xq$8EjCqHlxeZi04$-3H~f;5Z`3v0MI&NZLXl>G)YIg7$fL}PJSE7Q60 z1+64(Bmg>y(UlH;UNLc%4$r&kk8EGJ)MeDbb^gQ46=xwoK2FAF91C-hrq3EL zzUl=v`c3=;ofCS!=v@g0K9PF78JJghf7ua_UDJ6X3wp9@YA5Zzlts1tlGbu$v1l>a zu`~D}Xw!Tj0VOP+A(cy5T@TYQPmQ=Kve<3jY$Y>fka&V}5JcoiS0teESN51yS6Lm~F}CX?*7L^vYB7q-m0?aJAl9 z4@1FATm`!?dS#Poiaz|hebwGYR2a6dC(DUI_&Yg=aI^XHrJ<^Uxbbb{#3QbqI<6Xs z$9>a~hNRKvmXTvCrx%x}=F?+zn}*CM@!tEKL-2$2`FUiRa749%qe66X(iHqf`E_6m!&3`M1o(&_*rxK?zrH2OR|DYO z4ExH8D`>FB#*JeChvG+D91(Kpwo#r`>NIZ3xs7y*n;Y&yxuIAbzpWN;FfdM~eWQ;# z-0mT0FYe#yDB9e#CK+V+zo$sr33}XtE*%0n4@!SIhAtvTp&@&}w2BVga_gu-QT44= zPJi`cw7#XTRJ_#6>u zR(w`cmNOwNI_j5wSl>89Ji0be^CmJTN)>~mpq80D@hA%W-J>NfaJ#RpViT3TcMnbW+h?!0VOdJ z$yIqgd50sw&N{%|h^vc1&n&cQ>>oY%Ho*J{FI@;_~#w2bQeWrVkf-hB(Sg200W;hqYK{p_R|~ zt=n?6=09_t0=+3ZyQ`&1^Pj9p(p__iK++AJpiGTG^OOYYntpUb(C zJeUXQid8+3H$}&Cj$k4VZ+xe&1Du4;AmAd{s~7x(Qq~jY3HzLa=4uwRj4}Cbb0IM1 zC_;_!uIkT0cR~si3PjN=gMq$cjsC%LOEj zz{-*;eYqgMXE!uD&u(>9*HRl&4r3Ol^sSY}$8az~1gI5py?TG)zt^fJukVlqbZq9S zOrBY&!%0N6(Q4p)rJ%BTP!I|N)HXCK--wO{9;nz;4zh@PkwRnMrje|Zk5!~X==Q_o z{P)~@N;eLmF8s$^Wn?VWbj;d;la$3pX^r;@ZH`AIX;}TzKl-zBn2q;fDUg`g0E%7W; zfRi%c@i8@x{_^Cj%i(!orDR1U*OmUN;!^q6jn`~TAR%3#CUg!(C;g$J9j4FCU2C4u z;L8}b!7G)xERQzSoq(hj=q`E;wX z;i7pNZS>irsqbLFT-7@Fxjvya+0CqHiFPQ};u-jMe zinUf6EjIk6%Ki*t51^a?T0?Zf&g|{Ijf0rOL9g2?fRhGATz)SdA-8fLHP$NAP&RS|B6ycRdG^|qeyAqTy6&n$f`0}3 z!Fwm7&OdVkTcJ1%b32G~5PT4O#8%1m+|Z+DqZ4QO59t-&=!oGywDg|$V4-_LvMMx} z#opN#Imv-<&mtgMN+;J8lk4<#M(R51l1ZFEKaJU{g= z+~kCzoeLMh2JLuuY4-nZiz3KL1$h$aUn*7h>WI)q|M{X+lBQcMhc zUx(6ox&^rHd$G%(*!EI$f_sm3)96MQOep1nc>|`MTgq}Skk}|1iixn3b$7GhSg)yJ zi=DF6wwIT;nQ4rTbx0vB=(~xecD-d*4i-J`F4u_W7UosuPke-JI z!lrls&Jkm4w&wbw!%r<@Q}t+#+kL7JCAE?!HzrAV#N<@^TwBo;@d{8iYYk3IuMDY@ zEj3cFF8Pb=k*__9HY>>JT{kK!tA~Fea%AZzcVR&QDz?+YL)KPt^5$m_DQNIunnI4| zGD?Fk7>Y(!X$ z#7zaa>1SSXz|5Tiwdi|C+2XXZFT{y|60*1}Jo5N8*`2(Qcau#7%lzWbGr4b1YvW*Z zRVBGZ_?^_r{Q{UEcrmW z=Fj6NUFOvf%Le99nO(|$D_&yPrs`3xRfoO3y@QH4s`#IP2;y1xC8ttZ;uXxbuLL)w zX44-(AKSC$rIbI|8taDbVU`s005vlPJg}Yt0{47)gK-P4!A8I`96xD z2!7?UxUea{5j_^E-zR(jII??{8j>s3iPMmgR~BpkBypKo5N}!s1$R8?LAAZ4Hp6}u z%`I@MVtz&Hjntn`7*Id5ebpgh{8Ew1r%>N^SYCP2ij29#EcG8yU5upa>!vAdc7(|D zEb*@LS&RWe{A2SVZ2iaL2E45>NBE+Ki@D5mS(qr4u+?SA6RxHPq#m+R837NE^ zUoP`F0*ao$nXpv6P8*ulQn0rBDhhyy%>d(7J6k&oQolvGi%v|6)?gMCX2?hux{1gP zyIqf@ueJjX)uD23(pmEjQ?1_zTI7Q`?u~d9{?E74pYa{atr-!MR)KO&vvtB}(#iP? z&MBiG#s`B|LxqK;-?g^R$H$^9Z|?cw*At_m)97vHk+IN5@pE>j(6~mvf%Qksq4}Eh z!IALv36*!PZfLmb-rlA$13nSO@s3B>B`$RKDGukjWh)2GI<0Q|du`UnMEFVTqzwd` zxolN2@NKSpNl?O%}EC~Ha*|}y#y`j-@tEYzZo5{i^ z2}`CAK>PwV-e+e?cM~t{G1&)Zk3Z}{0NZV|XEuj}sBfHOwLXsAw1Upr*l%W#}rzHg>K1cuC3Wd^1_+`We;940PcOSi80DXfl?h zwzZmPqHF@VTW-yDcRnBtK{l(r+`&-jlt>Z(E#Fknk=;#+GX%{y+_IvsnZ_o=OBq~o zqI|G;fDwUZ{75_sj%pxfAH-AkjvRJxuk_^CThWm{Uli6pKBdBwB@S2`n<9gt?t4sC z;09{VHgaToQ4c&iV1eOb?}OndnUbF#1>6iWN)Heo@6|Z9E@NU0@^_8x*2LDufd3Fi z#~sy@il%X7O3#;!d(@R2y-QBj`a4Xqk;^_bb^k0sW0jcUUjjs&LsEPQFgh@JI~$$_ zVi^P=-L+(|`pNUHC$AD`UF<#WE-DAfNUPNfNE?6NNTkxIXa|s;j<;Q{9AMY3qkqG( zHSKzLV{7LR*n>Jq*^^i8Q#uksS|N7=thC1F!{C*dvm;!UU1;=L<>*U0n3#k$*I8L6@@R4W?#C*gC?6wU0?2hYvhW1rE*XmuX&+FhbH& zp&30nq(5^^Bpwq)1fUoB<81D(bU%#n8|Jkdq4EM*_A7aG;#Sz;4A+n4k&Wm{8W`6= z)cr~gUTd3N2%*y5h(9V+BbunhqqY)#$7ZI$dD(d{Q-z!T^Sid@FZMBGD|F~!0&u7E z_!1qpcPKE#VF>!?tx_TCSY}7byVmlovjr-b?euIQk+8*ws_yEa@02?9yvIWJ_8-x- ziyYt(OA34BLi(tl-FL{`K(NHnqGvcQ@QmHur_n8M>uTBqc|n1<4&4V(#zx|AjZj9+ z_s#AkhkEQ%{`+hgrlbuP! zI{~Z0h#hc@YD*ZiIWZl6;vRwbB6^MAR%uVZxyACVy8RKkywPxbczqA~z;JS5Kg6`A zmDow|A?cZv>ZLjxmtLy)@cObK|B_$9n%t4>rG(W88-DeAERay5u(@+(Vb^Vc3s|dK z8)e*j`ofof8B>6}C7mgM>DbwhX09D(2B|Q1+%405f2S4O@I<@vea-YjS1a|~hqRE; zpEvE@oaLNhk;+?|Z^MLodF9TURf^vHMg%si6Zq?3$QM*cFx~Lfy~4m-F5s4y1hWLD z|M6{}uR?HrP~8qsI{djmW+NEtg+ZyoDLz4Hz@=1cohc>q8FD$?h%t|dIU_Q>D3r~r z=@^$xI-NcRAp;5aYibSXIEXC^Q5^B32{H!1-}Yy`IJSz~+%lWt`AIe^lZXG=eGQG& z@c@+&xu`hh9%>7@-wk}yfiyeIR8`7HWCAAp7EnSJ z*l8J?h_$FlqHSx;+sfovq3@qwv*p!2>Fe`^=lp0&rebP@k8S ze^`+uE|ibE@M7knwxvm1GL3gAa@%0A7<4yr0V?RtT)CY6g_&IJ=AlouqPV0?5yyI|~e-`)6p@{Ql z>5V{Ng44dpHr8I4+DF*Oa#E`4)F>3WhHcy&`mj>w#iIgMFIyJc>$4Py{XHV4RzBAJ z7al&~z%h@H6?>P<+V3_Saq(E}6V@9(`nmXUkH%xSvnrN)$n5qEZ=nSCz{~Zms>gu% zDsINUCl>-(j_?qMkftSf+Pa!Ed|+@6ZnuftFdb}v5)xqTQZC2R!rk&BrbvUQiU6<2<2&;&ddO?0YCqeF7`@aT6v zX&J!UZ&oGh%#0^F2efpgeU*>=LU@Hdc)E}pm1rrjPD%p0NE`wGXCHf{;HHBpf{6AWf9ZM|)94 zLv~4Z>GysVyPI*lCeb?Hk%>?Y!2Jkoshl%6>fG-(+CKkag6AI!8s9S6WrEst>Cb%d zKhPa~Xw~qeM)xAOD35876VEY_aQURmGzCi{t{>=PV}3RRcX<7~{oVOr)E=3KZTGZ` zT^wbto{l-sQJ{ne`)8H4K84(G#F>x2daTKNZ9X#RN5NG0$EqDPw&-01(u)Q=L7qOOO5oyOpfm|zml)Se;?`h}LWxuamY*FzR?c8N+UdI-w^QZRJ;je|cJa=`(b2(l2B$@9o(=w6*q5`|PjmdPoN4{>!m<2!8>v$LBHzb^Pu>Fw zH;I~<9UYT*f9++8L^jjCy%7YqE^hPWscBkitaxkg6I6tDa{a zNOS{qLl-u;ZtZGLo*uIC%P~CZBB#w8BqP@b3dw$JAir|(}q=gCRsdwY*D6Wo`iX7sM7XX zbn*JQhkEs=KS{1~T&0H5vnU)3+AzR2!zxg=zxlX6>^-cZ@Vwf#STXw%S+dAjA;x4b zd5fbc8#-*NU0L;*k;q@zif7ygtm!s!Zhi-%Yj^wvg~RP~+`|{rdd^Mcf3*)u7&ie4 zKg~uadSNF*F+``ir;smkOpV{D_3pt-u(!j)?_;z-7Mre|lZ|RYeuoi*9o9eA?G}}@ zdpzuUAMTIDzOCMG`GuZb=zI6^fMmY)yOZR26&%PL`qh|Rx&SdH9X7eqa@X1ETRnj% znM+R8`nD=+8I7t6U)&-F?=kQW8|&B-#kQ2??SlA*rKaWn^H-EdaSDa8ynd@gYSHS2 z9~s_2Kn{1oMr$Xa1;opk)ybW+$^R%}9Rs_uhg*rvlUqF*iAP8ef?QkNf+%P}32}@{ zqX5G8$t@v{*7EXY6)AQ9CO2J6`%&JiHS|hNgX;3`godt@9qP*JQ+y=>(2~*Og93sO!PK%d|!f z8%aoi$|>JWsqonXH9tUX>K6lYt$X{RupS1hK~2;`s=ssO&+oHGXzF>**RCOrEp8+D z1^zZ?fP@)N{3hd0XQ2)~owJZ_FU-rSAXt2NJ;0FWw8%&;)K*;EUHOd(4;PL=j?Vb5 zTW`(gYI5B*k@EqGs>gn0?M_+Z@bIp;(e;Tj1Twm+XsAK^)qH>agZ5j>;oQfRL+aZ# zlQVG5iA%{o<-)0-U3!4HbYK}1)ldPgrN##bpb{;;FwBF`L-gk-?>yGMLQb7;eidkP z14B0L@Rt*AGBz>1t<~m$UH*WbfR6vwU~&{v4OV^&xQ1JPJjRum|c@Em>R1Rr~zJ<%%I(_V0r$*a1vUHQ*wmzRr zm*~j(s8C$sTNcU!1Gtk09CC7ZYr|kjh=1`>hVb)OPp)lB`;-O`KK<=P40X9;_4O;_ zJnr7L*t^oEDX#o)=~Ohtd$BZOhdp~6-7q(I0NXgYcV`qwe&G|oI;cO?Xjj*FXJlVx z;zjMu;Z)+qc}SD8eQcdMZI8Oj5*3uN1yVG3(pi%PmBwCD=b;YLi zH7`3=`-|-hm@pOpES@}}ZSJbLH$b2U)^ulsB_*pCUFH~q0bUoSZAoeWJAZwIo0x?| zVPk}QZpv$SxAcS*0~p_d1&CL7$c^COjqfM|i`aA%cglWSfAs-~&MzzcI9%qdXspSw zYGc6qFOUr2w9klR(ZM^kp0*!NQDz19M~%+w@o9F&z8I1hJugg0JX5RWhfHmv z+d2UVM{G}IuNAdUWc{Z-0R^3~`FiAN^zQx#Q8136)G1zrS38}(2V@7DUx+mln*GfH zJg*4zV13ya-y6SPHuXw2dH9vuU;`elG0idM%8Du~Xsz#NY{bLp&GVse0);xqg+8YK-}7|R(@J$ z7+Qz(u4A#|0338o0}jWtHgAc@&e>xE=hA;$tH>7ijI9=&<%u@R6qE&zVJLn6MdD{HTqsW@L+A8)#MB>Z{!sgMzkA+FK0NcE)RNZr8o%fEA^! zGA7=BkK=jKIdnw>p>-)v$rM9ddrOf*KEna1^2|FTLt`U}M!X zm>QkeAOJ3jIhrGYOCuPAQmm=Wx;U{Yz_GDg_N>UdI& zJKYPgz;4&N;7!9a(3gv?^?4n50^>&~8|FLcNL7V%;pHvqPt#Jlv*KMfs4zBGQroqT z_w=|eyjGLS3Q04f1nD^6?>HeY9Qsqek+y{ zz7%_HWIi(WW759%V!KKPXD@;np8md|6HR{Gtw08Zl1>u=sDmVVdqubFw2sl{lj-fs zt3$r+TsedPuKy2o6n!+2bFjZl!9#VS6J!`-IIDP~SC0#=4oW(4gU)^xS;^JE&U3GK z-N2H9OLV6+ES1iB|5V5I7-gFMITyyIlBLf1YsIHaARQhLPtgHWw%KS&R6`G9?c|M4 z3}61aOXL>{Wn|Sb(WTE4esY0pL%&57989s`e;OSciKf6CtKExP6^<+ibijPqMZbSD zGEF#mD%=qJ%c3A0xzV-^*|NWuP7;uFgLLk$rE>fBHIa8jNz!!Dy?^Z5HX zaw5R9#Qrkq-1tBQ%Et8Kqo45)CZil8aO-0+uUlIJP4Zzq^8r4WKu65}5sZ0LKX4KI zgJ3a9y8wz@r&D6B^NCKO5Yc7(wY~IDB@!;y>7=!j`Qh7kLVdgk-;7OY=n@C7cy=2U zuiw3x3oHf}R!uw&UUCcih|agk*5GoNuXC9v`HlnJt*%n+4xZEV6GaQIc`yyoXb}Zl zPO2_%odl)1BGC#lfF|pV!oaWaO)k$)*a4!9A8OPZbfM$?uDq7}N@39#B`!qOaTirov`#DuTcklXxL;C4AFvyC`6}b7s z*Q^~P>?AOsO|b4b)b9iGSzwZeU0oU;0NDkY@Tla0582pD58mh_gYSE{k#H;~55A!^ z2oPcpvInnP%Wv99a#Ql@m9w%PAjXYyVX?S+!)7)x3?u_1-&0s@J(^0!LaRm}pyV87 z?o}i7EEfkml2tq0+}uVSa$>mhxIjlrz4u;YgXi`+=4Qj)r~sCwS|<(2Qj64gJW*_t zvk)eD$f!Dy`%*qKPMbQTaKkoHYHksL#QMG+r6k6^+o7T!oW5Q$aQ0YqrGx&F@=EMO zQ5&m6(HRrGs-Nil92&I$C*J+_HiH?O*-&~q-?7*B+L6b+tM}!NTEx5ga-_}8%648+brcqiIfE;rZR_zvPpuz?N@xBk5;)0ZXc2%T+L8L$(28cv z^vPs9d?k8C99OB!k&`rAJ*`i$r2hF@hb`SF>|pB-5s0XwilHHpvLdnloG&p#^D&q zKY#xd?ySs^3!>YJ!r`$8Mzn4ZYA8vk7)<&02@$?KeDVhTko2T6_WRVGi;XtQE`B#! zwp{tD{=E$;DF0rwLdO;}npIV*+`%BZ>!Yv zBFi_a^H$7N1*0w7xHmNPa-s#it!?W{vEwlc&{Y7d!5FKo_yjrx2p6E_5O4t^p6C?f8QuUmy69x~7I>gCwc%q#q2pqAh zpBk3ioUS3i{i{dMYzz&YQMZ>*@y*YPB`0OPBTxftR@&w)M;)0-MI0>mSX0UKSA7Xh zAcUY|ks^QJ6`q&9H}KsCAM5X;0BW!!t(jBW0}M65$k9ibCP!sAUmcq9Y-D!GMLHM>_SpG*uxB_j_`vT$S=C4mzPl*u0>P>%gG%@>2J#nPg&AhGV`pf_wFW37t3=Gd_31#pKrof6!6OX|rZeLr-CCAZvM zW>t(qd?qVAJ{$I%JrKwrJiW2g8walhd@5vP4G1wO6J7xnRiQ(#4M2RWwkMAnN)Lpc zGu<9|N_477XgIzRh_@2mpbr$?sTEgvA@T2V?q?NxtPdHpkz~Z$?dSP~a5yi=D)%g#^H*iJ|%8)^T9VwUiF; zve=Rd`%FJ)C!k8d;FGe$L34VRzUzFaVZrYIj-ennu+x)s8XC0>f8>qWTG>9;kAF?F zzQ{$#+vW{bix_Qpq=X7cT0rhq8KN;v1XPhw(gVAoO|sZy@0{~WJ|wHT1dbxFAW5E z9nIGDi&Vj>1mX@!YATU(j_X2v}Z z<13{iEhs2$e0JW(cyQ6|&U3$bN)&1$@dP3YAY^6azJ|r_u@B$FCQj#baN0z8X(s?%=l$2LW_Ug$=RncU+A;ihT(Z{QUEU5fMV07fmK) ze%90g-7i;Fx{L;h|yt;kwtE!EjCFSo^W;$FqU1(gN#R$~MyC?ka)P zPu@OYG{@iTK2Bb9fY5-^$~1wMNH)+p4Z7>8e@-}#o7gNH9wKFyl{P-5%wJdN1q%ki zJ^`>6Vn{0qwLoG4g}-gT$mRA$Ofj!EH7ks3@J4z1E~roiB=|a-VEbqH_AHRc;<`II z0i^&0G%?)oq%4weeWl)t!x)vI_)mVZfazUc%tXy|K(Yx1p-)1GePQN5#j) zx!vimYt7hpT{APbv$8J*HfO&m;KXUFm^VpIeB(n;Jw*PH5nO$-Hkm&@xrQQ z%otEHh#bKtX&D(c-=j}vUiN;@!T?0J__p~KxSHC%x9bN8cl45o_X04TG6*g$k4LTN znaQcy?7$*fkM(jLwGL3?_mnHe6VQK&7SLFc16I-Hg*&pY;a|nPh|QZZQ4>i|tKWYO z0^q9s3=Ysi^`7Y*UK>WM2v>GhLJHSY_0uKYpTyD&s zR5Ojn$?BI=ud4_|=EW=U~O}-%HZ2Yi-{1|%Gtunb(fCH zsU;D)fb*p;xhI<31((=Q!h4mjl0P{Vb{}`g2gA_o+iE-P5xvfe-gmQ3_FQ|4{r`V*ONv58$ZewBDVOG6L_*0mmnnppxz8mViXw># zkxS*CSh>x8q+COYv0-FLb88HnZQtMd{QmRs@Hosl=k|;y8~Q$dU2zGNXhhY<49wtkRz;Xgpq<$>U-#FHGO{0qw%k2U!Yu)`B#6|!EGUv8j z#IXeDWWNEoUYjM+6DgXmTRemHpx8>Wp*wLkWkp+T@c@M#0o*GZ3;7fbN*lx2>CXha zIEBdAOJuZkkJ#7<%zi%d66X8y9_|2;e!U6AuwZex+9wuD8b>LzXc28^Uf#lH1+??R zD(`lG$(E(cTMB}~U*3u=#8vFa`^+xZ-OM*W{KWqr_I8 zq1NuP3(*s7Q1}$Ot*fuCnhnPQ2RWf`-2Di`w`3=~Bf7_H607I4Nlu@(y{kNH0t3U<#H4tTa#3%0g&ss! zatUhH(G2)jBSTmd-JtV47ysWC<(U+Th4Lu5b#u@Z^@$j-0~-|;e}2D9Pbn=dQETLE zHrq4~6GXv~=zCKuD~(sL%nCm2>33JKXv+8yZBl`4GV(wEE}qHa@T<>lf3AT+KEIKNp3fRmVRVP}bx~WvU zCdcyYmv2sI6m>Nj`~2k)1s^X+3zC!Y=2!!*-l&ZDf2YB@@LX;Vz2ln32r;D=&~4C%zlW%98Z_7db;3E7(xlct zf1m&GGt$n5gY&>4VPrg($CsRRdWt~-(qV_T`73blfP9*f={C52DCcMf&Em|t)E2wS z-P|Xpl-Tn9d>au{Oxro3Hpa$n|CW25W;y|TZn#nUI2ro-Ok61>5kxpDr`I>Ab#p4# z0EcO7HZqI5vJ0L3A4o(_dqm=)HYjvPK|0hX`0N+`)y=F7bwEMFlES!OvvR5JKpEMT zq<6^>N}Hd{p3$8-zqlW76xDRIs6-BX8M?d9@MkFn+7tx@72|i?PKr5)C=RKa%Vik4 z9kE;+y*Q%RYjW4R_9IEl}YR7nA{lW*{g<`7bW;MtJ}3P)VdLbN4ly&9@$#Q8CAm$&N)GaR<^%?`NErW|BXvFA;O@qHq;cjk4Vqk)H{(j2lQoTBJB z>rRFezb=Gsg+01=Xp{4hJaAbE$_N?u< zN8f(|;R}f4!7jft?DrHTu!HIxmuuR#YB7wp)ejfu5co&{#`k6jTf@JMxy6ejH$gop zG5UyT{9^t7fV8%GR7L&d#&QL~2SdiVJz`WdTtCvc_TzfaMQ0wrs3fANDZ{%g7pX~~ z9U2`pTqAov%tDO={bhRsvG#2MU|UDNiND*!`}(QuO`~xc-e>SPC8vtB9m3M$zIUyL zTm}P3A@KV#m=J^W1a}G%xY1e{?|WS&SAstybZ^`2q~)v@WIU-U@E$*x0I%kNI`BRGl6pTO21s)o=6$olYu}_25`I<9$ zf+LqQi*q4K^6<$=G;SDstEb{V^;2o>?)|iF-8!LbJ;@Y~;)Sb29 zM;o0trP+ll&NGLtf${&$umjXFMT}0840O_c zk6p7G+AO1z`eQ+pT9EN0T1JtL`0YKYxSoZLmr5QoZB1# zNsb7(K1q*$-+S1U(}N5e@E`!-***Ria_XG^*MXoHQ6JA`_1w z(SV8%-sl|J!Y>oaS}U5h_ApLAF(XBZrp3%2fv1_H`o1DM<#SgzS^C|$UN-VA0DKDv zei_-@tT}h2hJ3ShW0q5fBR$&VcACHe`%(azz;yZ}u&G0xLv@|}%Aa;T44rDp%X&Ye z?S-zuC=|VBv>~rjSP{Zw0RSJNk4M7{cyyvegm++4O4{SL#}FsqEh&AamY0uO*D_!q zfSde}pN_$;vf#ddopnIm*2IZN^n|cROC{<>Ft3MUU=U}u=fX3%5)iXwn7ezndW{tU zOtOuG;y&&fZJ#xg!%4D&bD#al{dN|I#AM)|d9+fz_<>4k#MShDz{M&B0G<@tKMv0N zNi%19r^ui6Y@03n$so&BiQ^o0`}p#l3G8irMfD+uB^O}V?gG;{I^96F@+plz3p?uV zw<&(RwfH_HohpaE(7zz`PRLv_z*-o%WO4ZuY%P}Ao_9C2qjmFwYy4qpE;6_s^foLD zeR^nhGQo}GhIK0f0IT?|&%X^g0IG!AkIGK3oQPM^vpQ`$oFTWhMvkSOxkIe#Rm1_- zsCej`&D>Ee=^%ohQ3))#L+g}0bs)~$HlZ_@OmzG7LB@A72z1vwTflAw6qfCxKl~(U z;l0ViE+>D1*FjTeqG?eNu=a?1Vul6YO(tJt^`*16swZ{iN*2lR%;2{vYCESoK8vOa zq&BOd+8Ax@oZpB}LI4&{S^fjzes`kh>S+%?BPCc*+~yN5J$;b2z-zW6yNRAWH8J$x z8rD6~tfTYJjtp3$>XHd}^xY!8!?M^7@b4Foa-l|(+&Pq?(XI1me>8)0XN~6<&_B#) zn=C1Eo*IlVOFYRN2S6wB>`!ZF@#N4HMOkrp84QC&t2c|69(#N3&CvO?ddHTyinP)d zBgbf1;F0CJ@;9GdJO_MHC6CLXMrTQUNWKm#+{j)6wjAQE5=FXyYGT=vaom(xclbCv z7tfeZ+LUD0ubv5+jGnJZNRmeP{qz+zc>W#os3vyfzde>C1*W#sv`>!%v@%!guJ+5P zyI7=^KG5-@u5?XPy|pyeWHL5JgI=@X&F1OGytaxt4zeOpo9oU`SKj*ZIh;+7i1pUiXdgg~9&o4Q|_Ov9f<@kO#HD*01 z7@_9z2;GsjMu#%!kN9d|U`AL$3_A0vWAcrQN2oo5(x~~H<_n@10~IOL3mMINB7PX$ zEN;l7ID+w-r8cQLkF=e5_k2fgHSl@HK(-5qIk(j*rrXt`$X(Dg@RM)l^z2ro(YDdT zo*eLYwf${xfHQW|skGXlprEn`qruDNtB(ea|2WvpCdTg%@TPfPY{Q}s#DQH()Z|`M zzERt+Vw*=SUBv(7An z*Ylm)n%FNH`!a7MmwnxfyaOW((t7zl)p=DH<1Zbhe~tp5LjW)^kkHlD8E13?26UDh z=IbA-*gFL;o5fqCG>)du$ni>_=NNbog`NF)i2kYaXCqE30%*C5O^HT%T$!3B+FyTK z#0PynGy62T+fB$E`A<)mH{aETU5w9w)a1gPs;o<&4e&4LITvsXX(kkQL11tIYu6N* zE7c%q+IArTz~uxR+4?G@CB;rpw4=4f*(a_$6B|T*bJF&fvTtJZD(~f8K!;)2#4;ng ztI?}zxVaVcxAXFzpSlOY6?0%7G2Ted$lbdM>AMCxRMb?_`+yit|93st$8~3kxNyUV zcarJTo4x-7?U_eQ@66oW!VCdB04W35>U5-Q^)B-&U?_|qgsaLfT*}FXq=55|ig&_0 zdY+6uJF4+3<07@8agsGf*+(K1+ZrOC+U~u`+~|PNqk74f z5&SQb%vHZTi;~5ZirPKB9nAb{9`3hMFl&q>Th-PyC~6e*(9687Bt-6VIzkjrENByo z^3nJD8La8oIme)*@*i{#U%^$xGH4V1FO4B3MUfWjmWuoqBU%YqeT{|AsIGwlk;1~= z#zWGkhgI32t^3*P|4Peob&IW|&n*@?nO`K9LUc#?<9-X6hZI?YgHND|cs37d^63@~ zKZl|){@%0rov!z0|I!HG8{xi{M zJlj)eho9~&=FiDCYbMS9U=ENMagqHY$>&$ov!UR80_j;TA!{&;)PY-IY7yZG-F^yymD9%p&>hvj>)r2B)01!u2Xj zVsHkIot>!Sj55j7b9>`JI3i08Uu8D49GLfB^;zP2zlEsSiK3@F4OG{nH$9D*0LC6b zQhLNXO9RUNv9&PeG=~&3P*}kkT`u%B9xuP96&f9?2NPzqP>v4zEuu;z_ zme#cSw!|X;%@8!Jd2K=|$!?)+3U9SA{DZi*pm>1WUkoR`| zbMb|X8AseAPBW)!+=<)n;dIw3ozCI!5fkoLQQgeg=nyKU**Q&qNWoYFk&da3`+{YDA z0rbaXbcUd{3UVHabYu?mcbM`Q%30Rgt;8zTIJ*3#KF>`a?LUfG%=@M~9;~a&B@urZ z1ILm8gs5N0a-br7BdEBT*7BAUxqh;8L}EjETA(6m{j+}BiHc^&F8Op5@>UzWm?=>G zc@FSXfK#B9(aNF+#_NN}APaQQ3_iLMVbPxTGbC+GVp}j5rJ>vTs)Q8l&x&R(D7>~5 zPP8PPj{j?^cr&xWw_J+}T3zXtifBq58m+)A!FoS5w$U8fZD?ziZ_ho=HKk?pOmjSq zp}z+rc%@V|`_h)+ywIsVCNhSEed942ONSAG$4*TM>=D=ref`#j3#E7M3EF;f2zAP< zLCv-pkX<3$NY?GNi?ldx{~G;{SY)glwrcICv#rQU>s5%0tJ}?*hHUhrLwgS4yX#T= z1&)Tt-@H8`5S^Ks|MH+Cf{rsc-I9qbH_BOyOIOEVrqc93ypfF z>5%l6s{M2g?8t@RUqKShyAp?S;GjP^^VW zU+kZQ4OgJCk;Dr{y0vmc-xe3L5$4}NWa0-yeo5AG7WQ;psRiPG*f$%6WpAJ_!j z9PN@gzI!2uvRcA!eVtp_`Zt$W{+0N}?)xckjpPeP_j{LiPJDO%H+n0XVzakHV|TJ~ zRTXhp*8pnO;*L4h!~C+M%ISf&7w$z=i`SA>ocBb>19J$R7T+yKj>K!EdB+fGcz`_f z_MVfi6%6oM_}K&7YVXYw&dr=WSyxF1a3UMhwaMn=k-zghr#6=11}1ACCmirwOq42l z#h6RhQu2-*H&{FaGav(tKl%8l$x+^+Zt>@TH&}7=tpQb54ox2!25|-!-+z6XE&CDr z#wXkp3<~1f^mqo5@+Zejc$29o1W~zVyI4|r;gMm&(AF-{nZFc%i?Dp3Z=btLug?|7 z9&t(0JI+TcvOQ*TT15$7UQ`6AIS)}#JmA!JqFgyTtJXUs;jql}f1ozbkYmG4kCz1@ zwl*&}_G`3((zwl&y%no4LEZ(wkvzCr0jca5aII>3Ej;R*uGWI43TqnjYR%40!lrCSzbLo!*)ypFZ~scxSZVvO4bs zqyoHMH5ErktE_9?WEYZ{g3XAD^5Su`oZC4&e4=$;iZk+0+ftlg4Kwv-9ijx@RrT33 z*5cY503(&P5@7_wX^m*RhETjA8{{ReNA__BiLXeYgNc21pohKlx*vuCoPQU$`virz zGNM#0RoFbA8;FKin5lk$ax>Mh=B9a-Y+r~n`s%Q{4Ee!~2Cr9xgkY}pIL^Kk^=fIY zVsHZ9=QPvFs-bGRpL3DoYAqy5^8)3N9+vUukL~Q=s|DZJX{eVN+)~`*sVC$3fR0T~ zbE>?B*!Ev7rL#PcU<7hq+kCqR^8B!L>E~VBnk=R&+LiS2FrOPnbI)$QQgS$abnzGM zp)1UA$nMvYoz68Me?)k7!P4LiEdKa3?Ov4?Ryv)*Pga55Q32$=XsM)}5ULiIwNuHLOcu#ft@^ZoIm-iJbYbAfm z7y`dqVKTpERtKmFmR4+9QD18eozEBC2e|EL;{?WDB>U6Zm^Q)?qPCVL70Va<8_F?bBX#p2GB<)2$VeZY<|H&zm*q*(sD)Y+x zXP{jA+-s1>#R^N``Gej)*pJzNQ)L9Gk4gh}k!Vu7j?J|xeigxr(AZ>#{q8U;vMLs) zk?x;d7KjrWcm(&j;&{~ze$s0eiUFM!B!?oj1>fqA~-z&U*7f>W%+Nztq*ce+#W z_-buvOr`!N{gtTn+>FkCwCm;;6f)cc9wP{8mMB0ZqntQ(Q@g;x3Q4|?=x0=nZEJi==-MlVNE{Q0v=d>EBJRg_dexYb;tSWH{o-NFRLB9sPTovs_OB3E}^53YnO=c5W7fR)9#z%MDQHF);! z7NA^xG3>V-b;o5~-o4iS8pw3h{aeO@FXr|$&dSowd?#DmmM!?u2X0^TR2yX`=1-H# z4aB)4I+bDZXRdwe4m>g#>NFiHq9!^}ZA}1Tkjin8=tq3+*tj+p;V}+s_jjP8BTZHj zZ1oH6*xIu5rdv}>wcl}8vhw8PPbSJ?1ss-h3Oh~siP2G9?hosLf7)%XzLRv)DmzN} z+t=SNprc|>l)ZC~9Thj$(@XPRk@{-u@#Yag6u^?+13(xcFFxS3G;^MiH3N$kJZV^! zx)fGeBFekP`O7Qw1iUt%N1#tRFxtku?_<#S090L`9BI|RH>rvfBj z$ys7Ub%sBuoPMJkBA(o1&f&IHMfMfRkC|f|ZC|F*{yI#J+8P!c8JRYmRF7y56w`X{ zG$H<_;Y{BfR2#m^NaOUy%bRmFVx0b0>kdi$-15wSROjEn{VEDtpXQ~1P2yKnkWO-2 z*u49itzZzW<USgc?1+&)sCuAK!WL<}{3kIWa(lYY=9 z$ulz(dK#~me5Zh$GclSo9wAWc;hqmqNRtg?(QB)d+2t=jI^qWWQGfpjidz1qYR?^QzL*jGqXgsm zjMu>GyrsgGG7^pTxPwE)<(%J4vD~1P91isAEqTD;nLc%v?ES>$F9UGNB2~Pfi&KNU zx|;k=A-B9j5Clvv4Uy^BHNLrRY9{i82J@V)aCnF*2LL=MfO`Jf%*VnFi?_c=`tmPx zigu~exjv{04uj=33eYudUw22kkWxl4uV#m#9stF_%sbaLhEQobg#f}LObCWiHj4iq;xOd+^Be&9h z!;4zW!@=b(-2ELeVuzgr)_?Qvi36^-9{&TWc2;|QlX?7|TPM&-_PQLHECklmJKsfZ zrl)ZE$p2_+EIM>y5$OBBlygP_B!HfOn-K4l?mlSUK71#5zHw(UOishgGcwU~)7zWjZjzst^f}NW1z$YkH|NqXDQ6dv zR64GieI#sB80^jmH!f)nj>^e?Y)JR&UGr90cF^ncv^7X&&C~P=O$3J)!gGu%3mf$dIMt5sC*QiX1u_sdwW zd#^4y4?0ebWN$*?|V17kH+{7>yZoeM>^ePyFcEg{_(xk>nysH&aVsB^14sgkStTwXxzN;-AFs7eDr6*jgBL!_ z8~2O2-XL}~LRTk#6apr=7|LCZ!dW_6Pr+~K3;Q_cZb7X^m#DO7R@yJ(Pz^J8krmgK z3&59nCg^GZgy1F9PeWf!9=v~ji7ebKG|eg2b(rK&>&U^^QGk$XnH3CSPT5LaS75ZT zk^>oRDQ8f1XXpMn%Sh@+xRb?4N=WDBKy~${VbvpaKb`aO z+uvASH^X|*#j*&1b#vD*$9oH!@&Fk6vR+x){P%Im;!Fabl0ER_=&JwXR;r{l-&;q?^nXJ7^_CLet9BO>*2k(y% z?YJ030E6<*kHPG?^4EB@$nx6Hle))w#*#ryK+0p(YAjK7x^V(dVbJ(%oQg>lGHxLY z{H5W!jojkx3_iI{CNV5WuJTU0#zaA3E6O#cBdBq+=@3_AQh4pP<-UyE{*R>4qr4$$ z=xgT-R)a@xJ;-jr7U9{QTkW+$)sC%?4|J`hswZ zlHwDbXS??dIVB$Lax_6`WAe&wX;C%GrPtbZ}jv=_WHlSo%=!zRzYQmmRCJ~)L1xcZ|uB>dVz5`zUi&TB35m0n>-?YgSH zLeXh&5j;VnC%=F!^#&KthlUd7=W*M@017jwWPm&Sk=^M%(OV5pIsQuX)637zmnO`1 zklVFXgqF}d@9Nln%X@}xbR+5|2t0CgpQ%lpph*YcENQJX9~mrtk}LfM#DRbEaJS{x2D z&|%q%%ONcv0CV~2n-{$X?#le(fM<7s3wyGPEJXt^s5fq`!YL2iaSQ1z!>u;Pw3l+a z>5oBl+ojhI(2H_INhcDI6clGD%JHIILhr44AFfp_O&uD3aCODz9HQ=Jv_x3i4vNGV z+12s|Z=^MaeO=BdeoR{qnArmQgDH%sgl3B|u3c|PNF5g?IwJU^&+y$B-7V|t+FW)c zyGamm*u&CR3|E|7fOLU3KflTy>v<}Q%6-z$wP>qP#`0dy$NI8>J=5e9>y3c_mq*+? zeY;urp^S6WQSMj&$P4Fh=BQ;GtuU-FL1u_zGKqSW_DZJMpl= zC?msT7mYLqK2RnY9{1J_VepRtpa$J0^IRaVbb%0=sTxZhp~tWake0s!o6+56utsa6 zTmb6l<^#-VF*F=g7q5J+{<)({TbccB9Yc$|=ujOY&5yynpn?gH;%(AY>1G2SUlC{c zKhPcYn>i;?b&+NbHFH4x6|x5zMdrwKK>TU-XT=d@N^_cQms!Xo+z*@{Z1U}7P1>j5 zg6+i3QopUf@)!fW0F`zpMyYg>|MypP{~zdw_r?yNo~kAN`dc|pDGg4U|f4uc55Nx8CIjKnVD;2$l|DrXnS!a6j`)@#})^S;-FM+Cq$PmFVRwH6&O6i1F@d zgN;8pHT)LGh>d8{!rpY~Rf&J;>b45SCP{HfK(y7iw{C!3Eb&J=FMPA|BrAn9#I1Y& zOAF?k>n>eyYdECr<8m>^aBCebh1xvrR)UtO?A1A9q13xsA#c$w!Py2*NcHcCQ(*z* z9~plVv~7Ebviz&jHyJh8N+%{5Z#25fYuXp(NuYZwxns5!$}zS#8r$~SZwTZ26BDk; zq9SA|TDdJRN9$5GcP94JolQt6r_p@SIz(H%LWD5p8bEBLP>BJL4_{ajeOaiS@6oEa ze``r(Mn}Ou9lnX1&FJ~krPr-TNl4ApZiU)Z@9=A5=_>ln_I{6L!tLYttxVtBqr#KA zHwBgo=?f=816;S?#sV^I-~{}<>mDKdz-Ce$FM5cs8Zq_tgEOOqN#i+l2Ef1O=S}>7 znaR|S&VQMe#}}$ov=hW$pX`!s@fqO|RZvK1SmjB7F}j7NdDfAv#o2&sLfarcL% z78X`72dRI8H`wXrH6`qO#Kn?Kw#a~Ea)L&N#k&G+W9Zu;-XQ?2)90KE!xpJ;`0l4X zI=lizjpBBbA)13_>71aeM>rNX0Yjoy$;92=GWkx-%I@xA6A$aIyA$)o<}>S^X#W)@ z@3fC6Dh;=WvHC?vmA39qxWcikRcG+Sh5&M%Kbxbw>@Sx*=dnD^UX~un$VfIv1F;k=NEJP=9e>TJ7J!f5Lw0nDjxA4Hi(tA6BdH*U^{91*> zpU%VC$jL_~t0bW99(UG!+|_?uvaaMaJ^NSUU1T&@SVLIWlfLVOfB=8hrU_VUq^wmC z#vNCKTV%}MRgyE)`YIo<(Yt-`Y)H2#uh_N3p^^2|(!Z*A0hs|?BIfes`g%_B>cqo` z{RoZB3|>zc54k!m_GoSaw}fQLW^vw^@%)JzfY8X5`(E?rZ*?mGB@$u?ZgFIyV}%Qs zimu-6d||x@%<59(l35gNE^P-(wpzaLmC-xaxy-Bi7!Bw3rw$CpY${~o$Fp$oLcrgY zY@UnLbd1Bst($3}FVNF%)=%rvpBWsL3yK~J$q37jj0HCyGEiMVt84Dk{VPn!S?2~@ zUh01{zoB;&8i_YoFmyeyk!H?=2)f*4YXiK6wiL&6IstS9%cz?FJk`S_>9#FNCRuMl z8m;4%cy#2ba_}Q)1eSIXq|=mZJvUFJ16EX-*`}Y+sx-h{RXl#M-{$e8g5t}b5m82|O$8!$MWQops2Zn@z=kf=XnH$!-KY&rFd-UCCogd(IV0`v$GivVQ2 z0`FRhj4>2+3X@ry>u2ZuTQ}3o%q&>v#yLe(E!E%_J>_rYf-$%nuCqAa-*+_tXd|}u zpFd1_kM^r|w0M|6PWc@KPW2m7>Rk#^TK?Rl8jRD9=2Ua2ze$>6!5h0$P9|{`&ugi> z_a%ZtUG*f$5&~tBtKwAVN@rV5Y zz#pG{n33&&A^kG(^7A8T1y2jbS^>FGfo1(<(5l3p<%!K5pzz=0-s`~5QD8LL(c&-a zx8=?}lsLonSw3`{!}iv{qL>2v#0j0~#30!Y{d6Sl0JM>{*ip}iaM`CP%!9ENOO^5XKwu@6X;ir>6`oXz-tg)Pq7(jGAP($ zBy<)yb4rK`vf1l^D3%SK?5Sm;hEeX8zp0WvMuhy?>McJnmvYDHTktP$E-YQ(EK+~^ zc~s1Q9=N&l)kDmlorzTpG`GsZfqdIM_Qc0&(7%`O(4bMd_^VBPVkJR9Y95W{3Y`A! zb&+GbMKs{UEhP_1`-~ zd%sNt%>M7mQ0;#S>5#EDfTDHc0M#Wt;RJ*dEs~YZ=WjUXn>;#m(W>D#y)0j`$C%5t zYfd@d92zOdg_BE_1a|C9ZhHFKA7E^@-K7bIX9s6p-@bJ}^^SPqrvc59>s?v{oR`h40c26nkF(;pJWVE{UmS7jN&yVWkE( zh`>8>#MD&cq8^B6pc~q($y^F8GS}s8)*pwh*DRxOY@W{dz>mzM@UZWG^YejMrLJUK znDPf722YEPiuQt(8urM;O-z+pq;&*-_ptXY@tmauTKr|-59?>kcj}MV`K}@cjvGCV z*aMcH+awv3M;m=QFSYd3_TYwCZ*R6~e^=6CMgh;L^#4F7yScpN{ey7$H9Eifd{dmt z&f(xX+Q*0YabPzhZ9!+KIbyL@6kpZnHi2wIKquS#I)EbvTGp2!Ga!`oRQC=xX*O~( zO1d7w`|grfueB6Jtq;%q8Gt%~?Ct(~C99U>)|#x#l`+E|>X6W{AR1ESDqZk9n`Bl| zjt6QdJ?0eyXiqaWr7mwc*^9d*yyd(UuRTuL;p3TAW~PN~>?1`#;%q4%^C*mGBa=pij}FBaswOQiMg$Ui zTOtV$6Hav@bML*5|L0#}PSO&(!PqXd_k7ZQxu&)lWd`rM=MJwx{T*HX;`QykOh;?O zm+_4nn^%jy&u6EdySqD5B);zrt(gewfA1FJ-Rly$QceImo#;qHPgDLql1ect&gQ|5IG*jo?JQ6W1l&@Ke`6CQ!A{njlly zfU>{K+5wjJh;|4J7h@hIjJ1(n`InMMt=EED>$1Ii7ZHLC>raE%B!@!yqIz$L!Ag(t z@Lr|`5#Yql!)GONsD*G_>+D^suVJ-H?~*825h9CP%XwxtY#($y&PIS&BoN>rqcB}+ ztMmI%qd`*iO((P+NdCjq)5ismBOh!U2HkLf)g`4GGAsyn0+#>4>(;$oGG=6Ct7e0f z{c0kbEx`JBwKQSd+(cmXl-suEF`fN*U3&WO$DNMs#`QDo_Ts;ti{4SpzEs$_ne+p% z8+}>QzS9FE;(q$RdZX_|I?3%nr}87%nEfnR-js$oBwAop=*vK_OM%9S`A?n&q{H2< zRLo&CEWn7;*ath4zYhS>GP$08vV(0;t@hm#b(&oArh|HQywx6bXbr18#uB$TrVFva z`X}LRz7O|O%Imb`#|6TPT4~Ihf-t6Z0$%KFIc|d84iK2Ph+C#weD^?SOfDr0LkzFA z`1U9+4LR7(HCe9e8C+z@lc4TS@XHDl0f4(^`1Q(h2z@|I$S2#rTI9J}UWR4gyu^Nx z@nN&b4ftQiI?EJTnxiOoJ*NMn?QZr?4hY^D-%L|F-sBLkUpto3^?15_E8Azrzq75zAOe^>w|vG3gc?KWHqz@uy7eJ8 zh;DTfNloHvGLaS@;pBWdE1>uvG}dFA(}tA6SsMVsC=Iz%F;SCVNjDfD-Vf;vH&{3) zS}H{HN_*9Yn9bv%_@Eyu0SeWzMouhLrgP%>nKze<9(3ZJh)vhfTGLfqX`B;j=k(_q znGLAoANOihFt$`SPGhXP)dz9obK#HD>KiYo$>&8F5xtfRsR1zjM=JIFD<3?R!a!cX zWB#WzCc8iA$QL0c;g?-JTt@`V`T7U+@1S&u46nMF@{ zihFA;bk=z_#)#a*2YlV3W>@B1=NZjK6dyK<*+!QV|tI|WeEKdGc z8FKPsio>rBGmA;DRBf@ooXkq&u1!e+8%xAyO&qLZ)Q4?V`61uqCUBEzfZ1?KP;jpX zIMC57d+^ed7(7?+Wk|DEMhL|U3IT}zi-)_r;&oVS!0^2j%l<^ljf#!_kgwRMag`2h zX?mtuAv5W^B6M7W3L2J*+nd0}ZcWx)bMR?81R`sy{}|VK4&Z{nLM~;P_yZi~&|_7+ znQ1~Cl7EPs&~1`J#cJioN-+&fXM0;rSaKSF(l5{S_8UCHl?vi^h4k_uIQHApIVx6J zu8hV`Q|fMG$CVvA-;oh{<6~D7&vJAIGT)t^b>d0`ttNAEBx>CaBH?2J-et3a4rLWU z!_Vbv>s$@o;%0rC+UK_ONwsSSf6%Psxe>LTl<>7Z(Effmd_`W_fJl@RUxr zMU|{%Cqg>NLB^76vo|u0^^-$tL*Ry9j}`E6V7d(5bq+~uEI0df>yHj~=zet*-5rr5 zcRKGUBw9$i`u*Xt1mFdoNc_qt%zu66sc&U`Jc@Hxo8Qu|Kkur&S+EV+=i-nQ954u;D{aEQB!nPbGV{nh%g&+CH7NAr^c+KTq4KEfa|%(C2C-ndCefYsQRy4P9goFQ8!;PRYP_!3%2 zDUiT1z@ODWVt#E`L8Ng`r4xmx{gedSy=T<`BKorlQJEf4?X9>#=acEaedJ>&2Y2fJ z+{+#=?^Dle8SZp)CEzcAJTP;ghcvX=drZ{{wfea;hDM{6q`e>@1mg44*S zMxv@W!f^|(l{fKDPPSNE3WjX>+wv%B<)k;bEuleAe|d15Go0A{C#nn>2{G!9IF#A} zq#E<_|<1^(dRBcM?Gr7+$R&PZ@556{J*npppN2Fjz;>z;e_S`h9fU=#H#1)==h zeqm>zH^y_@Mr`!f`Ho->YZbdt?C5`sM3tnt@HTfiE2!36Wd&PNytJzPkBl5-1H zzh9rwt6TmXK%lKuoN_U=pNL6+_<_MNLdaOw@&WpyLL#K{c+U|lf9%m9d*ML~hve8K zgCwQEM)$kGznR@h4R?$rHjOfDx~i1@^?QtzgG3Xk^%~NrIX;_+4g7HhAwEuxdgPF{ zOyaT$q`TkVIM^b&g+8Wbpu!RmOc+0PTIvrT2<5%*r<0tm#ZSSkOP~1^WbMGHyZQj~N zM&6^d(+}6N`~h)5Uw}C<8b2etO2R%!9O+W;7Sfn|+5YmApqr;6SiqQjrcFt$m^KZo z_RHT|rm!M617+KJ^d71Y?7ePI7jvKdAt(-e7=?X!VSwuD^)#+$YKcdKkUmlu{|MM}V_+(Puh9e$5QbX@fDfu{ ziuXh0tw+yYQny742SviD)d-um7;=d9y z!?~!Otecht-9{li4$X%xqF1hZFy;`@XLJL^MCG_uH6ChuO}y*R51qDWr?@jLL>Cj{ zy1!6YMRf;@nD^%(TPSM?QVsb-nXrzN%Kf8ws`$ce!^>r*r{P}9xeu1Rxt4PgoT3Vu zi6)nIYC6;^Xk);rea@p0K_d=XKkF~GIA$pt(N7?DkBDbe&=3h`hh8^87{y`UKz5-D z0R53uIz`eos<40BAzpXrtY&;DpO~AscjO1wm7TvV;f;EhDe+3h$i}XRdna}1ny%}^ zsC=Wwt{@ecbfKsxSEI*-qWNVndq(st?Hs?2ouL2{s180n4yx9}nA~dN1iw2=`tsxL zY1`ly)r}E{c<`m-;H$qs4%K%OUmB^XRlH?4of^%1^ZSr!DHFvd4c?bh@3qkt>(-xe z&mwy4;b=RvY9Hq?KwD$lrX*XM+N0bS|9ALFVw6!7O6|=*yA6^naSPB=$u`uZp5>x) zS0D$$=~mh}zT?3NleyL3TCHUik2}@0b=(@ghKR3r@ zxd~y34!zCUd$pgBtEm01b>MmR2Vy48Q0P6&^0(Wp$TwMeInCkSrq(ntP1{=}na*9X1;WJnTiPC)(?w$kBL zY78;~;JzMmUlP3v6k{n#AUz8+oWALx}V z*=zLXSoz^2Mu!S3JeJthRXbI?HDN7fR@1;t=kb01MA;261Rnd@91U_`2C6^u-z-9_ zO7BwXuQHNjK6HW!;dQNsF0-N^?_DyVz5KR2#X;X?gNl=*elwUsB?-x(f|X_BwsM| z)9yrVac-u4{|EC_2iaRyq@$;DE%ob4zmXK`)Vmfqa(v2j&1-PQNCJZqqz3Vii`fU5 zt~`gSQ=1dlGdT4!b01-pnR2H+hcmJ04guZ==d$Yl;sIg-P3^an6)qbOptN1noZ5S0|JLsP0hS>=E}|siz!^JSs6VrHz)tAiW()1bqsuee+wm> zv%kY^tD&K$N;9+_-FIHIrj=T56?vg?ZT;X2Jeo7TAw?!7!>FEUB4$MeUOvKz++jje zf+|imqLzY8nlW)~? z-uF~D>-teDk)_~xCqtL`{e*!-F^v^ue%KKcxpn}(W;g!(wB`H%`bFi%UW`w_KKcVumpHiB#l%&Ak%JZLS-Jk#d{Jbr?qOW~RBd+4lXtKfnL? zc-zBX@7Fo!d7c*@8TItk#>K^|_0rW8m#%&`(SRJ8#5|{H13gW0#hA#z?hySymcPOMG6;jKx{ocGZBYP{61T8z)433(qhIprTG5ntja&BX z#~*BN)pmoP7X(F6x2glTO|ZSE^^i}Q29r5Ok%^npRTWrk=ABgkMggJ0A?1l%Clu-3 zMsjX^4SvI-JL!ADiyb=)%&M`4V&{*`HIs;`L&~-hMKfnR{%ot+g#e|kFUc#J*=Y#2 zdKtE}8KXKnu+iD$O~y4UbQRuXMZtY@8+c>3mhuafD01J2yMN|oGwQ4-JI9>S9RK{> zS;_oVJ)0Doa*Yr5NLD|`35Y+s+Xy`jo%-8TQ#IF|*V?;bvnZqe)^mGs^yA!xPtN@J zglxCy7>CWy&gT*6nP^N!Z2@ooAFZNN)GtbZHG4(ym;2MfYr13|6AsmLxl+p_oNBN( zpTFZc8fqxl?>%jAkM6YNzMXDgI){+)dl1;G=%Ms8OEBP7;nj+V#m^5204xU{iuN&X zb0!o4GvGfC)jQSsoI_R6^ z2kd&^m1Jbz(txorD2qS#3EQ4~;IjI5J`s_--*Gc)86Ey~3i&^lRBTj)5cop|U05nd zNA0Zhy}|D$L3gCkT2f)PT`kU9eyR%DImmlJGLwA}5Gx!~vQ#lYQK2~C-_@8MtLdvx zXmJRmroc=W-MqEA!`9Qy$m8%_sz50+2iD0z16qX*XLI)=w?v1Qk9jlmPkrB=vyC2A zly(tJ15FJ|olo;s)a!EVGoqId|Qf$`}<XzOo+r5MKetj;tstf{M+1b10Wiq@XwwjelVRxbu8fxOh(*Ef>vv(!m&P zeFtRXQOZcdu0c6uWGUI_A;7(944OCI^D{e-v^8ccT2JtJk_3?xK;8*mNspB;`$cJ{ z)r8{_d76|B3_|BQM&->moGhXa-JF2}HJxYtAFSu5G8#{y8#PT_T(etkNA5DS1ERmm?44+HoL5))!N263{|%}ANuZlvUIN9R85nEH}{UPMw_p5^wiwR zad}^QwXuBd@UbFObI;kTUfypZW%lX(F)&lFDbQ~>HSg7`^PdR4YWje0K(0R5zC9su z@qEF<91BvRpvIDwW3jxG;s%KbguWRw%$uibNI1ZjmZ9iKH~IT>#TE3I7kSNqUO)P& zdECV@GwagmrC^>(oB=GQ31<;b>p)@P80W5KA02|z#aTjB3e>h^BG@J|0$o6Qyj`zk ztEs7G_448cF9EcO?3HrQeq*U;yPCYe=NF1?DHLYM$z~z}suIt6&4i6zaV`BQ1oHfE zvC|tiK`l?Q!e_i}akfEpG+>J%?SS%e0OU8=x{aQ&` z)_YUpK6Qlb{2UU2$UFdME`yej?x>Wo&f#%&2RznWE5z{HDW_@2!qf*vyA~J1Ni?5H z81N}Wl4mBxHaZ%Uw$Dxtw2;7qZ-|5-Js>S|gIHd`=qpr9kLwHYxFr-0HtvL&@cBi< z(>zdbtW9NS*_CAn-gxM|#wQ}DLCbG{RQRyJR9ZUv)5`Z4bKC~pM91*=Bv^l z4Nm6*rTO0s==-(ZAwG{jz&MW_@PHw>6$0evV3_}{8tD&nZ=P`7Qu3D2ly=Ki8meG- zv64zpJ00$XFwj55(~N+{dKsA(&5MG1J~3DSJs@@pDPL~Jo^W<-@y8G=2QT`m>W^&Y zZ14lwU}7f@Kw#LJR&>lDfG*zq6`&xgs($yb@q6E}!QPGf#;EP&8KvZ6ZK;&3L;Og^ z!JZMugz%Sfle%$(Tln*nInKXl%oJ2hUo2AWidJ4_w$!tQu#u4S7y~QHImDy^k#_t( z+QIMyNg_P^vi4=lrDRc0wYuE&FJcY694wOIH^v*$`v<2b!T+w(sA-@_vJ;**y~~A) z)K@(0y<)|Ip`cy;je(7fX5jb0R54{briu)HF^GSq3eChipSqfO3X7&#-lC|^b6T^< z#_6CR&of4x@epY42jH@DhL2Nz&oyRR6+wJ0Qz%Y9At4#R$`|^*I$C-he+GjB$?u|a zZg^y9-FlPEBVLj3H#HM^9P%IJ@iwHy2@21@KZH!EosmKr=)_Kk*p0it0J#pCK0q5$ zwY0UnITLI;XuzK+RO+x;Kzjd;n@3;Z%X$BMW+_PF#)o!g_${WZ&fy!rb!GG0-tg}n-wNZmHSQ>HT zqC?{zIl`ghU_G#`s#W`O+kKWVQfWY#vtovx>FFeicG9`hfVOe38Zs?v7M=%%9Bcyf z_Wt<3<^)&zGDu^w%&v~=XUO|lx=zq&oJEkJa+2$7HmR&QnY4a1A3{-sQMX8&xOK!x zYl;8QB!#yw__v%@rqfHkJ1o6o0U4~~cfBt(XOsVhhaFP*_rM6^(YcinV}T#vZt`c` zb(=`XvX$hDk0ALt%mF6quPFQ}U-F*$2nv2)u)< zOW>H{!Spr)%I_DvYY&Ll!5H*6${%0Zb4$|EQn>A2dg7W>gZ~fyj-<+BXCR>0nVDzL7Nd7dicsn2$Y;-O=wf=1}S8=Xgc!J`+h&7;LY{aQQ3?OA8>bQ z6%9n<)-TaJEn%)r3H({oKJQaZZwZTcx}9J#)KbtsJ*-`U=z;Hb>~D@&1aDa8BM;yi zJHWB&Rz91dwU=dm`@5Hx&3ulfrK3B&H1=kq{t({_|@!L*2VQ zTe7V%Taa^IHcPzIhE6XnT+Wb(65t&>)o9|8opNcTt(60y{el7T!zA%j%L9r|(Z|BZ zw4bR`XUzJS-*~KsvIMI;RiSq}L$)wrb;-E>aZ79`L9ukSQ!>)(Z^`!>H>Mzg)hF;@ zgmZz#q`KSJFXvH~K@8_9a|`3SpD?jeMMopWUUv$;f7!!BI^Id_uA^?5g5})b)l751 zW?nKusEoV*Vd3L@_uz+=8K4ab*V4AH$S|w$OfOSbO!K!x>j)L5i8YE{5&t)=mG^64 z??zQ8<_0bQmc|iex56EG_ugMP)6tqUc;^_DX7)Zi0C_h}+W)QGtLC&4!=Ew4yr;4Z zC~#$hTQvO$Q#}sYgl9o{{-cdngh6N_FYkIxKuXJ;DfJtwid6gUe=Me=P~(hnA_KOt zvWtC@n484&z1B2-;I#jlPNNl)W0K&_TGs97kH%;n=W3O=3!9Po4o>tz&p+BC#agA- zUakTKJ01z#WexXY3?Gk=l@_e7GJ=)8%Q1Os)H`b{B1Tpj>X5JP8p0Vyd#Xm=iOYm+ z&4K5xy*X8Ty6MpzcEy;|U)PffYH`ed?S5e&E0)sy<=m`|!@+2{0q`0`eaHKhCo-WP zezX_*6uY|bS6)9;g9cottgo}i#!(<**Cd0)B65Ks0EfF{Q}}2m=G|%#3IZeihsve{ zdG=95Wu~%*Zmk1KUy>v=5Fnue);>e|yR%#PW;~4m#u%EBgCREo4npbgIxXu9fHW^Kt$c!9l^XM4rdua?`+8yNXvNEX zRv$u_bJ#MIywt}7=xq*k+#1gwaUB4(Up&sHhRmKdJ)V_y6h^zT>~{f0BxqMBUvusF z7&s0q7geU1=mTVl!KEKSu(^UH6(ShcGR(|cFJ@WqWqP0RRw&t0{!31QGR>!AO`TLV>EsP~1CJixkui)=ySDcQ z_owrD3ccWY)3TqemX2mvpC9XpMB!swXznj!d680k8v*ghJba_68BG{z+pv9-^4wf0 z@kF7CMDO0J8~y&w(wm4h{&I!Vb5r=E<0fEPz*z^b>;&M3x8QbnGXQmI)qhcGdMj5p zJoeN^&+&W=v8xR0v$@Z4sK=!~_9g4YZVCWzrhQhncefvte$mA^+wMt{ha?Qx_1M1cGkkO8F z%X{HS#GX{j4gcX!@8v+5@&5iA2g3pBDRFaRPms-+k+$O|CYnFDGWxzb@ypj=-wny_3FzzgIxXNdc6zA|*!udwtca-y|=tThH!) zECLD&)kWDyTP46T?5Vj$14AGP8$0PS?N35NXWyt|V_;1Y_s;Jm5Aek81x*l5;gtH~jL$y}Hu+sixG5moVqQl-n+$pZcsy=;DCtDPw-y z`@apGjxx|SGEc6(?3%$sYz)~TZcXW^(}j$Mfg}l*%~AE75*VGYBwx^mUIOi*V;|ms zst&udU^xBN(ALWrQnVYmdd+ybn5Ap$garhmvb}%wB<*c51)czJa5^>}wes#6>y%m`FScIN^zo@&BlHJRvQOv6C=x=hA65*P=8O2;b zdaD2<1vA1!_QXEh-miX<_`$|yLI}nEqom!^Oq)|IVC+2|gV^e?@(IF>K>r1BEr?xE z*{u7ddjTL=1mq;g$dpgYZHdlou8|r5Du&#A;=RqL3@Tu*hOvyxVYj>J6*#b9N`|>_IP^6)uDu`!2)% zx)gIMl*Y}i72Lx?$x-U~U%?zz4YuUzbC#rc#MS%#p!wvDF2JLiUdg3XPY3b7d_=As zpA6Yxgg8ee&KmUMfetdWpK@2G?POB#%AIBDOqO^NP8pfHEv~-H@%UYW_TOOVfTD4W0ye!PDU(vm;i$+xYs{6ybxM{JX|2qqWj;D#q*H ze}doWRUGBr{hrxPZ3tw!L~Lmu&s{6R4E4Y69~@IW6DDdGa~;4T!h?C}CZcxx6`TKp z89LYejtRS@K+mK~5qIBCv%4Y-gwUfAPBE`+VKMg%M$pbN4^TImoOG=XdZvP@X76yV zHAuA7zHT}ot|-X_Tevr{Ij~2?5CdLJ#df(T_1gjab{Of|bqt^O658EgwPnC10cLK~ z5lL9zEc=mLwLeS1-Fjbd4^#BY>DFB-B1DC)7hXHiF=5XDuTy}HfRn)xM2}oSXRQ=V z8`wKLFLd?q6;Pd&7mHxPd_>f5Gg~y^@IebZ+f3KLUAAzm>U0BV_XwMtyoBAr@L1@4 z#z}a4Xq5q2=LHEfg8hm_V!^*Q8Ic2bA|B*qeSP+T(p791FKq`+1uP>)TS>80D2^#w zTLOFNjP>$E0PInN#EUME2I}3pFB~b^U)$A8f)kl6 zqby1SEA}#;3S7(Ip0%4m3GolL{oD9GnF!r!rZ`nw7)-STNeO80bMw)VPIaS;zdxYE5Skz;lU9^aexsipZK z7jnqWq{k0?0XXDPJb^Rcut630OL0L$yLtzWc&!!s@==X zUUMhl$nq3No60HO!hN|_wz!GMVAwK%FyiKH4#|71HRV=fwzmAbRlISglb_6ZK4jNk zMxGM0e;l(NZS8C%a~h|vtckPC2i}z3s8fxokecAtnkG_2^kr>BSMJI#mSVSDkuIL3 z%c1xb<52d(l_YGVl?6ZvfKfSi_8k-f!}{NDysw&jyEluv(pY(lO}B3z2dTrmNM4L! zh55%%4SIIyv=b_PYyHB#tRM}IT^8MS770F8Q{A-;tEdAq1cTV)sl}mcN~oBBE~6$C zwG-OD8vcf2k)_2g>sudFj5&OZW&!230g)^Oq3axy7||>)!!NU0?Hj^Y&qZ$z+i6_0 zl1`Oqz3}i`U1iDFSa_yxYAXD%@3q_@|J_xr!HWG*q7{iwNTVX0QXGB z@6)4g)jjq+OqGjbo4Ce>QAv3o&xWUmMTR2auwj<2#f!G#vXy|bMeGzwakB$RO9bbc zKg-i-tbP2&_ntPJ3%@9!HNp1Iw}|MDT zmYZKaFa*hWb6DMv?|b^NVIBzZh{xpCV6YGl347OuqH68gcF6FMYQ)~&dWF=(&cs

ArgOQX)vdd0|t9@ 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 hJ->r;2JdovuNt4dt|T1z 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 OXBl!iXB>`Riv{EKg!2mN=INrkxy?zSR)O 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
H7q~ssdnP@#0aHQQbVh(VUBL$8XkcS`RA} z{=!@2fL#mtpn%SK`t77kGY$~oz6;fIEmWxM%9iR9dH+e}c8{#>VxW$o&fw1^ZYJGG zDjl^*a9|h3tPn;BjNnU7AL)PO?w%($MY6MYoU!Ox}Nkq z!r#Zd)n6~ot1SFYHK&X{c(ioAE?F?SCi|ZBT)M?WhSs&LxufP1`aKkZF26TX*KTW= zBq_l=zFJ$(&vh32OPc4wsIj-P&;z@RNj@3>1Lgb=be;}3{JP-w$V!8vVfSq{KBL~( zI&Xl%=9lK>kyK%w?&J)t6v7?Zh1-y)#gqO2=4YCJq8NN5NCr{*Tr0d&N=nrZ`t@6N zq!>}ap`t>;9mIYe9})S(-*@z>^*?M{?xVSPxuA9NbMc*f&u;?8GT@dCtN=S`>E z&sbi6e~p2cu`HSjGRHZ68yD@S3rO{ zInj&fUZ2qWleszN9sujjzCW>YCsVH8Zsp@I=h5%OnyXJm7&f0miPtp%86V(fscY8+ zzg#UttA3dimgk7Yz*2+=4!5D&?ah7Kyt|Xivalgg&5~%%KNYcllhPYn{voY(>7?qpm)9 zh{4VfdL4g!aB%@O)~cOt!QZu-%k?uOn@_GmM1t0$i}5K^ZWn_M1u$WMkXD=9qqiQ+ zo6vnEYOZ!0&#SCH*GY-<;PUlJi>xv1&TF*q@?;_^6ti_c|32U+7%1tdt8t`9`%5vbX5@qoiC$n zpjS-{AmXBjAwV-%lVc~g81JYVyLS#PrU?rOw0E_qM?{!*YD= zf6XAh-Q4$HxHKe9o4kUnE2**F;7OYQY+`4eQdE7}sq4wAcJI=Ygsd)^%M9<2qJoYh zCN(C&R`9O*?aJ_taGLlk2D)*&1@|8I<^ zSczR97Cy%^B~hw&u4`x+s>MU~OJ3LGh=>s_1s*fUmq+dsKxLO`D=T~C(ct9GZ8qGx zWiFQPrMv#&{fXxh&6pgp6I+U3-l+eh4tX9W8wPrGBk_{=D-<7#@1d60x;HI zAMVOm;*TTFi&_xwvu5*i$_h!sb{phC3zJ0$zYsWJdpFgCUp<~L5WLl>7lcvEXv=%h zgDn#gNtShzWah~WzEPz6j11S0VVIlKMfR9t}Sb`qW>elu?D*Xw|uJu zd1!l3UArMNL%%-bRvNqGqwcmhY{=72OGDwV+vWOopYZu z)3~R~zq_6DY&pe2D0{*h`NxO|#`?*umV!cC`E!}^kOyF`h zz5J~$MI%(CMwc-nGt)HmbYdpek08~s3ZtI<(93=2&W^6{_`Fl>w%jXuT zpUcA$C-MmhCy~BvXP?uR(eVNYnCZ+gKsqQo~<=NfBtQ7gbqNq>xchNCK7mu492iEJ;t5vw`@DmkE#G9kYQS}W=3$G~^DA*4{lhX%u6C~D}hFm>5gV}SdjV4d#`!pu~(tUj%>YdXoJ|wvWsBSB$aJ`mKK@|-pF zgj5fK|4Pl`Hp1|`oc+ts(eiyE0@Y#Aa^{aeohG0w4@T!z7#dnAkvD$R{|Cb178S{j zlo%j_Z1v`ANplor#^QDNURG-C@3A{dI!rr0$s;@CTJVj4Q~yoCz#WFBv7ScqBv~Vn zZ9E;4Ug~@5p*@^MN~$H=o9fnpNYCYO4DmI16}Q+VLOyq!dwN!ao$0CpH84Yhx8jWU zN@+H?PWkE{46bbZH#E!^^KbU0xIq3k9AOY`07}LfZF2OmN5c7`F`YJsoghgHn9;uiF&NtO z@ZQ)L+`zm&pd;r_;XL+tiHWp!_zj_F1W$|Yhp-?u^GZjKcV9-i1%srNg?>9OdHWu|!y$mfS$U)^!q$qk z9wh&7n{_qi#{*mOmHI2wMod>2sG#TVM*XZnODnsDMAvnI^%YJnrgmz{)j�T~3L# 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 #bB!!1}+bOg< z$8rgpKcU(0z`Xt^1UN$9@?rx~u{99#{rKd@JUY$8jxmQ;l z>8(Q7nP+$3@2f@^Aqfif@oZ{0QA z_hakBC$6tfOfdY>Qvl zM*K3x6h7EQp|s8Z%pEoBQMUf8GjM3C`+aG6HLxw(0p`nnDk%cLK24pVEa7%Y;=Sn~ zU7vn~E{286DW6=hK1j1mFjBoAa`%~~OJk}B1YHGay6p$q&BUthc*HHa`dnT;)mM#( z!WOO9;w+{->eG?1*o%l2kwdW5V-N0~?J{v$j-mkzD2W`=F;pl`Ug0z=S5F)w1nk}jXV89liFI4Y| zU{AeH9MbM~ee z%c&m@OgLbgW&el9R!!_xgFnx%r;wEjYl6E5KHaYfTEQT_%Jbuy2Tam{SnDp%3;F6a zwU9=o!b zA#UArV)efjjNiuh{w3VBjG6pjz|!eD( z6=fE&a1a|UK`<*kt>7{oEK`?-6Ny+*i9y^#uK z%lC$lsqjhstWenckJ-bOdYjqb+Z@b^Wy^R065$)Gg}?@Rm(X@=$?@WDb$K@UrSTfd zD19C~w%Z1g>n@+dE{8F!dX#H zb-q#EkZ6<^oOCKx>CIFA_ru&FS9Sq*ioitw$KHupA$kJmi33cm=i%5Rbe0O*@59q$ z4>J2-@x2l_Ugqc%nmrVg?Rd?n^6lz9kHn2G(kp4p}dXa5Dw+B505Tzr);b}g6o6@Aic z;n`_B^4acy%7_DQApYBH_|j6nSJPR3*!cOo(-9l#U(Lf#KKOp!SLrM-Fm(Aba;Ji= zv^pQNi<@%Hc03h*D&711wcIsr-L}h9^p0zXLdQO;-cL9J?J51soFo;nTRPS$3z1Mb z5N=5?-`8*AMo;sd63W$T+O)oTLw_T_Tk&y>qD{Xuv;eY%E{NG4pVk`v+en3Jjcsqi zF%kN4pH5iF=N$=twRluw22jd;H6;hD92^6Wr`F`g9t;PTRM)#e%J$Yd8-MHEEaYzt z3ih72d-gX?&;S$Ktj=>t<-5-sGOt?114h8&EqzC8*3U2x!hLaR~#gj+a}ZDitOcHyC)wt>EfGeWl2Amf~7r#YUo$0dZc=;t1b1Yh*Uw7!&Q9J=q=xHO(feP*c z72%i%=;}E(PIJ-OTVB75&))9OS+8C~8Q;NIze%e+H(OUU&HYGh$;{a>mYs)UD-9%- z&7cVt4(7h+b-1qt*B^`v6n!Vv3%>7>o}JBD$6PxM2b{~AN@J-^#D7zoSB`vt&3EeZ z&u>S$K6g2(`>UAROlzbi`fhUa7P}E^I|mj=zN&M-9+3X(0-fmXjSC578#}H#`W<;V z%jdgUDj=4Y79z7BSO2_5I*=PlEG%m(J zJ$cd?tdY>3xJP_yJHt2W?^fjo;M=w_gqPJ=Oa$!VeS#pjAKAHWs{2^Vi|EIiz+k^q za$@!wf9Wyx4QnW`Nzm5%MK(^v3kS;m%Z(XSZfhFOmE==ee_ z*@~s;Y!TVd(Xk$$nw$e%|CX4FY~o>UU(LAQ;OA)%zB}cdJhP7$ecQ&p{iD9Fc^~Dp zwk_`p9&TVE+~qW2P#@LXpgc`44-M{c{d*fTGJR0Z#K;?fB^JKC(Kc?I;2#DQTvUW| z^#_7Ap&!jQ=RAjBud~=Y(z$r;GS`drq4`?c^RIjfH5T`tp0T^-Iz9xfCu!^G*!m6$ zyw)H1JYY!j`j*A!@evgf{U=oyk9OSq@K+Fa^3zKGr_ie!RlxYfTo2~DtX3m#m=G^@ zOU5^9)KVo|f9r+6=fy4&qq`idA;)X#@_EE8*G&=_yvFBI+1UP8ts`h@4V9Knv;;pdmHp#rtEIZCQ9Z9w?wL| z@$YD6J<@;zi8b<^p!)n8f6=B**khg? zW3VR)0r8B|AYXhj4-#kmj*9INBl<;}8~ws6Of&F~4E(%~g7iZtVGl;XC(Y(3mEZm9 zg=PsUe2Y^l*z3C9`H(k3|3yvs4~*5+tS|UVpd)VOtg^BzZ5uyZ5-f!JM`AbC0@ZSj9Hn++S_pyOhZhZcO{1hN@*m{sl*mIQ#bj$Fm@PFYRK| z53MFg=?yu)Q%*tGTjAtO)wkS9_-#p{Q}H{w$jI$xWHXW$K>2wO_|V$8CyiH*)pAB~ z60=+gsT@Feq+r?oG*V1BG^e{<1F4^9u2z8kJ+IUZbXMvI3-73KB(QNqOIwCOBPR_` z5Mik!+MM9Lwz2RFq!<6V>W}B`LKsOBR8IOiwjFNt#j^$()u_ptewNN$#=BXMs-l}6 z5Z@B>)e~t=bRflmI7(zD z<0LZZ06O~lyH(le)#=8>49V=aK~Or#S7A4|s=EH(__kge#dgnYb$^DG#Q7U13P4X0 z&X|c3MFCi-%!B_BK2?}c$|+xI3+;V~fVkntEC(ApW*>D5f3N;86GQx4g!Ag&_5dES z15{TD4+E4$5Wbf{9RAQbRA#X(O(Uwkdk<)_oULwb4fc+o!$76lbD8~&Z!D$uN%q-D z-;ZExvkN*rUr<7%SLXdoUFZaDcg4}oU4KKL*j=21>%frw=7r~jw_j2A(VBMm3f(GACZ|oE)Hi4;m$m6{C=PQ z>CqoO^znYb-mmxT{dzrz2T33uSi~_x${O1{c)c|MMW5eifvobp!FFkiO{qhG`Gg>$ ztS9Hf5Pb~0IuHIIm8%^AWMom}g>2P+YdT%Hs^3sMbJF&lkuu?7TJgAdRLV$aaM7mt z^n_CNx^OzU$SJqG6?PkZzdxeS-<*v$!ANQ~2d0V`EXBshRv$r)%PD-{l zJ{T-J3k#Hmb<6)l4yT>glB?Bua0aJp_$3ssZM76t=EHN5(>ub{$A9*^2uI&Tyj6wi zixNi%9WX5bd_^zrrYYO`|4}(_>#y!QOhW?qZVH4%6lW`2S-kTLFPTK6fT35-%FQf{ z?JFqu#1{i95t%ojFctyp1}3LPT{n>=ab;4jBoR$1Q`knK>^CczG_FuJ({?;v?P{d$ zl7sMEyK;%o=>zMy&U*wPbgimC*TCiCssZk9$d3Vqn^TY*>4CeuR3v=4mC0G)8t-D; z>G6zQ_xt?$cIONf02+&5k7}X(wuaZsy#p=Jr6noD>*N5E_6mG18$3rDp|FL9tm^vk z2+P)vH^5R`jWLTmh*cp-Z)<%=f5IKvlWL*;#-#79&uQu(`6+fJkBK zz=BKaIm*MHwTX}VTqCPnv`3t+4_rdZZlftnS(Jn8Gf2=N_`u`*kH*N)(|XM|#Lj&F z#p1@uetFP0hmn_>Kqeg`1lfHn|)7HYH)o1tWj-^vXtRa%FNL zpyowy1ZV5^kk!5fgSqE3VH^grK-|Bs5(FG@6OXnxJ!dqR)99MBw7 zeo8P|Js><3wtOYf15?V0SQ885yf-ie#f?{a9`Xe#?w&9t{M z0VnRpbo=uXAoqQPQ^S8`dMn`^qyFU<(~kRn$`4-DYpX|HMNM|n*zH`iH>F~i00`Vo z=_NbYa#98I)V8bk+lTEEt2ZD0k18~WPGEAYIMr6;_x4Emvc| zw-NYFFd8~%0NVUi^Rq(pSi!61J&zxSz;TOUS>4n0{m{wWing=x;En!e8c-rE?zUZB zty+C2XDw3k$ z0Fd8-J+Vwn#Wsli6<8jNr`*RoqKNA76n?-bf=y176>IMup7T@4=LZj%8EWH$i|EU~ zHW;~D5V0x}=SLACII6XILQP+WgjDRhZyC3KdukS(&z|YC)P$VG?6fyV$~-@EG%}Vl zrbM=d{2g199%`WGH$7A+b`_Q4HyDr@9e3!{P0R5Kphp=`)kRVw5DwKXMH7p@z$kdk zd>cDtGvkyIdgFzDFQdtSbz+?7;~#F{?Q-Jiqw0U9+juZb$vf~MLuz6Gglq_ay4`_6 z0XFQY-E!LAPpK?%d6G3j%g#0GkxnNY-uo}+P5v!#o*;#5FwyFzqxq41K|?J`k1`cP zQJjT&q2@WB5|Zw0t#W_C*RNJlRFfW=WC9}|#)qA%Xe=1n24KPNnM2AWOZXWD2d||K z@!lGCxMwTvJ1pFK+}Muz8p(vQBzhtI(k}k|`wWY=q%lrdcR839h^(Z^v6pKwg1g*r z4%;b2qi;^`9yY-b3c<7@mW=Lu-(*^}+TWCtVN5`8X2-U2mAR>8&=i7T%s$ExXxk#8A^jxZ7O%|y^`tuER` zNWk1^D@f~x5d=~#69QjsIJ?@XRR2}T2Q#<5Xg761X%MU)J~}xerIo>6eEuI5o@Xp3 z!T%e~d+fKGmE8mtk5j?zf^(JWlfOMa_Ob!h zxb^pAg3SVDq;*qt`A!jq8=T0tB>LL&^>1f7Ix{Wt+ak;zQF}bcKLs#mf5?}CRP{X- zw44j7r62l>#kE8E8f2*?DV%Jn^(atJ@;YmW%7`hw*YJoPo^(k77z9iJ)g{iIN*va0 zSn%oNci?KlLq156%fDBYSbNJFJ|Wp>@bFgjVi%6HP;9+Hn!_jHptQBN(_G{mkQaRZ zmicWufCRdQ_uPN7sjrRSN`QZRtbAE5IR9g9hH+-&mn@bU&A+=-@8lgEI? z_+;h^(9tS`5MPTl4=m%{h4C3EQdR`Zm@JPFthE_SN3(}BPFlH(wdr_ zF%#gn%<|bmBHjKV&fpjklCa{p&`!*$GdWGcRCARwwE`dz`cOg+p@mF_HK6($s9kX= z_oN)v{9?kQ3~gocj;3aIpVUOj9Lqve-hUi%Tb~=V(RJ9y6EgD}#b6ap;(t{|7(!F7 z6aq23o=h#)$gtt;|L-=n#zYwemh zI|vfXk}VL~Tj|a%?ZBJrl)FsLv^Ao#?HnSWp1XB@Vm7zq0uZpPS?=VT0&jamfmsr5 z3^Eb4Tp{xPa_`OOK5~0*IDZ@U9d4s9!uO|iGCp&iKTwl)LjGc6&VA*$UT~pF#6S*- z4fOT<*{A>H@#Fu(bV0Z<{n}L|;e^QHX`8tt4^^)v7~w%SIC93|#`Yv(*aDv&>#=&y z8TVo_g~J%9WA@N4WAU>kY^j;gq6v9`C`q&n>bMA|v^S^$#Q6Ir&+z$6vgD4yk1i13IQBj}x_SII68_a?f^cqYn9_s#D+q z0U*`t82`bP(TMU38{n5@9jEYaW07Mdo>?$mcS(QMJY`{O+gPbX{;4L!j)pIKl8 z1Pw%MDv_R$Tl3b04*J*I4*GoJEMnKdi-ch<~M&@tlRl-@D56nHXqy4Oc?b|={x~Ul1;XuM4*??*(?fp=Il-UBM9|~ zY$3A`i!4*kMq%!q zY*&;_ge`xuo#|B?TvO9vJ9VEt9vMh_$rg7aaF80}c-_uG{*!C;n&qUrBDqN9eR|hv z?vqbt%EmW>AfCXQYY%rEzkH!EYoZUo$ZG2+;-_)riV`+F$tH z3(l!-RJ?8V= z&G--!zg(4a-(caY3FPFb6`@!6m4RoP3-gbw`8;blP!rZUeTwzi&NR?+eH`mLXW z4?=$5;4y+Q^v#w-6e9p<&&U-t48Hjajx!{Kp8^??e~W10LlNv~nLO#BSym=-df1Ey z3Ggv1=LT1nhAOX`p5{b&+~P~!nLOl`jMkFR)UO`o6C=zJ5x?ZhDIo+Kt*18f#oW%H z6Mp~gTdNn(e;sfoRVkxIvC_)cySnkL9u?s=x#WV%unYNf1{z0G*!bECU@q`Eo$j)a zUTBeq8S=?Y{)=FH``>_k)eEH@I(cZlMiqYw$$y~h<62wuQ?U`Jm$5Zu+O!A2?ewHw zui6WadkDP9E^X(QY}658t7XYhqtCH(ob!%tuYjjgrECdP#k#{lD_!!>!=ci?OBD9CeTMPLDcu>5>Ss_enXCp8hI7u^GdRp9I#{~Q<_cZV+TwJJC*9%o5F6~ za$MRUTHPF7z0s$Z

+7FrynD6x;k;+Y(j=SUO(gs|viHOGLH)m5kE1bYsP^FijX zlVIf1+Aey3b^P08zkZjyjRgnjLw?8IkX`cqbF+``Hyq_;boB?SsGXl7MqZ=tVy697 z&tI!>eeFyElnoJ|i-a5ss;4$J#A3mbQ_Tx=26|RWqEd%rLqB!k&Nc~W3U)&j)a)M2 zVXqUjgiSkv9B~PX@wqG>a$kGRD(^49W4Rs>(CqxSy!$8HhR-ntHAId*3~>NT;OGa7 zG%d2#nMXV+T7fRHAlWWHqjRd~Qz~C5UK9~@<&6XD#u_B5uq`bY>%;QKRgyI#Rt4bd z=^I>D5e;}NIP>BZaJy`a5)0TwmKI!YIh-_1cVpwwFUeI@Nf{6*y7Guyj1Z^wa!}wK zigX!S+6jxBPgQDa1r2Xuo})Yh`mSF)Vtg#DeN`_)!D zssqSbG3)cet;k5=Yk`#AbJc`1ec|=^Vd9aT1TXXQrFYso;qP@X`Lj4oHMTeM*H35! zVkz|J?6Trki3?jkoN=(60b9rZ>Ir;*%X@;n2LXRVYzYSi!_AP_^{h;Kphp~xn3wgmS zRQ*F#TWU>*Y{M{u$m~kl(+Xn%q+pwp&7LS=BL2e7fp{I7fTqvB!XV4I7`OIvUQ0z$ zE~+E22_8j^y40~W>mY=57>F@sef;$OVCL-@u^~6?+m;V;&i4yGQy)<=+CMSzgI5!G zP}O~yItqMj|3n7DJ+Mtj-d8d8uVeU3oVW%8MoV5g86Tw%8*>QD=ZCRZkT5t3~ z=el<0_|&whyue`4lbnhFM<#| zYj%*cAfD&epXBR|nya2&|8A%%$@C|9?ST1Z{&zN*85XDw5|E2Niy@+(R~nLT59Kh} za~^i}M6bNve>4;!|4oG=m_IoO#AM|cU&sy-d@&wbpXIXkqfV4Qz^Fw_RE5{=k=cUN ztJidzxJ!iv2is*EXUDg9+d5E#6z~_(4+-K<+~!gMj40MjjIEj5JV*74^``Tc_Z3Ec z+Gk{-5{){@(SyQ`j=#>EJqbsn-#AE^))g z*>XoTfK2FOKL=Cj=64Bx?)JJ(dM~qRsnb@d^*OIK zxVjYlKELH?jwl3v=-^x1MNf*W@sdrju>GVGy>zF-ljIha&4jvAb5 zmi+~I!C5c6cbjpqX5+X0vj3pQ9&Oi9>|mdO|J0w)=#ynV7xP4^b&P<2O@9ubM(vMD zN`nLGU%&OueI|FBE30l=_xZG{u(y7FawN=m1qwy*E9{l&p$|}S?7Flj1<=P`NLYrd)!KW;Emese^N|y#V~qKDw5ruYYq4+bD72g|3X*SLNSzrXedqiwx(!ib&upOxk^qGN~_l*<~oA=)~4~jJ%iEa3Ad@ShQ5(z!I0l$5W z1(d`YCn#X_$+{iVzGjmqnyb(JVX4Zzjg|}MdYa(du8R}Er-In;8xjdxK{D#wDn0d+ zuWn#gGiY#i3y!|ZoNAez40`N?-N3-m;9jr{HiTezfwK79t@D7d9T)pBK%a+UC4^R# z{eGdwt0O^H{o_4^cFD!@bac==mCtv7^=%~H{{ToILth)@yA{9^*gmAnYbzikQ3wJX zj=RLm-7V2d@jur=4;pzBQPIQS(y{am^fVGi8jILP?8SaO!Vy62`e3%kqxnX9huoiE zg-Q=texT(Vyux`;bonZS_*Oo32Kgcos0^aIk!xk=JmM)2f3yC&bm`&ybBU=`OZoKg zhr0gsI`_>d!eQ|D2w0{S>g0=p=j$d{XFmPquA23=4caf=W^Hu=nx7}!$RP)RPQPPK zx#96^l>gWT+)`y~+d!X0gC(6j$Gr?^*ASSXmQ{?QPlsw zxhqN-m1Az+>tiClGf3+>VE@H^@Nv)OyYwS1{${KGMvg`+5z|4|2V_s#9F#*&4QgXS z>zQE+@1tc>NdVJT%|}XzA+0|KVqdltuvUmoApm(7Nwz!BR9w52*#4S`y=iq`@KI2T z9>UVM&}8skwaBV^YGixsImQ%r$u5z$e*Xi*;qXQ+Z(4pzvevo3`JK=)vwQl()k{PF zjN!`sO`4JpAj5}qC+v?9V%?ki!S}D<(7JKwGd%0`_1aVj6;1xTki#h0B$HiPR@<>? zw2Jx`QQIk6RqI}I=1qa&$2x1zU--RPXANE+ua5kelpH8pSX21P*~N|NQXe0+JfpAw z-Omd{Dm*U%%LTrhP&Lo87s@m6>$po_+D5U%H~``U+KR|*;JhGr9z`46(MmMWZj0$v zqQ?p}Eiqxf^Z7FP4HcQ9?qugB?ay}w_t64g$a zy3+rsicKO#)(z->sTpQGP+Ats^U^)K?8NB;(?0T5cL~1oKBtT%yf$Up2&7que(tmY z$-G7Zs*xMG&-7P}-@G4Ep%P>cp!c4Db&;MaZdE5df6tu(l2^FgY4q%BvGhI1q!#VI zDIe*LucQB_4Az&9i~-U0Fxq(!0PP^VvQgD|J%9oBTmjqpMB4BKH8TMXLVR zyZ$!s8Y04;^e7ont?>$S106`P9D#-eD}h;;)UaQTc@X`H&my&DF&q4W&S9=gC_L8w zN#g|!{<&e-4btvoR$>Ru6Q|lsz4dZHCS4le#~Ni%VU_~zLS#{B-#2I5XA~GtjXCL; zwftV9a_Am+H*}$SA;pjza^kYA1glN>DTEnWpd2DN|<^)OQ?m`m;WC+24B2de^S*V8a(= zvAvBtDHjl0SI9`aQ)tgh?i(+nJwCDD68hGJ3K@i;0e`lODH6pkFX%rTZo~DPMxfvY zU(YU8eJYXmDBs0UfdC^;JLDojfh8+A9Z%SRH~*{THxf*JlWt~1r*B9sFDOtMs|in? z&I~_6oJ7D#6veX*^Vh&v?C|RxqL1D}E%;W%#){_a}GfCjlsTg_c z>vM6{;83Vb>5y)`GPRkw{;iJ;$T6+R0`v*M4ZHS1APL&{h|o_RaPKf*YF+TPD*ZvgT~G7{W+UV*^`hFL zaT|6|eQW;5Q}L8SyR9rIgW>4-)Vue`T?<>p06htkkT#}bn+!g_)-*!=@$%-i;0l}} zQ$sRhNS|RVHMZ`a(bC1uPT0&olil$)WEU@yQk?Gc>^;qyfIwaIZR7l#8#?kv#I7wq zUPUnM7|^&zT|+L0!>kwhoO1*o#euWd7hf;GpuNh$l-f(hrk$K!5|xBUElV81a;o=@ z`AvcuIn<4Z8xsZi(z6(?&b6-9;l~k@D&p(slEAZc*KaAIYT|m3Q5=WZ*~FIxo-6+N zHI^(YInx%=e7yP4*a7n7NQl(959Hi!K>CJFhN~zIj};YuCL>K{CLmgI^fs1Pr34)b z0v-CGog(wlWf>II4NohjU~6I$pVI?qkJI9r|4=^btMupq^ItaJWROFYb5t-HhL}i6 zu^#er_x+wEc(-b)B)eh#M@X9<4&1bQ~zo$#8-^JZ=fF$Kmp>BziKYgz7pmg zWa|BEoyF>MKJL5nn%dmT&s?_!UbIIB?G8uMwk`oGZ4~hPNlv5ol!3>0fA3tW@Zbgd z;_MNH+RM?tH9)v6dnFJ}x1})xMQ5q;H^LD|inMvfyMU>e5b4{bmjt}*_lE0SUzIPT- z5wj7Y6ucz}48Pf;I<2NT9P`e97t&@!=P~oc0owD!oRB-Iq3g8zFYc*od?0&vw0Z%Y z53^QJp2#4_0=2xWq2|4>2KbI=r`Eb44c>LSPG7V{G$pSuQ1@M0r(T!{K6Ox{uRsj~ z?P;18XCXGdXpb~Yyv8@F!88M8_NgiP^x;r#W+5Z33!m@@@Ai(MZQw)5&uk&B=YBbh zK}Q{fg@90Z)SA~JC@L9O>8SK4h4oP`?0(v|? z-HC@JDBL>!9oSz#@dY*c;^Y}1J$HxHWZCXDb3=YqJiY1M;FZ+v&;?TkK)4aMd%XWH zQU=ln@IF3ekhJhOzs9lHhMpv3W(xfkpg4wEr9H=_79U~!LMvv-W7R0cRCDgp;S9{G zPD;q6C+Feir4+>vF&kx*2;(;yQ7?UiK8U*FH_Pb{eE)i8H=XaEwK4fEnUhHE$3mJp zE5os_b@(e7dzEvi*%#u-(Y^IsEw9a41!}e)wVcPXDYRCK16?JD2jp&Gpt{o3c0^Vb z;fYbq%NQ#&a4YYJu+CkMJt^r)X*)lBdnYxZj?eZ~4 zuZ!4*JiotwzHwn3cI{!$+cqVNECA`OEm3A@X~h|)1GNn6X0oY`@aJh^YkW&HiW zgvf27dg4f1fS8CDcu=;xZp5$0Ui8A?!>^}VaXP&fHhoHKcT^V`r89U6;|c(bFr%F{tvT4NNK$^0UnGJ znd$T>^8PyZLsOt`>NrwIL)QWCSioAe%A)hDQm@$SaMLhQI*iMN@nZ)1e7<`W+x#Qf z2wGio0P8Q!A?7%B%$)woIhp+*)tAk8oa$*A!V=^;i}d$kDrh@kZ&>^aP4KUb4BU=D zp>aAha&kZe3XBdki(M=^Pj|i7=G!&j#nCLqpuZ`I#QEEOJGUyR-au^ZsFf`4VGmk= zTZS_9NE?UAUX5{7rW5!PeV271?Zew6K;jH&C&ccSosc1iJK!W}qIB2wQ7#vw*I{cZ zy6{DIx)Za6h0FnZNiHMIMiAiyjd%*QNu>j-l>mK-$Jb;A@~>VsiL;Ov1?YgXzo}#= zl9^rowP-nXk)<7=8tl|%h$RtBYP*P$9slGJ5q&0_jm(nAl+b@-`XKHr=!EOZ(7ura zP|T`JJ|3e?q!+y#&tYBCLw(DJd+FDmDE{=rF4H*UUmcIr+rETNe9U8 zkvRb0P_Ef7I9hb?C5JJ;q~S-y30{vEoS*z-M!rX57_PwLg;EskkiL2KMXx1b>RegIi!r4PhW+Y(~L4cdr`P+lY3jhOoam@dXcklPB z_g7=jN0qjQ_4LJRUz}K^C-ZZ68k2$SPaZ4Hp}WB1fC|hUt&I^i61NfKaNRR{|J^k` zc;D^E^PZp=$0BknTt<+fqrHu@bDwdrnhzO#D9(}i@R1RRarv35bT&1tm8zR6AJ`z- zaXYE=HlG~;KWzZ}xsO8Z1`HXWW@z6{d7eJr(Kf%I_@U@F;v=iSfM6jjL#0;|!RT!T?{wT2iiTYs;>8iEHu(CKSHJ^Z2W60V0$vzXft_^7D zy(QoH5|fcp(JCkK#$HV10}bySJVz~h`FX15i_IK2!ui`sD>N+rg#5ykU9as`B_~yu zJ(UA4Pg$s$=H>d^_u4Yk(X(TA$AI~4x~7*G_QK`Hd2hMxpAi?M0vkxbdvG%%Y0Yr=x6twRJ+xeu;@b6q=4y*szTKDzchNctbWn$ z71KzBP;t_MBsI*mmrpn9jR2xBkk~ch?_qFr^X(30cCqyjFBvoRdWz&%c>KnN`WA9{ zr5k7t3yNe0y$5$@v2r`7#8{uo#m0)p*;d5vFRgE9_rJeN>{_x>z64Mapj4l6J>ltt zASqrdi_?Y(P|g-o%MW9>fjn_;%Q6~_wz%QTbc?Fuz0N*`x_if8Q@5bQsA49t3CPCF zDIkIfI>3GC#)l*Z1J;hx z^t`z|My^{`kDa7I*Siy3sA!I<_$!rBg-MX@Gg!g_8YuCHt@-kT`c&z4 z_{l+GN-7UH$0u^barf)dc`*9;oTmt)5!+aK=bG72&E$ZXHI2kW;s?3m>6%w229e<> zWHle;x>ShqsSh~o_!wYZGNx?&_tYb~;rUP^w^oaUzBRS^on%!Fc@}F^psGaSeybm# z^bU_HZOO@(M6U5EZxmSizML+o(4IFOO57Q$s%FK6kz*r7kHJ=UX=g{$S z&(yHg4Louh5p=gowDV(5@74D6x6JT2;MfF;)-&=hG6ZYg2%K`nc5>pnJgv?F-K+Kb z`%-C}GTq>;cV`yaG^wlQw&W19LPXNy%uz5JQDzr>wBNUIspnUaPN^>ce{{CDrms>{ z)AOn@v)Z$C^f7rYo&9T?9h@{zg`C+T?M|d)g*|egM%h1qHGOG#Bl!~ReqPt|x_=mr z7nXz)G7kO&P{?=p#Y5}Gc(pAv@1)=7cyHoHEuG!t!PkSd|MtfVdD67p*il&28(?o= z9473tDu%l90>zh&DNxhRaD`l39!4Rb&tZXDVCmMQ6#y5Cg7 zTt%G8s+L{uk!oz}_5PuEy^LL%UG`WcaLOz46q#d(lF9jYbE*8#1>exJ!Sy9}*U|19 z@Ff?2x5at@A1(O$OF)ZE_u(#N_k#4M!`kr_m;wK>jb7#5ARl|Zs#Ddzy`dS*t{{Ki zayZQVsNp{)U@-HbqG>+ze^i;kA;#1!S#8%JlW04pWg(E!FQKbGgU{3_!#v*t8({eJS8sOzxq&WJ9Yd|h8p9I%UjuN3L4xWINy0_wf zdGXn6w{~7-jV@{0Q;ulgYrJ|p(oyY$MMEB2!T%|4aa7?9FBP*lqzYtN&L4GHE7w_S{MIM|W3jy&-3LV$Oh^L#VRrFvVs&j;-3MDef7qL#y4j_~7xPFDZ= z>#MD#BPyU5i&Ty+oxzf1Ph zQ!{8Me^PJAC0;p5kD{bjf5!Zf>uw#kYot-=dC zhhK2C%S)_!Hb#r`p29MnMyzrS-@m#w6k;*GZr%E~aq93GP2o-S&hXu?0a_zRs$rY< z?MaN_dq|GH?tHi4SoQF$RL-w5v@7PkFcg7(wtw0nrW%^AX{MdGTyi5YVKNf$JWXVZ zHC)_S4+4dqiQIbXRk9o2l;SK?wQt)uySWlO@}r~%E@02l-fy(YP;-~laBE*s zP?$QzYH#u690QTl+MOpq=(qqnn=Ic^F1XWNE=3`u6T1&$L8%EK|CB>${SF6JiO~Q= z#-4`c@>Zv=DHqlQ6yo&jd%J`^iZdu#Zf~agSlTD@5-W}32d5oYxU4$nT-S_-y7^p> zfol2D1!mZq93EE)3oh&ghdhqSd2H7C^p{C+Orm&mdO=MtcyZswzxS7A+Q%B!y{?-$ zrYGme6x4t~XX_qvq|QX@?_as<{bacZ`ZrRCz@M0y>m|&chgviPYW-vpys-v75d)jPFR@Jk&R>dpPAA z^8Pke_q+Fag!!lMT7!JNWk@&-4G5q4K^lOBCp%BNpfFU4o1a7!(=$I``W$WOP_YHn zisThyzYvdTPRA+cA09!29SDGxR)*~F=U&+vUM`nQ4mo+9*Of*_8D-0A^p^ti;x6+8 z#mAvAYCQ*jvU8_G=daGDLb|X@KKqJzm)nZr{Ig3#tYPBsA5=$L163SLyueAv1s3?5 z+;nbOX|7!UH)`t_o^9-04`pXeKh1yaTg#a1mdve=R3L{?ay~91O7l)B2#RiX=g4jM zRaL{W5d|{_`!~Zyvf}i_&!jTyx(9M#z+YLo&2H>hoaJk6`HD1ELCzO|)s(sm#9w>t z7cAzk;CP0EW;iA7;;(7JMOY0b>g}HU{O7v{Mw-?JJ7x@bVs71Dn`Xav_G&gowk-^N z0-KUHmw5o|*-1*TZtX)eW8P&ybFnDYauSAq!>}?wqW`rNvp&^|%JD@2>L;BYiO6H@ zzt***u4^h^Hd|f4G*z@@yr*+A_2uUnkza^mr#e~xf&oeo%g28%7P70q)&ulI#7^HvC+ge$ zoJncPuW_$4L#xB3d7G7n)^3kDlVQE*EK@(Q3Q^v*DW~6VYdK}7UYz*))ewWHaLrST zQ9j@t09JMRQ^;e#Hx3(#>5Pp0)E!ah;!^e-ZON}+b$4C&-n}5hOc|PxR-K&)(y>yb zj4;}`VbTvEG92$&oH*RpFtpu13>z!s$?%NL{@nTaJmk@fCH#7tOxJE>%+RpO(yXa3 zVjFw$J#*8xQX`8DZ9Gyn7E49Vo@xY}#2ymevF{vHYph8Z@^(@^%(l-O_qQWz} z-Un}qiBqvXgn!*#2mu->02~YKf64H?OHwA8!SeFbZ>k4dSn0!jd}@{~#pmLLsirMA zpWqctjDT2`IqOH^tXmo%HV7f&fo57s0i16#sM)1!X`f4+`1SI^0EJ#+eX0yJYqC2OWVf^OjlU_gEyg)Btiyx_V)>Z*I7z?9?B7`C0osGO!4uTS z6RVw=VCn15SA>exv~4&JqK==3r`|;cMn7;7-Q7ai0T17}BnLF&#JQI-QT&Kq^hxpG z;+i=c`MQdV=&{4XSGCQwtkJd?2Z!f?D^=sgHu{J(oCdi%FE;v&+g$NQ-)s%1enX+Dti z?d>zVCHSV#xl*TIrrp9~RS2j#cTPY;B0)squj~8`v8;YE!Jy52tL&^i6LW$x1$8M4 zQC&S{g2D4ca_8MGwIy$eFXVkVN=Tw=v4JIAUPG(rs^-?&HZGoG8_7{F7~jSNGV~1e z9JQPPYk+tCj|vdfrd$!g@tkIni%8HYLFjGV3l#4$8`tje3YaIfF>t%x00-(X6dte9 zk6$)t3(e_8!{>#s&o*?(JqV5sXhL}tP1mze@7XUHs8j@0$7RGoq*O`-N*cbNWje_D zUHmb%+~EFNvsi%e@rmkm^xOe0qeL1Je@}>>ux_2kgA{l@xR;?*oFqR@;eyKJHqzdS zdz|xG=C^&Wp`VX3WrW2Jyt;Rl50fx{!H~3*CZD0KCn(Iyx5b2 zT6CRA$3y+Asy#)nog+12beS31C7{g z(CaH2;U-23Bi28rOe>#lTR*T*-vRVrm+T#Fz_u8@D_qxg0xN!Yk3QMu^HR}KKC?qd ziYz?v&xk3K@bjsjT9hb3Op}YrwSWr>L77Nl^1`8)w^CqUBJ(+b6T#M+c?@?hasE&C zynfj-Hc^K+}7w17Y*pEA!FhYMpsJ_UN4za(YQEX-^*N z`J``UQO`KzTS3j4D~$AbJ8w%i25=^gxL>+3(2Bo{P* z6ToaJ*CbO807+Uxd`1}VDOAOC*W#7e`pUj}<~nR(6V+v&uT;WCl;R_oi2@A1?G7(j ze6K8x?&`nQs>kUkt`O}^ZU0uk{rS|m`0tMLQ2EWAJ3+e<;JlKhGnBKX_uwlvRmX*j zdATDLNtN^)Sj9$zza>N}0FmtboLq@=2_qTc!KY6NV7%3^Bd*O*aTml93hx$S@8s%P zfu(TIi{eMqR#;q!RzHsVMXmuoQAP|Q1O2eBJ-g>&^qEDbX}?SbAgy{mh@mqUu0DNXI@CgQuKCpS3wX>ga z;cb}kohY6(Mz6aVk_Nf5U8?%>WM6GX=o2Hn1L}>Y5aDeXe`#6K&c(=LRd{1(byT&_ zgJ+97=v;@m+-zvzO6unpF|NUpNC)Nl)Ar2zy2+*B8SJgT1_dL#kgDL_*{uNpo&y0e zs0OEOv1G(ZA9)F7N z!Ny13!JWjBJi;ZO2$P80%%A8xWS^C-GUe{V*DE;x~o1&+f+x7+= zt{wu=@!&Ph)R8}hX~9*L|4~U(42)kIsVTSqYY_q4W`vE#;sVel_O(akd5KSJ zcK~+=HqvD~m;ebBzZ~DUyBNTha2C!Mf6xwF2D649=@U%KLvM`fFjS#netf|$aLdUVe`2fkD z@MaB>D#A&*LGs6^Y|pCu;355;cL;f_BW9{x4(%3ekgH3fNzbzU)2nV@WS88FR+$lN ziXTqpOjXbm&Z*6fu~eGWXtF{(#_Q!;*~#!Mo{JGp2--kl0Rz&KI}j5OK`!RBls;g$ zYy}*itRR1i(EKKNn}{UAT<}4oDF6Y8Gc>}mc~SxUZiy3*>e=J5MG=D53Ji=hcI0?H zmu^kPM>j@P>s+YF21&D6Ks8EVPXBPed$d_vlRI;>!Mw0@KT91xhZG=e?qH%PEk+;iNPNkf0Emm<|Uvo^_ZhhXuHx=Dy# zleb7XnI1OGa^#Z1B5lY`usSO+`~hr~}@vUsxQEPVjB;Rbr9WZJcg5uUPOt zdgf`XSLNkf;@RreqLi!u$(LB5X4ceHr{f$e{ly?FpgIR8qm0_>B%8j-s@iX}LyiH~ zE~w>1814~-30Tql|D*C_kvokcq^%Tyd*N5q4VJ-Ip+ba0b!DOI{&xx>mQd`Iam6+; z2O;EPd*P6b{xI#+4}d$SEj~1Ycjxt57MN zr7$yo=5H>#D~;th!HXnPzMYHyk;V!&XvD=Q-BFC>Uo|z*o^^>Z@%eA^u@LxY{esVZ z1KE^kgT_jEOJ>_Pout{Ri{NpM{F&lvS%mM>g_>sB6Cizk4lUg3M&XPg^O=1nS9Xw^ z9OUXK<7# z*<}a!_DRy*q4^Ii7qC+mU?I)xUZ|#nUf;)C%jn($lU`rEK|iXVrx#1G&561+*(v#O z1hKmWd2=ks82a`A-hYbdpA9{>ga%! z=7t>Yh_o9I`#$zM2VM@2WgB3UARBP(3UMJM&b2-mYvzsL^P!!4i$=A{= zKvL4r1EMB7uZcvP?j3#8?%OLl+vyNlz7Rokw-I$nROCF+@*9y_Tn)(dQINhHJ|2 zc4`u8mE-01+IdQS9$5bzOMr1eC0$mT)V?W#SOFU#R04@(r9iEFezdXFR5?CKggvzH z^aq9IhDkLmpf3Bsy{)pRa-qnvtaZ|4J)69Lurxf|)38y}aBgS5>vG;s7y}ly46u3z z7$4H`7~nj713VRlhrqE*(o+iXIM|iO6q{cUU|j|GAEKd>LY(FB;|e2nIi+ z?!&Hn2Xp6eTRGmsr`DD~d$wfvRa=uXq7Sd1-SZ|LdtvG(E*v*2xZ`Ec92$W`5Ep;^ zga|NCK{#J5iQ5movegHkk6(-LHJ>Y5!^Wxed8~Ap_#)o{K4@2ZdcLl1S%K+xA51}2 z2w6CI-@H{y_0IgSR?W(#o>(PFg2ZlM$b`weg-h2bSvZs8*-d8-3Z4Zsa(jqP+1 z{*z58w7!pWZ@gV9VoikKI~wFg^Pl(SZz!s6yTeV| zY=;fXDyOYJl#EEsgonexi4lNz_!nR^Wi%yV-N0|&08Uhdzd_Y2Cxg7@=H3F8>=$2( z0@Mue@wewQs29WleL_f#!1o<2^8;lMzq$i%aXUWM*3fEA)k*8&K6>M~r0LM;m2HQP$H=8A*vsSiI0_*9Pz%C6f(dP7o67c-mCA`K zQ4^Y?(+&Tl;w1$WH~@u-L|ghd>NfaG3;i!^b|1V8z2C!+jB9r*A;6y^TRTzH?NX~E zth=4k#Q)|IsqG+_RTiH|CgqKxvd`LnLS=V7nhuZ=n9@F9Bj1WYfdV3Y3<@+(l?Z-}U?~l*ONn#=@3;*b-aOaSg;h$sfW(xU!fNH6dxc z$ta;v=nL-w~h(&g;_g@**3@Z%?n9DHNuJral`hLrtKD1`7P%w>l7a}-m&$W z1kXqiFbk3Vn@0==BCbsYXAGKuqCJ6fMe!1*eqwRR7m8Rm=qtcS(%c0f(cdXdFu`FB zf#jk7^mC}%kJAT`H*5*&1{I-gtB#q=rngVo=n3?XYLm>H^DOb8R z1L>(S9U=Ys2Ek<|=Lg%{LT-E?K*DB_EnnW1OOzMlu?MaLms6E?;fuHua=u?+gbC3k zPc5l{)3rQ6@xa!29&9y__NzRRlCoW#nmSg5EpLD^m{T({>Yv)c+(G~UsOpq|!U?t% zP8?6SjCFUX^fVBW`ix4!oIWh$i>2&4pN{YxV6zW6|JcjS!O`kUBSk6isI~ji$d2{QT4xue`Aw2;XXoG=atl=UyoOj`(Ey zIq*nFeodYAN0wh?J_9{Xa+7;ZODV|F6t!GPAR?N3vHcBcW83i>r`i?|rXPl*}s>Az6`;dF^Xu zmk<{h*Iw5(u6eI}@Avoq{Qdy%$Mt@nb6)55d_6~_+=obyM*-{W3xVMfAMA;0PDjpe zAm+eU4tV8=eh6KsIOzfK#Umn352ZRT>_agtdwDBE?b^CJ7Z0}dIW2g9g;UBZBaJf5 zCn+){9YDYl8~Edv0_OAcQmG#TGXt`7ubN^R;0*tSp14Z1crEIwb*7vdwlqblZQ~8@ z!`uwc6@W+yHvqJ`;Mp>$)gbXW>R?#UdwZIoR~s`{@=g<0y-a!+HBga~#f{nV6dCt? zxdX+#%Fv?avR|3C%~SG`=6)e=BJn4|ZPU^pY_D2R*P)00%kb-~q0@ z-NPwpl)^N>qrK)RT-$MIaqQduef~V+7w^^JI2sd4yR3}~xyg-* z&PvPusLs`M4|1`-exxb6Twf>BhFkQn(!%k5;$2>bMdtYXn_zXS2lab+G?4GsD zXSdZ#_gN?_u5eb4Yx3AjyMOcs!>y``bsMmxYt6`^g0%M!pSH0>ec*l-YoIrZId~#+ zE-{*WdHO@z1s9E+-zRG0ttt4am1x97Q^!#s`RoB#ss;fl(SO8vQ=+ zp{jq?EL8Vh0?}rDmBAn+1maWrciKXXph5Cgz zQ_@2Yd3)xj`b#Rd4zav8Ina9ds`Kn#_)a+cArm(IWk%^*RXrGZeLmPie>cfS{w` zGv>fS>0BPUJ9Pn$ls{0~eRe@h(ylu|?am$m?Q>5}CCQ@gz$jG7`fxopTCGLR2XxNc zl`r^jSAk>>oVddLjq2f**}}376OnhTc8J~yFI%PJ%3j&Btwg-l5E%BcY3jgXUm^{Z z&1%|E`1v#7njKpT?GdN207p(dm4Ofgxf-_os4N~R8IMHbMfg>NGA{13y}S1Je2b)G zzyk82PsPC+fPZ_?U`-fB{pfd|d71R1oaxj+ly}bCyuIv`BhuLFl&XDXzoAOr=$_^r z7mix&<1w`+pKc8JHQaXlj5L6^T|C3=Q;?9|)YJdgW+k*+1Zbj`77OBFKlgk0Q!oc< z(0@?&bGZw_P=h`ZCfM@RNVkbUxhn>5Z6U11hZ|oaeJV-XllsCAc~ok84=E_um5~oZ z;N9FnaNeDH@Z}bGBtDAJIOzrurKuG5C{ZB>z|pysjy$m57X+4#67u!$8>^)Wh32b} z1bxZBn+Np$$OJj4eCeT8G~n7{^{=>PTuI8dzWy*ZzR^K@%>G~sw+6j4#!ZO{3UC7! z(}U)eb%7ra`$dRtzmC93yg>z9s<0lwRk8&_ZDE`yIG@9!RsH&dk(Gk?o@x=P?-#j3 zDJqdNQ|*r;N}v7WdJuZn8?F)8*uneskSjc>qcgiaG+{ZvL!z|;4eWMqo6! z9ou@23n%-tji@Kz?}qKP0+|I{B0mAEm4H+Fb8%n?kSXH@wMqc`muhg31f8VloJ(H# zh8pxhm|@GdB)4f~W8~dKSdXyI1Vzvtd5{Az9{&6|!1q!(1#lkbh>MpcD{VSLg7btN z-1KKIUd}r?kweFmN4ORX4N2grzHz?Ykp6(~Jwxt@{OX3B{Bzq;R>m*dm+lD{A5HxX zj0lUu7!+9BANS5aTOAD%J!DS&{KBpGi_&oxDUybKax#5-`1&yHd|AErr zZkK`63s^3(1<+ndt;nv%g?pqRxvW!@Egr@}kq<3{`~%J?&q%d%_pf04^iLrdqdwiAIE`p^$nhl&N|zrQ}~uGpbFGJlo`|6ntfz|cUan5dk?4N${e=LlG-@%`m z5$-}C{fexxRLIakZisd};IW=|`3g(DVptXU;6X}%rdQN0>m9|CO2GpJOUz>DF{ zY!zh2QB-dnXF8uk^NF|wr{9-<#TdBHI6((OyyynQ#t=Xbn=+)nc7$|@V+FkE-08#< z{HzEs%jD-b3pe3<1|mw}a9oQ5#!CRAw|mFN^iWzvTg6p(kHP43Hlw9~IBVQdAyOJ~ zoL>dK`%KUKl+xZBEO4z>rFKr;%V{YfWx~ySvf%*KOZ{(CEo<7AaJJRyviKX|Tafll zd+v(f;OM9q%h17x9cekzjp|Q8M#>lf5XGEPZY`ouVDaSl>E%}v1N{<;=seg~_@Y0^IiGj?pLD|B?UZ*eP!IVvm&$);} zS4oAV85wAqRW8+24nGzKEeNJ_EoVrVjlge^Wc^kCS&vgh4)o}o<~;l2FNKsNjyO6W zEC~)sk3Pv}iq+DjeuyIX-@Qy?&nuTYp55}Ac~Bh7Hd_1TqZSPZ zyvn@|$Xf`ZyMWmu)=@+kmA)fO7lz2@r|@5XXa2#lyzo%3j()8-)$y@$E28m zqLtYgAsyK#z>t&FErBchZJ)?PNas^rmT=-Uq-jXvF&5Kzs0`tlaY-Lw^G5LG?UK!N zx(hDMADCw+n!jnwmnms{!mj&M$N0B!-;-{pvyYcped)RM(J)6OYS91)>y#Dz^v%#U zBv}HJSNwJ!%_sx<{(yC90EAm>eo%t(!H)gAN6tc`PMnexB`OMAFNG-G9-*c72BReW zhD6z$)$pX48MqAR%lV}&YWR$pUz@YI^Z6|T9cXJbJO@x~)|^8t6-PG&HiDi=aE7z~ z$Xbhhlg4VPgScPL)ktXsNG;((3s>DeR0q~7ywaa$4X0m=fzwSCe*C_q7~-@yB=`_Y zWEwdJzTH(XMLyaTReY_e@rds66NB%}v;^ZCx}*}w1iS2S;PnQ(|l z-&S^LSNj0(6LixQ1srF++{=#1w~0tca$n-|^fj^Tj9;2;{l9OCWDfQRr}%4aWVE#* zNbIl!Yk)r5dgVTRNLYx*e;_q2o+^frO_j0c{O|e_b@Sd1t2efe(ulHLrL=uqws+;H z54IW8(|0wHVi>c=sBEyc;^cIw#4-zl47y&MYG-La)WQ77N) zAV(^2lZMln104B3w#k)y_+by3X@R$oGnZr6oo$|J{0h2iP9=HkiGs+etsZEMkCp-f zAig-VC({AqKO;|;Be^^3gF6@CKVn%%$`9iwzt9W{9&0iiisEl^)=eJmPr}ZfLbl0z zNFn48s^rpi22i{6^Sg8YRP^DbXmvAD0HnZTBs->4i3E&y7Mnv*Q#Z4QW_nTbaJdbJ z&$DoNNrvHG#^5Gx)8UYPnQJE?KCP!sGEo!!YCy_O9-`vzUMEkRZ{c?Y|qMt6%A9++vc8 z;=Obh{?3tUloKVy=eMT zN-^uk58~o})JSVn)(OBO@rqT~e_)dqnX=~k_~(X%K$u^_$)`;%zF(|oO$%N?SckMX z8Ck6QYH)!mRc7S{z}g&KXo$}Bry3fN24zftsDeEy&9n90*sdnRvWfxYks*HnYTk%@ z2BFJlVw$whsY&JimMU;oS*ZCQDUkaNgNLAC=d@9k5|P(kUa*a7ddA-Oi0K|PJ{1b3 z!Vv)GG%q=-`^a{(24qG#x4CANM&{mGEvZKI)&ZXOcN5y>Dy$@C?SFu;_Fv#aHZf!ZXrXNiLbFL;38C zAdD)jkOU6%%PQ#HbTuz7x7{j$-FkU3ICDzcplkzpZC_6TM~V~G zm#z!=W9ZZLKZah>e(3|Z;fDOrn`6x}h_VG3)({ADk`tA`?M5A}Nv&tRXsnXYfOkRw5}sK9k;RJyy0e2(t)2D7Gn`iY54p4Y`d&x#0T5Lgfrw?TV-j8)iUVu zSG8oT)uZR@0GV;Agz zP7qe`*ib6u$$K!BK$vDfpkj@6%?!u;TCh1hId%{^Ij6-<1BHNLUrk&n)Zq7#Cj=d^iB}Nd^AiO7+H6$$Zg@5_i`vfuZPw2#QST<5Ur^u3f6>tA6U{t!bum#>$SPy8^ydLzziyX#S z{Xsi@{nFPxn|`XEW$^l%OW;;f*5JyAlQtv~Eck4bVcinRQv#|w)Z<2+Eq{8R z#QzcJ+q@Xo@Hb?!wLFUe=$*Y0QVshsKu!fqtGnyRn`TiPJ>Q2==4?Ky8ck-rpZGZ5 zN?pd8`O>Nf4?hS#y>)>l2eZ^5w~Qs+>_@U(MHR!uX)VVyy9~oN8E2*QzGh6Lq4{lZ zE2|qO-N=w5spz76S08jf6;X2*_YTI1uS=}|3FG5q)>eb|rN$>F6(Q1mP5D-nhxZv{4w02Sq!w^X^^w zXxXKJth9hesJ-j~XyB|9%j(Z!je=pv?Jeg#fan;jT;r@o1@>^7MEzvh$r<$SWs=tlt#L~K zo`URUVI$}9-LF6AMrT})o?A5#oJ*NoJY59wG#!fV08#V&QY+GD1Sk}sjhF3N_~#1$ zjuuS8N(#UFGE}??!GHc@evOS_B=D0VZSKJEw_vL6TiZ^n4x0G0kFozr@)U!C7>M0U zM9~O0o1$!NVr{yS+lug@-H)C{q2l0vZi{qUb_6q2pi_Y}6Pj5%O|y zy)RTUI=E{;p59wTFez$-S|MN75x8;GV4+DiohS+d<)heFxdU1pl9L|3MCzhSd-PW4 zNwY+?*0M_MS6hS+1dD>eiEg5kBikO9VM^%j5P6j01dy*{)>fgP$C8&FS~<7ua;};lYH9;xEF< z&DWBUD2fPiE6ze~5^(*1efD34n77H4jOS9Pr#@Ovu0| z7eAcahk%j2#AD8=n}B4XfiGL1zu7$#*Qh5Jne8lDdFa^JEN{p@Ca4sz<6C+wDIlZE zHe_lMAjuyA?FWi_wRESZerAuHHV%D_iTb_J^LDSgKm+{kPI5A4+>c zVA(Y%cq)y3g+2PA^`EYnW1^WjyWTEadHR~%SLOq%LN_dXP^)U82Ka-P23@_1v1PK= zFTXjqT?Yf}#z{q`&2;w8!tW9j-5#$~I$h_>nO!&WaRl~V_uw^731Ww5JCN}drO0b1 z*BFIdI@Kx^2VJ2Fdy|^I*WVlZ;@15o>ZGKYzp-KTn;2v^mRLxtDFZ++<{P_hy`a5M z^M(&I&OR~6QppOSHio(%{$T}f7TzKXIt23SsQ&=RL;gQ267u@q)c#cV*ZZ}-@9LR} zGXimMfAxd`Gadn6+KylC!Sy5TPfr-!;N$N^I-g3xFS|V8s@u(c=4;5jSSFQM*;)-0 zOvn7V){8cnqXUg*!icK3b*2Afp~0#&zT_4oHmY#vnyRbYUcf1Ai?Zy>LuD5LDrV6v zv%XY*UslUd+UT`4mKM?Sp#hqVp?+!zY#C3W#G)NE>LDmXdecEl1?Wf}G}uRDMz z^&!sc!iJNW|K=|c6_91;SE7zvQC7c!nynJIsc)G0-~opUCwtQ9Wr4>^zbCbHJ_!Cu zQ+6-=F^5UXbw7_47QwEUs z<;vi&0}RT4lsYs$5uVt^s!Z)H_Qy7BpowZZCA75hH6<8$$iM8M@!|`m(fNicaqu(w zk`F2^N?a91{v#=T1xgzxYeV@aR8Yri3kafSrE0;ms=2Z{?|&cxekti()=SAL2D702 zb2PjpOegfNwC>TP|C-TIdd`46cn^V{d$FW!Z$S)fhG@QrF+v83#1qDRLjPOsMAdlaA{WgF|vrBfxi3QE!6~DV=u*f|{Qu z`8AX%oZjQ|_7o3`H{`xN7lWv0i#*UO30}x554=DwF>Z(7te_N}99?@=Vg)?ZO6#`P z{n#Q|<)nUf?apkf1)6pDRaemr0t^etMnrT zC_QhMKIFQF6M%{uV5?5JPsSI?!kCGpoqO>S?h>P{EdEx z;}9^|m3T(#-pcPph9&c?G06fRj(Ar&k zYJ+tphr_xBsCCCaBWmZ?3#1KXnSE`U5JK-HLj|I{tANECodvvC(Iap;`hb${H~!|S z!*GJDGA`z0jH=mGJp%NVS}q;s$EWtpolpaCjk;(fP8#!0ado@u0*}<{w4?HGax@gH zEMHp6d?MGT#YeqCzt4Pjv%U_1m6h~bW8H6dGy;%X-)mW_qb%74Zj(jtLg*4>z|iy9 zg)T0o{qUNjJX_ZG?y? z>l@9NCue&banmv~dv^`;GlIlxv41WX9%F&_ql_F*b#hP>ETU`o5{{|co zx`*dHkR%bLzHl%GL&MlKQ20fdkL!|#JC3I)qp2l^|?9PYEh}c44EDI zv0&dTcb!xHn^$DZb5^eBy7A1z!*r`(zA)yeU`wi-5E!y@>sBM;1Vy1AyM6t7^1_Jf z7xll<@TXZlY#*I9Su%&{zdFYHRCk;;{s)r9Hnu6)5Pisi4-Dv)Dwo1X+3xygW*GwI zzSqF_c?Ll;LmA9K=}1JWV1Z&6PE0qgwF2O`SuN)oBfQTjHNeKt z;ohB`m4o%ZR~V)1S)5Y1X7)VC-C|GR&qvc{QxQ>F30E_F&>+~a8^pLVYoK88FkI&Z z@#2vm?LvEvZ~e_4`G@G-r-hIET>DCQYi%TqpeFCl`ER`4c@3VPUcfkZ7TiR57rKq3 zp9D=4DW#8}-!fsBYfHDM5u+ZNmNA-`|ofbL2QafqQ82YG|q#D_=Y#%tIo>w*kIu_Be zt*}=PJ%T1D6hF+nV*23nYf2Z zAc<^eZo35`e9oZ@mp>9F6F%_^(#i4bnl5q1-fm!jcguBC+M7*_7Baa9%=mcfCXpx8 zi>?@j=cfFn{GY!p$eTBTgKgFaXUe?U2I(y;EkSHP8sos?qpvxh+Cw#TLFeGP0oh-4(xA?1DJ5oYKtf1q?ISI8u(o^a4?~uIwzf&f6yS$lD(RM` zR^9EMivY8Qd|~t;U0`Rce@C{(qKE{bVF$t4h41?R5C+}%?2)!8+AzA8 z+6n$HddaYx5nHuigq@5)*I3kAm4p6=b>PSQjF^W=>Qud`zHpoaXkU&F_jr@`oL@4#C`c_QbuvYMH^#Ij zfjU&iJb8o8a4%3nUdS5NlZ7wunXk>6o8^wAfV1PB`gvcdP$%3S>DMMWEghJ3m!2RX z(r3pA$T`gkwAH<{V2TL6!_&PIb)NLaOaH|>!|J*XddQwstTJzgjg|50tXL2LV3eY^ zknKfs4N!G$THMRvp4TcWJ>EQKI)m;*(ypB74(zaT;X=+aL|DQ@9XoP3ptQvP%eKCv z`%_``^k^{a=d~fPbv5V%&@aJwh9{0LLn+3-E*B-A2l;I3@qmfe_WKY!#W52?CJtaP z-g?`S`Q;4GeBC@W->Ya{)bxq^8zC)G)=K}-*K;IN!RCxN#qEARzn22&khSJ{iChuv zYq#ucyHB=E>8BBfhg~i-0D6+iZ!0Y#L*qSN4};aLZ(JrVv;tQ<*INx0=>P&=u& zs(9(2#C{*@V}u?UrkZ)mPXEd3c530pXKNprJ|=A+ZDCN;W&7!UQ<0MIoqe&JEXe@G7>z2mgmIdtRi`O)$IX!c)OH{@fes9;kj;yjTt zjnPX~#$zzNa2sKFn5yLV)nd=`g3NbfXUY$Z$zMsm`S2iE=b zlspIDTPkQS`IHs#bI&v7HZWuJ4Pjp5=uBSl+T21u`~eJ`#NHI$SNH~-D*3;kQ4DE+tkmRZ?TKK?E^M!=IUbVb(T8=*5; z^zEa589Ph>YLe86*WNj^a!lNCdb@(SYo+X|@6yJ%n-R>o>KXa2n{VE7k$&`QwnYeR z5@w*_X$OI2AyXfUo3L@D+snWCNJzSsA^6d$+2NdDVm;#Ifh`1!w4JKX6Il^JU>cD^ zI6UR!pZ|f{O~K)Gw~y|HXv4L6&<*7e@tfYNgrVZpRvZnoJlqcZM2QD=KEgj9z zc?Ey19Hc=y5pP3GrvFhff@UF}oYkCPn}jw2Fw&1xyX<`Mb4JxZi4bG6+0G})@0OiJ zsRn7_v({#VLxm#?Kn9{!XZG>_*N~I zs)OFeo^`9LDh%luv0@wVk!wN+G)2z|S$A0kzYnu24^v+kmmY^LZiO#i=ony+gc<AukT*k?a z^*4-vr9FQf*Q_+`uky!=UYc2eFQo3o5w=MV`pa|i-_%hX7(txVJ05zK)~bK-@lu0| zOjO^@Go8mgd&>Q@iDuY|x6TL^!kpkg2PR}&OsGj* zvBltJV#H%~6K~@1bzAq#v7_&*H^1!3QfX4nDq)E*)c2-wJ>F%+@-+Gr)N;U~f}x8h zQ);fS|dD{cyi7J>C?<+dIH&be*xe~OJ({AmMAa=AF^PuP0ve$%^= z<02#>9|n*)A#H9B17Nly~(1AlbqhK9=~?MF_Pl<>!D`#(sxz%@(Ww*f!V zoU10XcYGz>6bC|C;Dy%uU(Z(kzc8cBQKcQ~0OtI8VPw4s(DRdyW$cZ&HZ<^W;^bFU zA#RI(o-<;J2XqXpv}Rg8Q5xIG&97<`K&%0_&`a@K%FUNXdm^fR-FAzHZ7Ddkzu^Bs zJoHX%-)3Z6MGCTSjQet;xIb$jSVHd0z6-z(t0!J|+wVfC_Y zrqkVaj<*Za6Dx4?TGC(F6nkWsxr1Oj03^GJIp{@uc)-r}Z+mUnczg(TPPTD%v1(vb z$<*NFXXUoOopSFm30eNb%C^k4!hQQJSubc}dcmEngmqDUy6&d$@g0wXgIpi9blW^; z{A0S^rMW5eIgDEyebKf6g-$=AJ<1TV<*wbFI6 z`2si70gsi9k%)!O%_qn*piKcaO{5oBeKwo>ALzmf^X~o~eud&%_R8ha=k4RywX99& z{4ISOL&i;NZjjZ+0p{=}&;5vnn>)vNB&>Zn3xktmc2(rTtIJNjP;YXTRzbfzkbFiR zsLL`S5kC0=ZtI9YLL$}s;WDPK^+}>_v-BSi$ZYZ5M0y@M(xcT!+KM(kih0Sad)aG{K?7=oVuIt zqAF`n8DG{G6NhdRI`dPJ8y2WQQWc8SiOp84GTs=S@3(WO#dZ8Du5G9@>a(nf>_zzG zCef?31cLl;Y2Lg%th??0yA%!fz#IwT&=I&0B6_U`FSjsn5&HA}k<9x$5#vT}1L+OJ z!Bk@O$usjYj|C6z1$Ym2JPM~2Os{qe`}!perY@?TT=BlsUy9gv4@rz0UNDnM*COrAj&%M!4(J z`QTwM7|e%_xt(8%Dvf1%GiBH*?3axIsuCo|+Fjx5aZ{_;)H5jL+P4{HPHMlaUvP(e0}fEOHVT`U$l~K`wsc%aJPe;i#NOMcr*tu+>7IV!YzCME(XP@O z(g)SA`Y)tWK=YDN&eFEm;)7g1WBI)15N#n-;Lq?^eGipCRmcBa`qL@HZG+ko@E_33r$3jB3>h zKb1LKBR`c&oi}^6&2k5(-OkIFmM0 zK$-qq`LeQJqxRV=GsPu{+ESKY>+z0S*@J_?x+pWD0e0_w~*8)s!IQ?u6~jp}!M zZ(oBD(H^haq)YnyXSs>oRgH~+opJ#T9G`c#5Ong7{F7XaTxt;!fVo4?rS^LPnGWV% zCnHJWV80g#1*JK^ydZYaKpR?ny4u5F1Rcd#i7? z;*58Ti!mz&5I)v+3IIG`+U{sQ*(SfX_|9db@4}(5^2J`S{r%0)%(%wf1$frGOZwcUvhK zs4`f!?T3B%i_LkHFMFQAlkQQH%(lE(UYMsXCnv(Tom23J#8EXn+*&eMTDUy&-g;Q3 zv2Dm&uK@XH0r$9oCd)x>+Fsp~K%B)_>U>pd zU!CyhLwep-Az0wrrKCgMIO%}N%7NLs{`g$YU*)x#bjSJb(+9N79PdTcxoBSmSA&^9 z4UO3$2cQK96o7l2?q}!VRkgpl5Q0Jyc=r-Lb2JO#v3^V+XL}Ow7??br>gwnu(M-`Q=*z@lm{JE< zd#fDM>gbq!&zz~n?Lrg3e7`x_fBBZDPBJp=Y2@cQp-<^u5}I2lq~MFc)n`DS4jI

^LjlU4GO;ejC|Gic$(w( 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 >>Hiv3EGPTs&uN-F>`G5jL-$&|nKH5|$h@l9O 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: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≤+{#=BbVne%wk5~~0EG^JI3H}1C@l2*Jn{bf9W@?ze~s(#6KuC# zF)Gj3AN@Glzm{Y*6e~m_GvNfyA|@!-Xr}mf4t4Nuni|C3rc~En7J55wXc%+b{e;}} z-RkAv_>qkcR>??J5k36-A!&EVFibM#%A4DFUS7N|k!f^!{+-&=spL(n$STCk99`T& zLf|I$&Z2+{gGAl`B@_2`Ek!DbD4}5#i5WQ}=~Z!pUK32H9oi*?mTX`6@vprdKV9zw%V7ho#_vL?V zQDbT9Wzxd^3WITmIxGRA#*MGeH3rd9n`BHmBfSN-=}kv~|MXXwpGkinsJupb9eupq zd)`aq((>2Qo(txlA-g{?bBG=a8oYbH83^~h+5Z??nJn@6flnUo0io=De_9hFr>u>4 zxa!NU?$_XB;5ph(?ua**ZvvP7YDhMhNyrL^;6C@h4d(60kzLzhZb2u+Keo&a6Il^c z*5vp0jG|5o(eZmLCZGOLpfeWIS5tENqHEHm{;RfvSqm>AuUn#9^W6!I7ChZO(cy9O znUe#bO|#ynF3s^IrWiwSoYw_e+pv$_a|aG>s~H*~h_7${z1>J*YE#7xi!XX z7ax?l{Yvx;takNS*+JhR$>yt2AmAZjZ1{reQ5#ST0DCXoOD3<}5gju5F?VXX^>ERA zJ~k}j_-h@RxRnLo2uKVLY)RKVyA8$IOH0a+!rfl9DzcO)~@oz(Z3Vw_Z1Cg!@NsQ7k-vg3q7}^&A~BVt)8J8r zaG*T@V^sD4baP1JP2<*X>dvd-Q8kkG!{#uCH*zJxhlDOJ!S8kdZP@@AoC1|UEkIXN z<(<@(bb0N%|9Z*Dn8m99$EHL`>iw#4@g=5W2B`Ko-A;g_Xxmfe0L~Mq2TGxjZcBQo z-#Awx7o*q2@dd*n)`U^2!5Gw2YNjZN;&ewA~>M(5Ow{BZjA1m zA)cHe8|@{j5>TZ6sS(LPm1mv;Y3&C3-Nq}>H#7)lf8m)=c6O=H_+8vBtb81i>LrmX znbxLbbK{I#StkP<+se4%q`3`P^GV59)X|02+^X(ZH%B8AgSQ-U!sl1Bks;}3HpU~5 zK59~`r+iv*f541WUFZOoGtf@am@D$$FjH404=?Ca&q+sNt1S-13w@%@vqI z7yyu_Wkf46DzfH4j}suJ^KahQnQ58bsU&voF?k@P1p~{i(VKS(S4$2eR@QB0+WfK6 z3Xt=p%?;9217e!A2^~Z9Tp9W)5pa3oS&(JZH z@48`sM=Mwqb~;nws9@cPSU(!O)UQAWZOJmaFfzHBHFX zx@q6rp6}aK1kIO(J9j+cde4DD<#V8I%e{{wG95qswG{ngub9~>+Uv{3$=rRWtH8q^ z${y&U0Abo60PB(*jBkLRV!e^8Shl%wC@Tg^lj!!K@enir)ek`hvnFZB!@ZyB5rqKfODl^XjM3 zBDdIhr1V2_P;SsvNDzjE-UDb=FB4zA)3JX0>OHN;txWZvmR2jz+iAxYsG4IDU~Rn} z9n z_Vx*D2r3gKnDS8S8VCDwQ@Y^&6;R_1%EUdDV5>Q}9-k>t4|=q}_C~rgr)E>NA+l21 za`2h0uCpBZ2*f@;(1=W-o)bUr;MprH_5cT4*uHvNgqHk z3?N?6avoh;HEtN-dKLUVzGyP0a&&-_2jS9&^(v&ZAq;Rei1f!DFjfcfSs7P!{+Gd< z&wVFNmOraF@P|hBN;4OEI5U{Q+W7q$#>xehXQIZh&Y1C+=So=Fd9mxd>d4QQ zh@2!Kio4;_EHB*uIE{$~7k;=H5zjt|{G*ZaR%YR0utc7yoQUp);w%v4p8=K@doIOk z>qr4wqS6gJ=dBL)R*)Y628bnH(`h3N8AQ^X3nkgOWo$S3UCCw(ZYj4i>GjUr?%zTk zD{R@s?7qToD~SrdE1KE+&UM{jAQ6NR@br7-A@qQ@{n6wWmMf-IY#{7gMn=xMHRZ}u z@%xXY2`XSldJCQ}n`1U}%KJAilSJL;Pfs%7qIm% zpg>rUKjao$i7=>-1eZ{>b)Z77f9{B~fM6YP<^HVC+duga7{8E+~-0+R-8|%z(xhC|3tE_tPT-T zro*v;FK5+2)^+8D3cje_n#eJmtn=~E4()L@P0-mnK_0(MJ78gxTJRrc#^&h$VPNxy zKgu(ek5SK__iKqxj%SQqA9&66Q)kr^xxMO+vSVMER2{7n6b!!Hl!?2ZyT%MC6@rmR z0PB^SqU44p^b66bqA%H)FPG7!Jb@9d`P^kQO^Q$%iEPi2&sx*8!J*i_OOzVSQ(``i zWq8vcU2``Hbk2=hH%dpZ2jJOsqw0In&tg(+&fIpA|gZI8I?3ReXUcgss-`jDrPg75y^{EgK-+GF8Vo=-s>idl$@ zl?Q^UULj}S#OPlH;@S9WOdQujZ(kZ&4tRkIt6?`f3(;%W|EHTfH+Xyv%AuGH_nXj<5t(!%QW zs08jC`kC>s41{T$wn_;;SHN}zxd;#pN~i9TavtSX!5?) z1R!N0ha?;ERN0hll8F{y)h;-lkcxkP*FjX?__hV9JC766eWzjhnp*q!IZ{B&9 zuZE__97*^TvEWEZ{fNw1KZX4lthbth{Mi+4pwBci`scCRS|nABQLU(4KFie_|8e1- zu|)aIgOki}BAr-waJ}o_VxbRYc$c9|q!1mj*vqg7rh0-`9-d8(*X=RC?&RtnC?gSg zxBn>WP~lZMIvikql6TK$@BP2tOab#(wBU)<@SoTu>SZ^4=%V!+W(b)aTp8b^!Gk)7@x)UFb)}c6=3O!SKp@WaQ=uGy z!@DZ{uc`le-u~;vadtJ@Nxura&a(U0rbE@<`Q{F}xZ#X<*D<6upIs{XqYd1}zWt4C z`}Dppdzz9V;cE5iX0h=(;3+eR*D?u06V`YNtM2UPhgQ;``PhoPBpo-D^|f@f(ahnV zk3DQJ@~Zaib-AcW&wSV5I+NhaG%}F*=Df=95gB_!f}=FFF|{+)TtV#jS5&k> zi`Fh~0-a6?Ah`kM8UX+`szn6G{X#XMg@a7a21HsiD z@e&Q~o#Cvwkqg02>eA>G9z;&wk=<@JHxboJ}jK=%?YrqI2Ks8very)dad-liV z_?in(cj(EdtY5P4xgKu+Qki#O>_XJ7-jWFZq;cZ>%|dGWO2}&3jkaRA+9&j(TI)<~ z3UjsWT6I%lrE&XjjazIHezH|^=W8Y|Ww&;anFhGJ1ach-)?G5qTE4W4moc_e%xG`O zpi077MTe_9zoPBrgA8K9IZP!{0KH)%aziU68gRPf!I9ujjml@A4+ei5Qe161JU%sF z_%qzIa)_MM2Xeb2JV){=bgz`j;rE?4ZGFyWqW$<`W9LV0si8W2d;yLM0*HCW?@v`@i0IyW~Q7yFa(6tnOj zn~k|UcLws6)t&@QYe*J#-P={`XYfd7ldLQ-115sVEuCFPHLo4k0H*KK)`QGPO3wGc zdR6eLoB?*?iy|@A=@A@JUMOx`oCU%S)>;(KaLio>;0m`cliTsxPW@ql60kN0_SCI? zC?i{E$)_N5Fn7c%A7RhJ3NBWeD?D4&ge}AuC3-Nb?zYilJ=IK4{4xo-I|S-#j$(Dq zpW7k<2aCL4x?GKJAj)xvcxVOYHw@hV$|dNSn)f@qL!|^i!T17co(gBi{Kt0ldtcJa z(DTXMaDq%K;4q&In%zjEnV55Ft`NW_`*mL+tbhr?NKzgtJG!0D5z~-v%oR5m2wggj zYNMHm!QJq6q_^5`XyDoGe~Ye6--@_Q)fNtw@DE&$Q%z`>ykM@Ym>Qae15z!vhwX(F zpRtRzioZ7E9W4X6db6|>a_MKEpxERJyM((~?y+uIM33leG?^KL8-1e3__ZVb02vo* z?fyz)&HCr~HRRsHF;N_%gY@$8BANc{j&lFK-zi8{`4R8TVhwHK)A(X;9)m7^&S;$0OF)T|2%cLnC%czg5>g_Zy5@BDC(16od3Q&>4AOTP z&#`YOn|2r*v&Hj~%MS=MILE-%;Wh}y05^-WMnEq)n)7i#kUf^IH7snO7KIc}eYJGA zovq}WtQgd6(83xQOIl?aciWRc&ya;p`CkCNdGpk&YIOCw<<9@$7Qg^xxp?eivCDmufBu#77x1^# z59yz0BW1iNica);XR~prxACVxW*8Z0(P#lxE|wx#7UEg|sYo#s8soET7^?K~a>T*b z3;%nW&x-|O=zGlQ6p#UWaj_)$yH;PLBvg@V$f;2|ER-W&&&l~hiQ6RXRTQv_YU%W+ z=UVn7c3BweQKC;wqz_D%b}t5(bDP)U$&MhKgYvr2tpvfaL}Ko5pksFta?9Nh`X?h} zg!KSaO4U2MY^M`x*#Izba;@n{aer_o3uoEEvyVe;qBouFyo7IBD5i6oA=ezlth02X zMPf^jvLqP;1qcAqJ;y@4b=c;W|C%on@#fuycOtwRW8>G7$HmjiRRJBy#y<`M&KlfD zUzoPOelht_!n4@iGkJCCj@&mT%iz}?R`&wre6rBPt`~HqF}W*;Pg&_l+nY3As!|o9 zA0ngpf@b?sf?dfr&h#dakHIlP78a1c)6nkk0dYz=chit>(- zRCt8Y&*j>nQbH4%ME54S?cpJMB+vA$I2Q`6M>d&uLx-5qb?}rEt@B~*DdRdVmE1wH zi#A+YvDt`}$vo<3PdzIU9Q!D9NSwEmLvYz*agsuJ0U#6Vd3-pI*qylOh^)c63xTt{ zf30k=6-tVX^GFtY6dzg}kv)UD^AQ#-UaGRhec4yxiJw%=HLzu`Ww{?9xoyr!WqF5- z=?pxX-kz(=!4P*h@$WvND;B$q(4bh)+b@UR`XT53uI8Q^4#P-jWe)1^JVL&S`!V$E zkVrrj?GYHmL{MZm4nIMa#GE*usCZ1V@Z+Nl)bUWICgr6YyI6V zOuDVV?~&TGBedssyph>XBD+KB!DB}QeAFchae(cbJMU zd0sXj>&auWh#IC;j<0d=kc#1V&R6AHaC|kjNc|YNSWn*P08%sMXkYpXy}5R z+ubUG(M0%4NnSWxm?aj@WOUMvdbHuddhT(C16${pH*O_7Q3CI+@AsU>03kcIy--yk$ftJ=scWjR#kY))N}{@Fy%kXk*Py2)Tg_gsE``iy z5L&w20YUBn8h;1igF1jCMfxcq3H&%d!y`gxm+=Fcbc4FoWWqkH(R0#Vf3;(mK*xbg z(iH=y5$@m(yyxrT^0cgFhe{sole`iJsCdElChc+q-YZcW>2&`(z=3_bX{p0u~=?E;h*~`}n-+@m48+ zh0;!+C_E{)9CxgvUNaMJR17sTUlpzc&#Vu(iJD0ro7Oxh(~dZLX2(81;%I`;adib6y#5hmIy6`g;ZfZaZ{V!O3n<4|64xg$ARm zRWMh9S-G^V)XKt`HtxDTcW@e!g?Kr0*nK#)!)lfEw#?9nYR3%R;Xm$%tzQxPkuk_R zm9&X+q3w|XmBtU14%J;&C)501XqNpObDOO(wW~MbKf66hn5f;5R0rOgqR*LFVwAzt zUvz{E$(UT;0r^MzbH(y1NA+0YX{xseb1PjNq6E@di|iR%F9)V0&hNLYTNsB_0%Hi% z?*&2fU0_!blPl@I6-qRT;*ZY~TC2iSU# zTi@?4J2jKkVIS)j#DtG=OuMK7Ys-TYMl)vJ3Ie_%!!}u=k1+>%xTQ5WRHb=1j zkKvOK*9n93y2l#JiqB3NB;S#TKV@~qzW0G^QetuV{f+k=)Qx*;Qz|DLuGVRY5J26( zWH}|F7gj{Z8mSC@9NO|_3klka*=Ih!^7w-Ee+12m={@n^ z)?;w^W#;4T7my%m+Vnnt4PTyoTlnVE$}<}W0Kl3z^91XjClm&&r(OZ0b7??G!y{Tb z25j{2{MO*W7dzPt!Mbv-(+_qF>xE|jHiv%V<1e-&9s+h}@h+u!Hzk9G<|pPhj&BIY zu1j?h*?~d@>F@#5Czd21bRC_B&aGCw13$-f$8?Q2nPr^Xn1xki#Oa+yESVN^B{2m&;1 zbr;@%|5DHLGN9qSrJOk`vEb~19YGzoKVQXYH_9kXe*iZS8rA)@?KeXS%G~~u9CmoO z?n{q^Q@kMQl8dfn;YkM`xv(jA*diITE>U|fDu8&nqo>n%HNGX)@ zMlZy_3T$G5)yPdxo|&8vcel14jm-M6BoGJqGmq#F9&NY9ZUJj1B=xIg26#8Z0@gui zarnCg0P_b8>EGvFhr5h*Wnns8QY8sdSH7~LB3D7J2h%X}KPcwdNX36_`BXyX`0B^t z(Q6V*oQcR&7(Y(l2(PFNs=DrlvdNhVIG~@RF?u(@qX$^Pn(JYF(Txzu$d$w{u^A5> zCw@zPjeI`Bc3ht5=KqgG$HbOeyDfyhP-M?}yPeeA@b=UO%iE)mGqe=y-a%DT97BwPMf2h`_ z(Gh9Y^@oO@4ZaU#JkGFjByql+RrE^zm!9roCxqr|uevPzx z7V(0#s&~RVf53G7d#khy$QH^j=(v^@+O8uNjRTUCU~{UVh_;=Q+!1?=&<*aJ`uOw} zIh6V8qu8*cMjdHyb+PpV`<4RWUhE?N82Vr^1uWdCd4-2Q>UVW~Y+zbZt9noY%taEJ zaO<)x*B@*0?&fdhqe?P@Y$K$eJ*@Oz!!T@?6Q^rK3i~MOm(C{rz50KUYS%63;Zf`3 z5Jy?l6H3W8hL*4R150Bm*I!d4A{BSza4N<+TnN<}=4X0$w?kA$6DGkA^Rx6i^8s}x29s>9gP3w%5zoie7$an?yhM6K!&JHoeN}=NI5BhSe{2P4mr=OU=8aTXw7!b>{T9 zth(vF?}5#j+%a;y5iju12-S;a+EcUOFNQ^2mZ5L&jd4ZX4|;S}4Ye31XLFfIwUAas zxl~=hy4`X<2zXnzTf5zFcFduz(h%g1*>4?xFH{U^3eMj?I=_*l^=&VMcQ}FrGN=6Q zt@@jCGk{+i;nO-f6<&H&3$%Jxx#q;DVC85~RN(!o7G22P4#a-J)k@qub4yg^;V7v~ zSXcI0hFY-QeeX9TNkf%h1cGaW!HSa&exW!ZV_)7SIknOyl% zb70o)fqLoV_@dm%V>?Od9m!sW+^xmZRy_BnAd5qaQII-(<5XQ)MOJSA{P!RTg+Rx; zIlT?7w>)|5`;ag5$IDsda=Xg-?RIgg$i}`kosX!0F^5g0aYAK7)Ev5R{6Dtrk$Kxq z|FC#D(QnE{KL%W|j;f;CZyc2Z1ioc(p|Hmfxh}_{iPD*6A_WoKUES^u+cPAY=KN{5 zMUb0IKz9)Y5}^VnYpcqCQqtUvc^$c9_#@xGBq;o}h2YneHH=x`%Wuot$)F)0+1e}S z+oj*JVJoY}Dfs%@y^vp7E9(*pBFeWWQ9T^&Y zu)D8mYFiNN4*o;Tg-7S$Yuxi$5>8JS7Ol^KznoF)nGcgVcFOqT_vS~}s`xF&f?JaV zGA72S?vBp(%7r+SF0_+AMjff|l<}Ja97z?1+_p?K<{|Df{3kVR8bVQ_h@ZZn*>2ndy^7GL|dUoP_v07|M&SF?}r>m zJ|suR^W67+UFUTUdk`o31blp=S`eFfN!|NSs&05MKeuIn?6bb9&F8Z%$z5_HN^;{t zIJZ`Ze8;b{(_vW8H?R`?;#R;k+jbr86HZk2DxYf#CMcoYu)=v1Cz@f~iW(tgv5$)g zkTX(Pbh-m@osRffk4I&ERY7g5d)rhbdh7c7PR%4ZBw(g(&X%h)ac-5#&=3wVnA`^} zhg8GSYa9zVbE zK;kjHC*4B6P;B5@-GF;L9jsA7vQMJoW!2k?upp3)-QIaZHhEOTqu?B-AC!1Ht#0@; zaY$6*(EuH$Ex5}|l;;uub(s&TG(HSh_(qXZA&x!Epa~v|LXYC(HNFv4r(!{b2_K1>yi>p z_X5xHMKn(}3t-rm5_@zBPfXQ}Nj9?G4PW;w7K$CZ*@J?u%o|QfS<G z4saMfC@+n^$v2LiL?au&G4q4kOH+ELSS;Zytd>eY3e*rB@ZyCakbvCjd(%>^Vv|j5 z+d_a-<=ouV=)q}dG<5u`tkI=w$&3+we&G`xoON$^usBmeyKeOday=6Qndw%T`r1Ra zpkh^Rw!5!`Aw>qGH{^AiIALt@w_aBBS<`!MMvqO(oyHSBf7MPnVAK5=pZWL_@C@N?{ zgEjY6h~DObbq=f30u5PJieg;u>@1pNOBIE&?Dq*?sjVpn%%2HYXILt-DSM}=eMea= zj6SQRVjnt8?uw_wPx!tRo#{;*We*t_=z4AcXRTkjFe|(RpD+CIn!ev%H!J%LbkFH_ zLk04Mv5C1{R*!9_w-OU#1YEZ_z`|)($EQbo_pwdp)zwKJBLSLUrb~?45A=<_NpQ~q zSg|8iukqL_^g-7#6~PT4kHXziMBf5|h0?pZvx>YcF};uEG)tt@Z}+aayg4%bPBWCA z4Hy+zVSyMXjC@`>CHppkF4RcV0Z>7C~Qmb;D3BvKj%2GKr(M#?y zGv!e2w^6yEO1?8Q!!yv}vaQY5*9eXM*#~u-uRvf3E-Zk;^1E)^my*BDIg>QrsW0+9 zU#NJ@&?b`}<3W$hy*{+Yx8XcRr@RY;SLPFKWMmE{Z!b^6x~SBT0RJrTEASykm28m=Vx?|pS~lZVVAv*OVj9cjFH=Qj_rZ5Ds!8qq^1NT4rO!$Q2kp;df*~?` zhoN2#0Sy?l<Z|+cy#GibE9yJuErzO;!S*NnCu* z?ZLtuQ>O6XSx1KjIJlt`H}&0YYbkW6q2VWL+$m$gYIL*J7j&mZr0>qvtL{Ryny)js zNo?7YX1h|4egTZ70%jJ~Rh;ZH)f{qkBx1UIYPZvX_2)7{6x2F4e^VZGk{wn1|;$P~-N-Lp<=&So_UXYds_3$+U=g2V+qeRyxK#5vCoUn8?$khj0CX2dF792uORB1AuY^FHPCC02X6uwYv<+9_;FY3}U!53-@F zGe4%u1gw=-Za7;;pU_&seMIZ7Vg`r?#HVDK_d=6>r|^AZuWsSJ;R zIs#+8;*Wr$VP1TG0PNT4x2K@4l#=6Iak%P!xN&|_yFQ-rFfB8Weq(!$rzV&W3@buo z|E-Sehi2t^>n0<6T)dYx@_zHW zif&3=2L`?XQf}vVynjfKGl7r**6{bLdASqSdKuY@*|lijjq&@TTsdG>`Sg)noy~2D z8;btlIbEN_S$*_fSJ8M|yHV0*<*s8wgnH2bXhaI-@5w*&s}kCm=KLKbf8?qkdAgg{ z8~LMX9^tSB(86D4b&{V`;pCJ`L3U5eQ!B1RQ)g*UkA+!%l4Ta2=r!;j(!8o-W7Uv9 zVfTJ?wDx)WtkRL$C<*%g?9M1walQ>{j;w8ZANZD(wY{=Z&gARM`Ko6W!jjx5Ka3w1 z?xPM=|3MiF~vagec z$7%;58YVnhqr~z%7;{};TZd&3Rs+1c%(4`|918kZ(UVX3m%g$S`f*S>Kf`Vu?3Y@1 z)Rt1TX(9yf7wfq8t?7=u;I>P`OIIV+i$$2u4HK|sk;<%lSHog93RcA2cvzk1c2URU z`|H%CPq&7%tEUDUhea>q?h@Z|X22bhR6d9-_JRy#0ZoO65}M}U`aAv*M`q8hZ5{UA z%=-3HmLg{auA|F!@2YWmXMM{zArd@=Ra3126Wv=wDbv%iTJyp1lF3ut_&7W-HlohM zc0%*Tmh1ZR*OmC)Z;Cr~@y(w>!sntsBNlNq$xDrX6PI3KcOn<|!9m{3z(nv};~C0c z1G}~3yVo+wotoZ+-#XLB~Nl@er_#1!>bv7qf6sljds?l{+v zw?7Z>){M+nVu(L!Qm>Uw6MZHyVDjY;;W9rLEz{EvG|nDPPq1Mq(^@sn67=ZVE{g;% z%wdn}8b%3w{sTO>O#HF6fEG7oUmjasxP6xSQUMd6v7yr`Cavv1!xm+)u}elQ;pWc5 zH1kgc?`+*HMg%MDFY!wNYxmCt6J`i`JL%GmMps;iH;=3xLXs}dUk?_HqB2z0TA|Fd z-p}DS0b;<*Mc7~Z3J8Qzr$RNET{YiSq49FJPa6k~1`mSB->Zbqa>R@|ef4}OC79}`Jq87u6 zBrl5+Q>zm^a(bN$j#f6sFL$@w<;1HZ+F+gLIc}rDX6cG1Xbr}`wWQymut@b&v;}1Q zr_0$9u((aNI82_RPr_0c&fu28^1ECT-g%XS>cf1GEN-s<+{l8mj91t zlo*VH=aUB(NLmj9vkg8MKQVmsMkVDH8 z_WA$Rl*%Oo`QNg~uiY>k=S;c%^w|E6mFoprcW8S|?T?xw*$E=z$EsrMUiGB`2l0{wHx+%w3dM!7E%_{{b7kTZ`K3a~beI(=`R3;*f zn0`V=YEbq279e|{vn6hTQho`xjN?H!T+H#QpLf$WT;JNA0~7D!iK|Mc@FR@*mJqxE zkZe;K(o$!-!ZNcaj60H3E}!R`BS(7s+0v~Ee0pZJRVNL{ zn&&bDOiB$pK6P9oW~%7z|is|yP|=H@voqPv)#Ks1Ty z4h&2$?pt(rr^t&2@o083A)9=Oz(Hma3F3C|a68HNa*H`71)zBOfwsV9&+Iv6% z%T}}iJw(pQ4{+?@VBwap_bU$BwaQ=9hDbI4#w9Q zg{N`!*5&b*?WA&#pNNeJyAC`ASoY)|`@*VC+f_|}x#j))e`SfOkv~N(95ZPcLPN#=0ds(qQS3I5@YL1gUfQ_| z*SH)$9@3T3by=}n_!$kY6EWMxc(bK5bXRH4HE!t&CIauwg>p zeC6h&edWs{j51a({F%xV^}(5YI~5mJ4<3Z870H~x89<4oae&C_>@>>&6X&j&bjxg9^ChATR;+wvYi2yNm0 z*d>gC?pxgs5o%6elVCaWg9fn@hO;#*JGBhX0#EiE{~OsygwHm))_MGWG;_5vzV6Fn zbwGr$X;ZcP;ofP3V)|J~u|Yq1X=GAq0t3fGG%=Ct$)Z@oJT?d!p}CWk^Q?ILuaeYz z=I6us_otrj(m#bo10L&mH1@Z!O`T}-6iozkWFFft5rg(|=7%TObIdgwc66n{W=H0o z*`%d9m!jF!bC%{iH3wa|a2{sj4q7`-3=J0(Jxi z0gh3&yt^X$`M0KmVEghHaO2TBBSamRw4?B$Y5Oo>*XZ4OWkWtu@*+R28B|K{f-Y@{ zwYS8nBAZ&{BATYEFQk1V|Mrc(nm?D#AX>CI7Cc`EAQ4&`OnQ?Ggl^zZZ11l3TrTqn zrNB!(`Jv0US@2B7Zhpf9ro18AU+Bpr`rX!INZz|_@3AdO29-)DRlc{nW7Z7=MmJ>T$OzmtL<>dUw+%wh*Z%_D;&}P( zHRD|Wkkpeu4}V5Zy7C)O_!*ClsGSe|cIV8hgKh(|o{ABVy|WfnFf^yKWTDFSW@pqEv| zlD3Mkphoiad=Fs$IHtE19jEmCcU{t^DwbOFCE$n7+1#si1HR_h0;B<0#B|p9UN4>U z2@RN-*kUhxes*&YLo6DOY2yvV0%{Wj%b5UA$z`K@C8oNo#$2cPhj*pe?JoWfzWFTu z!f#KvS_h0{)dndP>&_yEZ3CoAC&a+Mzs##{RY9Zvpzu_U?*jPbOywspzq2_t>v?*m zRwsYJxqW&&E%reXNNEQKPu)*tz(`ZAikeSVp4^uAT4ALlinFZ-1X4sw8O<~Q^Y(_a z_GJ0OkhE$ap9>dbs{s=$5>T;1^QzCzmfKA=*Fe=Jpra?tTcO~XQthhEd&|R2UD}d2 zbs`Y$OocaOfL%5+hX61Bg=_eIq~I-$hna+wr&yEw-QG{=R%)mF3yZ)f3Ud7E86GHD zB|5-@plH1+@1mh)v_)VQ`QDL!|Gy8;jNQ`&TMP+2ij|ck)!7`J`9uT*6c=? zIQPNzRA@8+&To~-p(1ey%n5H)o==AzP6$ZY$WqkGbjaTpV zVBUZ-@pm`U^x^{S6#bX%NWO4u{tc=$uP%u4PQw8)J5+e#=FDHG`o7Q*>ZpBVq zWii5|i{$kI1u#jVR;nGB^KD#x63^ky!!Xr84Iaia%PU`3vaZlbjtohzo-W|z1`*K5 za`=CIY@X;-n9rbhzQ!QW^34ctBSeWtX2yg0`PP<3iCe)cdOW?Vmmy`qC9H*hr;OGG zL(!&kke!(?zBMmb#mB36pEHX-e^X@*+M7HiFSVvz)J@t@Ci+j^%NO`>gC*~3b??;U zxgr|V`10PzgfP+tWl9~&TC-bez*!4EsVaH^$K2T^phjBDhph_zsFVHzkJ-Y#`6wlr zR}NCSn&W#*!TiCu9QMPv3P!O)H5c?W>^!00BLx?J9!A2Y>^<(Sn#sye&~;TL&~m{R z(yDd8m2|eG@L>BS!oV`=YC_Sq4#23BwI5Xm@OxIIA@z#qG2QUHMuA+$V)GTUB%Z^etN}r1m-zB&>UNRHk(CLe)@M%GKsYY!Sdrk;U;APS==`t>8hBSkgca7 z#x9+RzuxC$@y>mHHR%IQZjo`j+Pbd^8V}t8h|C(nRwn=_<3t5*KmYL_N0lbO)(zQ| z+F3LFqm~y;!&m5ywlz@Q=Ru9OlMftg$;jujMw7!OQYEWKl0|chY_*8%bft;H)rpLP z!gs3qS)+5R%mFPAz_-;M_nRzkiU4uwU9rv0`}q3T*w~*vRlyxu;k46wwI{u|dN+B> zNYtF4s2QjX9J+wp@bp-&EDQGhGVmIe>gdiEk~?=iQt2$P{?0-2cZ`YGxxUKKXxG(( zko#Oc%i#^cT7qVr$GVWa;PB$%2hPF1RamC@2?sBiYK}g-fe?|RnU@K|X@*n%W5N8X zzJpRBJd8!_v1`fait$|_hZB;DnKc3_Zxe)7hE9^iBz1^yq+ z)H1_H8v%Jjys;2EPigz6%og#kZViY3m@H-9p0O#~ln*Km5g$IN9kITsoODI5!2tLj z3(+vNgJV5%T`xGozvhwUn(c1O%AbV=6%aw1bw_A? zz%|Y2)q4!9Tv>kM^{I<6s~G+%uRkl9koQQGT(vIoK~14XhR|td&W;7_j6okX+d04O71#wHg>9X6>$uk) zQW2?+p4{-i@!qbt~ zXRfMp+IUu=A?T+B-1NGIz5cJcpX=|ysK_-->o1*2BKzmjYwF%U5A}8bM(Z%!NtFJF zF|`p%>A0LK$Uk~&OZ7IJ!OzJOr@`qs#nFTU6O^oqAWn)-F@8@I-~{UD*$$huqOiGf4B^>*4liCZ5BYtGA65iz zqh4uX*^QfT54!XB{sji?i7(P<)4nxk>x*6%PD?Z_kGc<|V9-S+^!-ulBm*HL8f*dO{`zl4W&eUGhQo zwyL9f`9`*)DYtWie&)_zDfc}z$o%pG&Y$#r38U9ZhNDJ3JNG1dasc5PMeApp8|r!b zoLwCJTxCC1cW7g7`A>*bx~*tCYa?vGYx{b8???sgKU+9ca0}{%47A_~eIU{O_c~#) z6?VuZ!j!udqaIPzitG>+I=W@JPQ#z`#HSbEVlYld%KZqot%m_F0=urm5=DH*FLrrs zc+F^JX5PHT6xU7*gcd#pdu4St>`?hF(a5waAijgOju}Mz#GSzTwEStFqWy#Qw?BNQ z<&#WA3V)WTB_+>%vMj(j=8%=K0V|r%0O=8Q?Tx*8V6YrU_8Hb@{#ryj7W~S>9MQ~E zr0sT}VQ9lCnEwe7y9WfiLs5bzQjwP%4!IUit;IniCPpd)vv(2j#EokWNsUG(qJDqR zdRYp=5*bFT=r(K*RBmfmEEsWQ4+OrEdSVW@TgJUlBh5ywRn`) zxIM_@;^UvMhz_9skEVZlhZ0EN7K}Lg<0iR6wN~@yTqE?V@=X2x!0<)lv+yU>0qT$y zb_g_&Q31GvOb^NRGCTJ}9-&06c!Y4@y8BNWS=Ruu6{on=pSf%7ejr5*0l(u)2@p7^ zoc@nS2}$I&vW(E*@-6{S0NtP$PedagCZICW%JYpAR5_WvF^$$m0 z#1L2aO#+CK0z)?2_ZC}|J+hPL?tD47C~EtuU129LGiN9y@wE{^CSF;L?*L{XfOXO- zR}R2ifX^&11bXf_|Ji|?C2DljbI4+)OaiK+AiRF zD3SaBd^QOGf&r>LKela0M^T}4KrFuYcD7>i#qpMlhUIen38;Npp2C}YT04;KRjANW z5Fi)nU7%vS!dnc=qR!v5eFoV)6|(T+VAwmjhj0E3y7l4yTr<$-umJneglrxBHwjX8 zob+~jq~iLi6xdC4oue_vk0*S3^iwLQ({BwHx$T|5@T$*_l}IhwiP;<*M0;!W042`} zW-h}Vq%8kZA?HZ`!LLW~dkAGh^ZmM{YpgUhN9G48{GSJ@SdACO{o8y9*EZ146vHgY zHv)vPX!x}vx$W0DlX_Wrv-*KPUg&@c3K%-2;}6NCZ3kc#Y<%$m%hKmI=80s*W+zuz z8*TJotlar%VqJfgwkYAY!E2R<&aw_(^sJil6D}`8iQN$-ci@O2#}q~l7sIk==ceW3{(F6*RqT`_LlndJsS@8Kg%Y! zY`C2X^o!t#Z#F#Fp3u1pRadr!o)XEeMEXya%aEF>M*}XM?1)d~RvO7M$}gVi?x1%? z-Jwaq^|b^>^ouIw``wzqjnUR!sJdmopjN{Lw}P`}?*e}*jWzZod%MYd220$Lz1l*7 z0rdrB-><)&Ti9q13xE z7M_7%?i?a9fcwt86g<%L_;_wrKWrr{OFa3aB0EEj^5~1}Lbb-t-Ubhoem!y(iF>A6 zPVn?Tr$Xn4$GuB7;gBC&Q#B1@-94qa*M^&x`4ZHT*^FC!&Mlu?89<`Dy?y*Y%IEAI z!C|2ws*WodS6O>J8(P?(8l&r}6DWlVJchQ8OV!ne`CHOk{ z;UYJ#9*I8Q^NSBIigA`IZkMht){!~;pc~3h5CDZ@p^iD*V%tc$BVrK)Sv0?N=xalz zsOOD7-WxYR_6semwAd&n3-KtJirkOk&mR3^ud&lma)SPBqX|HBVZl2qQ=L88)SvYY z#t$aGHfg0Xb5(CBN!=Wg$-e#iH-lek_IIvJHIYHYy6~QTAz;+!xI;Q0XqvA-K24W; z>e5%3tr8kk0zGn#TTI@)w>z@Fd*|DOtJmeKBKNkj4S483;nt!Y@>Q`TJ1#!Q`Qq2V z&+n>&*D4drzV6Y%uGPA8kKL^LN8EXD01z9^k?nS!Q1REiJkwGFJznW~)}LRPKUf-h z@#0SOJ+i!T>?l+0!*Sca)sF}8%HJq}VF;X{io0zeC*}8^t$_L|lT;9rCi7n$yNoS7IwR8g!U1hG`h=<*9QI#9 z5vhOZL5kM9_;pbd_Gu*1e78uf$oUqU1A)0Wwde)O9l7UkAO9yp&IsExj7Ve{BS}Br+5-%i(0N34En_Es0q;1ztaj{3o)72A^%~ zcpvEmg8~^ph2N8Uw9oH9Bu*EPV;TClo^&(X5QFc#qJNqFoJ=|f-t&YAv}5HI&7;z; zzpOPfYr*YJZm|iv0Y&_e1OW3n_9aG4h?i?-^q2ud4J`ZmISz1X+1vHcX};{{_Nop4 z29#vjR6X?zBa-x0MA_(Y_NnjT=RY2h$dZOt4PZiWLgEGo^6fBAD1UT44RKk$Pf_nb zwDhY8O4xgyt*6?@_Q7IVLEqopz5!KVqB%8TOCT*p;O40YdNrQv(OboWSvjU|9gXv} zQzY4x?R5{1-U=SuJuJU*E$4f$v?PVJq`3Xcd{9In1d_eHXnf|0EWw{qHbo^&-x*2! z>CgDQU`}g)|1RbHtt-u?R3q*jpoq6qXeC4d%9CI@y?UJO^024Zg1&0GU%_#=@-II- z>A`w$8GI4CBvm8zJs?=s!|qWxag$(*OhR)@_xy2Wi5MmDwu8e8_8Ut;_MEiWI!~R9 zjQ_^EybPHCrqiXHj=7AMYga&36kzPuhc<{%2R;#lo+v*mO>Y`*mQO2M%1nuUx1vng z6y=Xptl!_7r|jSGv~lT*sE2+|WyrUWXEy8ZOvXNbHjBz? zBKdMVK(tVJLk>d@@2J+>`rjz@MPx1V zgcSP0wC8bvUrxKx??kLtvXWA8Q)SZyX;&=E>s8)7K zNE=Wc(Va<*%nl@3cSLZTNvqIYrMnpG=qlk$%O4Fo0-=x3&k)>qP*!IY60fDz5y(p3 zVR8CF-MXxUPwnFlN_ex?pdxdWs3NLY8#t~o*hc`4??gM{J&7WnfL8e-F)B3tn z_s()Zm@R2}3T-r>K;-uAiJS8TVeoj@*84^6Q?|v~|FvIQ4hZrn2-1Kn1pqT~F66IE zzxe*`%J5iku}?xoMJzuVnG}SOTWwhOs;X@4JF3#!7}Lm=?Fku0m^bEG`iw;F8o$FZ zpsVykmMfQ3WzD8gMHk+eD2H)@af*I_Y;S!hBQhTa9E|B)x)ao#@?NbEDz^hD7!-}f zC?Z+8uFD2}(u0dMWgC8ce!`6wx_-K!FS%c#VKSpSYR&$CQSZHvLav#y#s#NAsWj+is|j z|D$pDR12DIjnfg#sw|~TuFEyZW}O)1Oz#l=Rai9CiX11A&HOg@Jj?juj&AhKk1Byq zX4cHOWYxgEN%}+mkds|X?-jdKJ79-G`+9DjDTK*bZhR*^?FTF4>||Ouw)^`jF}Jb+ zmzJ}}6+WAU9i@&$`!bME#{~e!??wWi8w{KTSUvzV=yv>g^YO|?-w!9+2z7uKt+vu6 z;!VS{q~_(sk@6gAMS(sx5f_CajI3T@xSFB>UGps8+8Pe%K;0@f2|GCQ_|=B(eqJZ>fniYyUo1-c={*1KfJD7`P6>Ar5cAdh z^1tc{V3{h%ZQNVi1r)fR^4M^GLRXLX8P!o{OfW~I`8*mLEVLG_y_WtB2rX!Z{SJaS z%I%O26@?d+m{b=Qlp5XF-0q-2w%`dwVVu{BIYe|WHS$jgBh!p?VkpKQc3yHqq{}(^ z=V(6u!*%bAZ}nI@mhY9YzKCPX62@k@@mlcxpoEKR+Z9E@DwkA;nCLO#qpjzFOj2(! zFUIhoOM+ktgI8PhDtIMsi6uS0t9&i`k>KF_==>dUk7cM0aM6Svvv3vjxDv;m&*ub) zIuUd zdD>3p7Y5~e0NYWo!7|hy+PlPe=A~zF+P~1Dr>uEBrom54Hw{twN|#?>`AjeV^saQI zUwIPe^At%0LJDI#-)gy?kD&_CV|KjZ0IQzi`0f=dr$+R)KmKc={REVO-9!4cJh>$Mi(YE(4;H)`2?>=`2;(0B;7R5W_d6c z)_q2vEe$vLDs5QMx^Zo&v9u?l{2tLano}_jH4(x{{D^2#AWsZz#Cq3~BDxT93BbYg z>1oc5Si-OGfm%yhpOebn78VxfgumItnlaKQB7#4I7=#FF44k+UyYN;NeuV=zZ3e)m zfQ_na+xqF5E|nH;QoiDBB$T*8V?6R9u&p;+99&mapHl6!p2VStt{Qh70XyuNM5+^k zvd1B;YVbzmClFZXqtrWu_RLvozxKqHMJav#L!GH7U?+X;ug`+8L0eSE%JO9a4%8%& zZFi`4Y=IG<*NAQmXAhRd!X6P5#^vwOO!LbcSkJ=<2n6z^aiJ&-1kuIAssgJF#JX6# zgp0a{6&4rm$7~+n9zZ{tI3O_ii+X+hlv|kUk#1`r3H=l~PUQ)PYN%9@g0{{`Od)lS z_I7+Bliy&w!S^Dfhc5r92_m||<0Q1p$#}z;5!ml)wT?YSGJzBjz+a6)>!h>!0wME>|_lP^a*Do|%W>1?H$*jw006s$JvqP`S_PCMFaBW&EPQvA407uy3gFGAA8!=QcR2OrtB? zB+T&+ZaPw%pxkGbpbaA&-rC~2AF?OH!axhz&9tQVD{U{`=k)wp(lr3^`YNUc*7lmD-a-4 zmC$DKj$H-CEAl8-@-v|8y_kp}pttDmIt4Pk^zk zzrx0zNgm63&r?JRB==ULlzY(aEBt+ohNaF)*V&R+ZW>jdIs!Rp@7^4)v{h{fTgt9# zw>hgm!+{%{ka!;}L2%qFj*Qg%-QWB!`9AN759;Y80U)5(m(Q!B^Z5!D$Mrg<<6r(H zE{R!Wj=*dl2e2{%sXoyc$`_I!aFC&OkvgsvKt>4t68E$4vi+yLM#%FxqD2nl*A!Zp zk`wnX{v;HM|iEDIR zn?ghpts-aqd_G?RLhT%GO=1B-tOUln?x`Iya4l5O{iCF3Js;)gE~ zncza!wK>n}s)iEtf$Mc;bJ%e5uI4J$USUI{_W6Z85tpa_V7m1y&7Yr5vy9|3cyTQc z@;}7hM(X~kHY;|vjzgJ z41cJ2WcGVYvIe99h-0Ly6|mgs;MUU$rFWcNy;n zW$l)BDhLfHkvZqFbIU-*Wd0*!ssrkO>7freU+rSe<*KdILl%TDeiQ;>PJ7?CYJUGx ziodx@?ULf@5stKSqpgSpwdycs9e93o;Z(-Q;hsAr&V*dbXuXL?4u#H7KY zCyapl@@$W^eG1xt!}YiIE8E=a)bbpi>LoAB(=C1vvU8{`D?_Lm30_|SG%_UlCEMk# zBWMmdsrHF*R-xLsq+_0Qs^ClMigyuJ^1lI3sAihp&H%K-M=C=u&}UgV?pGd>wkFxVSVZXs>f090r(ht-kO~ z5Ph*Y+pH_kotx%uAzH|NKEd-p8onH29H)Q294ve1h}_y;xAA~m&(E$%f8&&qeP>j7 zR6uyi)6@H>i)e`=#(-(1UYilc%kNB+qLXLeeN3eC0o9L=L??h7x{rV%qOBcqq=nnz zZ;Ej?6LtClJP9x4%WTNB*1)A)D6N>qz_m zkH)1-VPK{x|7IG~aF_B=+Qwx)#b<#RenWFgn|>7pw;j(?mhAu(WUhPPtvm34H1`Uu zv!7hgO>SS~=Vx9!Tnit*&@$?bn)j^A=s`kH7B!*h6>qtCC7y(f4+Ll|%nNkpTt*%( zejBoT6U@U4V)B+~Q1g&0L(C!oY~YXpNwx9pJ_*A>bAGwB9T`by7>bN{fVfo45-zCq zCEkXWOBP4!@u+(7Ur_>u1X8o>zeA{e_LNWzsa+>Rrp#RW=EJVfkaN9Oj>lJt*#{>3VUV2=gX` zK+!wlBR^w8JT6`=@w;1|k(RFG2_prB><_tXV4$Sh5qY+wf|T3y;uMS z&y@aHXA2yM!_JLie5wRlY&3Jtttgh^i4fUInF8#8N!@h@5p_6EDt+=)$pOiz2>*AX z%2$fr!OoHXrGYmg{oWO(TpF_iUv?M&MBBQ#bJPvECF;KJcY z{jo1+bQhYh+9Qr)&j-@=LW7&bs;bBgaNG(3fi#~+;v(o0#ggK^@!)S?%H>mSaXx8f z`kJqpH?`F4dnE^6*=c0w%XTY;BHIO(5Dh5LvzgGBqwcPms(()ZFcRS!$_&!RUwFXp z;F7B2-hCCKh+`s|(7BIZH?2?a$zH$$6-LRQ=c27i>25p)Z!>>W90;4N*GEM}xn5tk zUu2NhGeIM>DTGDi@vv@n&6s76A-S?R>wLYm3FoogK|~IXxC!U;v<@?y7wfT)FG^MB znCze{;LXS^q`X$#R;_p&p(ptan8s9TH|ghpo6+v)iF>k6oD{U*PaQCf&w{G$R&dKeF!AbPzIS zG-;9j(HvNp_lY4#DzwlL|i>q#uc-sOAi99%OB@e9a z&!IyDiJ_s8nTMNp31!l=6%)>Wg_k+#G%YC`>u&dN4^Pg+Bet(+Elh50pij=OwW9v+ z0C6l_GGDTP^*JZy-Q<12_*=BYV38rc$IZqWQuN{M9c_MC9WdK`k3+j8hJwN>5mc=M zz)$(#1j@0Zi=A*SCP4*0c9BkY?{SpZdLHLBBi=r>@_M{0>Vz1vOxIztx&Txl=KuV{ zcE;N)5~b3`+blJ067|yfUn_xxU7dVB<1Ie=lHL?)X=O;6SI^`>tN}{b9jBw7M!nYQkM%C9+^VV~QU%vF0)isc>kA@=VoKba+p`tz;D#`{+&{MhiNdeb z;{0qff-DY9Dz#~p*Y+}67APwAJv&g_D^qAdIZ6)Y-18P@ANA)+7b<0$xh>oGX7SQ@ z;U){|hu*Yb3kfu-M$Z6Y;H+bWMuQApTjw6K0l99IWO%MM$FRgYYJa`ylDZI+Xu?MQ zuf*LXpKtuBkuUQzE2Q>438l!bjjnoG+ylq82FUk$A{(W2RZ_Q{nf(d#Yki3^5jVH^ zoJ~dxpvIGWhi7Xgek>nayY0QrGtq+7&#`ILBy%<0YzUEL9jDD93c zRx-I6Z1*ZsYQq3>W%RDR37n~GMCUn=V5HH7z-gX!fr-ciRr(wm z>f7Want7$y=l3mdUqQ-p<6Ao1$cxCzY0Z>BLqj}z?KNduZGND&IYQjX(!yt zt<7rk3DJ3%E-Pri7#_#bKHJ#n?A|>CNM$V!&@WadZ+1|y60}Y|3d8IA;o2}rIw-?% z^62HuF+{OKF-W>F{qLvt&nLW`KRO(W6w&aU{Qa{OYJme4=@$yM%USPGVH=tgo@9QP zx%@S0)2rk@Yu?hGrm+vx*{t)}{4KDVx{Tar7?n?~Z109GR<08&TU@gKwCxC=_U$#h z@s4zfOM?EEO}R9)$%j?9*I&6I`n)3258cxJnt^kFbpal>Ee0luMeJ9!g_hQ>TY=QY z=0-Wwq{{k4p>N#vUD(z1ov1)v42Z{{~>A{R>JKQmf* zmz%F}$;Ywprv%v#Lf@wQs;%u`394o3f{$l-PuoLKfl!MBqGQ>v2}s4|{6DE}QWv>DjQng{3Wj#91t{b~mxb6h(kz)X+ zXvb7ag#%?paoJDl8N+pgR7p0m4bjsgXyp{PdvjBG5f3~*Hmb0l|a zao9M%^*4c`%Iz59_8tbz4csa|RHG4kboQ$2=e3t?QPpE+>df=*ez$8I?4-1mO3xF0 zTP@1!mqB5`4||ZJJK1+gMGK`cNGEMwD}KvKuMzEyf6F)h(&=RI)x52W<-RK%+1Iq9QNY~G0c;ec^_>RRJ=mtRm}QljPRxmO(kLmm+mfD#cj>p`Nd zy1G9fYq12;Z>CcBMJHbMiA_(@dR-NIvnQ~vruf^tQ#1bzW8z5-`_PSo=n*6Bs6zYf zPD3T`;JQXh_uu|gmw+@I$DfQLkR0BxsFMijxY_?`BKkt85$X{Di1aKu$%^|*N=7o8 zj%pA@XU)!QO)OmV=}NbIw-N)VmQ3T(BOr;OhEfdmCh+n+rO`08Wj2vf>98A$FR!uc z3^b*WW@_C{^3k5A$uPp1VDJ&pivjlJ^GKBwa=%uq($tp9*C_#fmcEK~RLG~82*l+} z7ql%Lln-xItWMk6Rhb)nR)NaMkaGA;^K72Pca45IVtYK=-^d*GbtJs`dm4xLl!4R| z##CL-V8_#QTk7;rUHvKY1c}2ab85_J$@0|j62JT0<OI{fp4pWrc>JvS@cH^^F(iY#wK$a zmhv2?z6y4|?nJE0h0J2oB;Sla5r0Sp~?G1<%hT1-Peq+iO)^*ieBdF z>3x)&A+3tx7LBeQ>HUh1T$TY?E)Y`dk;XaDjX8eMIkiNy9#+!6zI1*h**~O@%j)$a z5695BWMn)?POaL9f>6~3K}SG;vToKKy*KV7Fhlob4S&FK=7Bi<8FzstdfTtcFI5T; z1CqP}Gd=)*2|0$My$4LSrecNlRyhgD2_J*5acVpAFl0>)CLdm%(2+8OcO!OosGhJd z^`GB$;@_tJF+RZ&jBnYW=!X&xI2b$lmN{&eC-Sd{T2K6irXqIUHQ6)f*M zD-&}{$3+KQn-g;EMvtpunN`R&$zDgL3!>EwAXhC_Ebd*(nh(vDg}L)UUEqe5f?5*E zX|6nJya~&^9K3wZf_y&y?KicF{%4;ilvD4XY{B5DLuxBi?SJj*gPTgJ_oF(q(h33l z{-vmtV4pg1Hu!dz4||aFfUtV#Lmroe{vH3=bcs8o-9fFdzSr`X zar*fvnECgXss}nAXzn3>BCzU2(&Y_NgRE!Dzd@p}8a0W`e%$-ly01>AfV!b(qmD@P zE!M3N2y`p5JgmYoTQ|8)rSzJntB{kLfdsFJkAL))ujzJlqWcYNCnx8~C!JxQlu&m? zPTaK>XHB!kA5B9h7nhv=kE1J(XZrE~b60N35rrt_KFX1Dq#OxdBG=>=o7-}2B4^GO za#u(tXBdW&Fn76zZAQ$IGYp$;-{1T5`^SGCHrxAkJYUaa#h3H16|0JH4B=6P&x|u^ z>VKfmB;{Po?UiZ_P;)e3&2M`yev5zN`uN)tFJ3fG;v7-x>-m-CzbC%5)}yF!ecOp# z&#i*h>H}sYvq3S5Y&KJ#W#}9SUvnDKs^N(YZchdqeyRweQI1PU>$DHS&;Rqa9>d&n z3lri9i8X_2Hj+{AlID~I1~0bs`>0th+b->zaOkxIwYlaTs>PwPu%D^=l?!M5=yv^dQMIKUf_(`Lyl$T6~jy zNpn0=>(4)kCyQ`&??59(&Lnr_@8d8Zl*UiE*=^>VP0Lkkdfc{_OEotOnAttx zFGRwMXL>FD$&kivY6c44O7my>V!JeM1VOwHuRQwBV;gX>7Hb^UV{M`{zqjXdW|zt! zO`<7$+f_}#l#Fu&TTfM239ZFCpz@#xL8EfdH?=Jvhxc4474c6s%LSBQmgeC&&IyRu`w@YMQJ6C}jv4?b5abmGjX1Av5C z&&(kuHB60y*SCKSsJ2Gt>l6^96j#7@jp<#;iY`2{1IQednTycFA#a=(ET%Y*LoBuN7i5H zhdQM+Zxl5GPuCh}ksg}3Mx{kBDJ#Z2oxBjL7bnjVmU~6UWdY?SQ5&3DMzJrTIs?ay zPn9&vnFBnc?O8KVL28A{#VYto`1jcn`L!f55;2h@+u?~quLDHZo!lu`PxmP z8ng2pJmdzy%njsdseK{t-Tb+gEYo$v#6ox={_54uDqO!oA8kT)@4w6a%iouB=NTuq zCa?L>EnehtS^ct}38A<+`V~AbJS`VKvcP_Cnw@j;YI}jd336}!$bWXuX&}-sr+o`> zD2R_FNj?uSy;vRRQSric@YAr$xx=9{ouSsE(L9*6i@uxqZ9I0<@{u_h)(FJE(N9F{ z;j2i*ijv@xaUlt!=isr`&byU1l&I~Se!023=BmSTNKuu43dk`Y5tr*ApZ@l$L%9YZ zlJSR6yGX`=%!}NbFExvi(R!BuE`4nEJ2(tub;%jWSDJGC`Is%#Bhli{*BwYq8%63n zK5U;Fom^k9Ay0=j0MR%o%&2iz3M_%Fa@HmFX}zhQHk2%^t-u8}Rs&sO%YsYc5J!>G zKZ#*<$euY|NtSat{9ac+ad~z)MlRszpWA~m;zrbWT9e{p!>8tot^t^vY99?C2N0}f zs-VTc-P3LOo32=FChrxMzr)_jqRSssW%I!+{GOqFyk%46O<8P@_8J67%^4^LAzrzmJX|P+zI3lofgUiE2{r(5SgxmF@ zWa6;w&*Gk0{kdSWT? z!{e8}&W3<-xw-RFrQ2ji6gq9s>9)pCn|shR(PB*+63fzw>@g>0lGev^j!DCZ`*aCF zgat&VFe0HmfP%(5s!~(^zW!E^oLAcPgOco~7`0n5a5w9Jz|0I*-Q@x>2-qJ(x#FiM zvgXVK&u-=IUBYHRx%OyT^2A$?P91zqsU%0!HVywzf?~_Wlqn*`%w?1|f`UNuVr&W$ zY0cd=w=~){t$$?=k-XfA=Xna;?eJXCyAU51S56bHEy)_LLYHwGhO*8y0`6Bp3%Y8w za&NTmQ80Ee)^NnCE2gL8P9IlRZTgac$QtCZJ;gqPmKy#0&Q+amAvTEr))|68!d4(s zM`!f?;{s=A#0tR~fm<@-#(s9cuT_#Yom$QJD?q$yKXu+fZx%g|J?cwovj$svUL}0VjV#9!8`eYw^t33-(U!zE6ti>Z>2K1B zZzVf7=lS&4u(CJ#gXz)_YW$D<4c53QfLJN&b@M>lt$k|3!A56*L6UpW z{%R8wQ~eP|*S2CHYBD*!XBwUBx+IMf~rp^L*a2GH)8%Hz;TwKbzb1}0p z2LAB<%fgsWX|AKh4)cwWC$`Q1-J@zKzcPmXdb#zemoMCbdG7w<3P@3%i^__Hz2}nr zmvdEd`{<^Dr7;~-!GOn+eWW-|2zEPQsl|y9k0q8Kc|>k5U7KL%tHg-tf5`vMy~&o}Bc|HYSE8=5>NtFfNdqBpp1KT|)w# z=_`KSor?s@f8vGo1S;}-*ZWbVl%5F7@@v&U^TVtO0M4CqZE*Xl$Cs%HW+*qaT=i3GD53 zU^<$2pc$3d>CftSlTxq6t=tH$WT}7MnVp14pY5}o63dn2DI(*Mf zP7;%&y6m#>7;(X@=J_~J_68ykz$ zV$l5Z>j?c(Alp**cgQ}#sHI%+O|&~Fyr)Gxl2e%+Ih`Xu7@XB>#yk43-@A$tHqMmP zx293~bMB<;l)e?b^sBRi=Y3pE5K*tb*nG)7)EXcTI&oB^WNxb}V8^wtE4f6~s}4Ct zLVv_%{Lz&RS+$=!^!GnHCsKnNPF#OK6j$`kDW!Co-d8_t*S$J*ypM7KD*Sr@Xjo`)O1<`mw@rZjZi_dq;s&cBG)e7saq#G* zcdJ1=6|yH~T>>xmc=w}}bzI?pAn|m=txRL9ks1nFq30X%uA>~ZkN@hZ-q;YjdF}SriCAhWSEZsqXPt}TeYrrU-lfa zBV4&%4_h3!E;j4VgI)~Gvl{VwcTkSP?86z0YkSOw4d=_1@#>pU{X4D$@a-MZ#bUne zC}&LzK%Zh6x{m_tG4i=+*CKgQrZ#}{#2n1a->J;az>q@}pny2Fb#;({6{L!@Elnft z#yk^P zGF{mukvc2vsem;G@Fn~o$bv>?-E(5PXXyyU5}q}E*HY_K1a8B@GZ8D|Sjn;95vdWJ z$K86Id_kwATFu|ANaP;b78`bTikC(sYPzlW&X8OSUqM|{u;vez+*_N%B){-x%O6*; zj96RQ0Nhp5J72PYH^3gmzD4C{p$3A^d|%HVzzmu7ai{Ywq=IyxGm9~wN_M(1R0erX zs^7zgMdNzlA>1l22;C}jvy;8pmfsq@z9f}FH-M5RQ?^x4B_|7?qhH}hbH6=h7gWl2 zbFY8v^lzqbbo8xRV7QKBgs=Z%OFU@|_>J@+x@Zn01{%)~>CFr<9)&|P%el##L&nJ*}0G}Rc8EQ0F_+Gql zUb*V>mEf0+3FJFVZUlFiv)0?T`=|=U+TTolD1ax!j)Y5F^RyH?ek!+EOI=x1ZA|B! zn-+Jzp5g!lQZquSTtHa_2g=@^)(|gRQtg^eluviuJ(aN_t}`lqKCvI5i#WhL+}6mm zfCJ-}Eb^)NNl&C<^XNO6+b1=)O}m7EG8d>`(4Cu44*uq#Nfi8ha7DBVW&u+@b-p?* zL!E?`3OC``!QSFdjeP;tcV-pP{fcptq5$)cB?n-$J`BJ2%mpM^DeZaV3s2xguf8jn ze$1=C=A1bl1qY)22=F-2XCyzu0$vifB<}0Vv%Nuaj0l9xs&NOkus_7q43KaI&5()g zcj{PE;`t@lpUi&=h!?`hN1soH?{Az41Ee_oM|N5OSa#E(X2MAEwz&?3I#4(7a{h&@ zp;YpyV_biQ6UI3PQ`G^azb)PMvR1l`&CHR&v?l5pTDXP8Wk#eEPF=4I!+=XhcPW6~ z0$(fe+U*6m?M8E4p9;jq?QY*PmV^>u>XLi7&vK9HD1h8qt*DLO{0=NQMxE%qEIW;_ zngR~&UsnP~HeyeLSPok#a<7*$^YE9E1_1RXODJLXDW`e=EnV4d_l$y=2$v_UxsYOq+h42C%szZ-Q^uaaqluPtKQ|wUwUNxSj-F&(rwAP%Bf15zp+U z!GM1PZC?!ej%Z@Br6EH^>xwHlEO+^BIR?JTUPBJsAHxCvhns8=p>Y}$!|F0tZ=m#A z(92^)Rt2b2qq{ARXV|vp>z0;k&~yy{-&LV);Nx@Z`<8Z@Wyv)~BGxYHrP9;KP(7o+ z)AJO$z?_=3SsFmGcC)Cz%XAZ&(~2h>@0G0%sJigim+qy=Wk}pw^gk64JhPXuYB+zsqA{uHfagda<}elM`2Sb4Qj?H7gyj zt4rR?mRU{V1jCWCAosK%{UU~|L4y~xOnDPzPw1{f56pcLdr}Zc&3?n?s>$&MsW!J| zcj4LVm$kF9)EyquJ3lcGRD<)ID4N(G}c_AsXkqdrE^qH z|4J2%L_5Y*znndE!c>=BvTvNY#;dx!+9VomZ)P@aCw1Ym?QEwW7wDCQ zde;}k7_j^p9LXM&s!3B*$4S-I(CX@?wzi_`ZIyE#Eyd9t?n7Z);pa8J_SEfNpWiKu zqJla)oSmZ$)F#7g6d{Ka*Rw|xuE}~rLLy20Ls=%dV-C-`o_sGhB6Bt;%#x*B8^V^} ziG+9RQe$L%%8I5sN~Q|lz#`W@!PeYs+7EhXtzTaa|1?{%k)Kak6P2m`)^$GA*Uvo@ z5urig2~*1H2P|d|SM~iLP|m!#8Re zb`nlonE3;xex4>d<51q7QY|s%A)(IBb44OfUyaFOlKZ{Z!zLx;_Kd;zo4#u}pj**? z4docR>m{A~$|^Q0_5(5t3vtUVqfZmwv&32a0|M*b9A(>R%gZYDgt=O#=&unRivvvf zo$@-j?*Qu-qC25v$Dq3B`*{JS6njG!88a4P2usI55a0kW7(SD|`fVm$ZpM~%s+)%}8rw1;Gzt(7S zkJ1!cMAorNN^lIjKgCRFw2|5hfw#O-D%%w=I;<5J(rUoUZ(dIsH#6^ zb!f6I#cEifAsu^lARa5D&uFl!YWFathI%@zp*0fr#0fLc=zXqfnisa9N!Gf4*IM6B zuO%wzXd}R<0$#Jjh~OK0}5ob}%k;Gx(n zLQhDtS}VO_b=11P!JLK1Jhgo{gR`u*Evhip-FRorr`EHFq7aQcAhVAN9E{nnqKeqF zu&^Na=Dv&R8vKS=3{;P99&FN*!9eobk~-4dO2!j;gZHy!cGxVbt(PwQ=CClv^z$QZ zN%U1_cI!c{19}gbl-H?QvKl7^e`gm3Ni-X1+YpRQL9zUL3BfTMss*?X(hkCi1a3XR z`43LS|4fuQ^X|)ymuUIr`8^cOHFz)jmo8^H9`H0+r*}01UopGD2mOd#SMs3%Xem`v zr~7n_0eW0MwtJ1XM&<12hz9Vl#99HQ;`OUpy<*I5W$DpjB;R&+tv2LYqcBvr*ZViH zlqv&*Z7pter+$1C5JR&(7L-wf&&&FrL)WjYEV8?Ak^jBP^!Xp??g6uEt@aqyw7oIVQ)M3vD zhR(#}#0qO*%KaZmM*gI5AbZYJ@%nL-e_s`JJUf$7$c4B61AV(G#>3Y2@!^cJ5^pGQ zm$!$@I2h zJ9|9&qovzxwVh{uYnni0`HHeeZ!?Q9>UxUwcKBw;zq*kxV`^6OpKkTN(CyWyj_9SI z1i$slKcB&rsG-IKb5J6sg3=<#f8i?96cy3Iw-LavtBB4@Pn7l6nV)DvGhtLP?eFVss;^05Wt7HdS>oJZJT6bYs_!+(Ng5NVYSwD|-P1%H~wD()w z>HNc~50+a2yGR{FPw#aKaVw+a0rli>zX}>hoI)SsoBxhbRY#c z>NxtRLRjVXs8zM0K2R*)L~2>guOv6s?aS~v%Br&JA;ou_p7fGi!n`HxXj(X{jjaD< zkd;MJVLq_fgyqqHPA-|GP%nn>u8hx|-R6Rfh+0ox7gMR)B8mV3)^8U!o>Mmsq}Kgq zd?RNN;0r@RO3$1QEEDh&N`*Cwd8d|K&cDXWZl&^^F{n9$Xmf)By-@!vA?D>nL(fF%S)2#yZChmJ}c{5^hKj3!}fpe0lB z7+py0Rc-d+)P$G$Y6Wj)p#?Iv4`%o@W6WfEQ_fETJuqboH|ooL71{LpNs{O7JLcK~ zk6FvUs=yBd%m7P|`4Hh_Cxp}fMzXp8I%%KTbfTAYyjMMuw=r;+0_nVbGb6aDnSK5+ z`x`R?vNnO3D$1oWT{Tr;8W%qI%04~&@aJaVyN#fkQP6p7$soXTv&JSAWxY}8q>ftEc191tGfQK_AH^$l zFZ)wH`R4*GMdxP2RWUWWmQdcmRTU*p%q@(1N-2*!yO0`^OA%EZ1Ox@l3u%4k2K06d zVBdW>ILV*{xJZ@E%a9t8CbKMrfY*)qx?p60UQ9QPJ#bk2(j+jv?Gw(RrfBQHcZH?l z6&8<@=PhZA5Rpi~A0j^bY?yx%Ma3^2&~In zF>gEC56ug1MN|xjGL-CpU6sR?wfcl^^B;xHO&VJSRzK%|j!aZOMw?}M=C3X;DvHn(rRgUw%~I_j7z;TzSbptmLyX#N+IhU82ALlQV4^ zb$ZVd46Ns~q}cYDWE=uXf}k zx}S$rHYw!&;~Hr7HdM^Lojiei1G1ohSjl_mFHgp&YU{uCuELjR=k8Jl8qzW+6CzThWou+j24~qucseTP)nzXn|pPC zK?KK>PiK%^IzgPa()!cAYao@G{+Y~~QTbCh^>a5cHRuYrI?GFddkX?a3H&)eojQJeOQqjI|4hZIxZ_SH*mJ65)GT3o~#P3OVU)Z zMACfRpw3@Y`?USdbtWRh6=JduBsPuHTFNdy91$$OIW!!oS?A;7sf^T*9%xy}GGAJJ z6MGi2iDtIn07@dZu~o$>bd$v7!=DW2s71xs-#92tOtsj1mnn48soVXY1#d;L>hP~g z-+^4`QQDZjJu}uERe1=(09RDp%CDy$NS|V}4-KfH=N}cHHHp2lXmrT++m=M)^U~+} zh=Vp>DxNj%m~%};gnfZ2@vb(+8#fAe#xe6G?_Zo;9FAVPjA~*dKTf%1lqr6}z~}>wxgoUbIq+2cae-Yz?x*$oVP@W!=hq4R9;Zwt1B^YE%1m@h10D|z8Gj<8 zImz<6Umy5ffpz55p015I-)XFv0qd9G5XM48dF_YTx-#gmI;44_ocfQ_%oK-Z-n1{V zcTti&`4)4L(Z~4qjYe?NbF_m4qNIZIK|AlPayc&ZtXP?Q>_i=7DM`Cu?kKZv>0e<2 zNan|$y<)`EknP`pTi4b;QzAm@C;cO-h}=03?9`B?2@mYifE{wd`{>|}G^-k3BbH_F`}wXUm#=D^ znh$Yv#Dj5o1`RD!)(DwF(I|9fDo=w2`lQiqMQOG{x6A(nnQ}c->QrNcaq)EWMNUKx ztSNR(k(j(S(9&7lcWcN#-C&_%%l?WmDw93dAv~&Zu4v}8`CB)o=aRyDT1%4iiY0GT zPo>&E9;Y0)0#`$j3Xru^RkI8HTFTj~1~ujOfx88S*xw(hHm13axRu`V&Ro6li=fU+ z*=DmNqsxbs@#T(Nht*pR{s=Ix<*d0JOc1;JyVO`TKTNUh?pG;Qirka7z zZ$`|Klu|uAux3@24$@Mv~_RSEr^i>Aa--bNB9)Wi}*+1PS*Y+ubL)d?wBnwXPvl zAD^9_1;$=LL8@SWtvfO6ttn3s9;%*q{!*rZk(ZZ5CS|snv26EM<)kGk1m$ZHV#Uy2 zTYh<|!F+4GsesPhmW57@4LEV#Z!1tIT&gR#pTY7`AI?QaeyRSbMs3bcPSNtuHc8hzl@rXt;mBR$*ZJ)X{xYBgTWYN9)4N&ZKn zdz&u!Q3r#+J<&!&lP)2@tt)+@`cz*{Y8yx?V+ z2r#+nWk}QaT}-q-TnhFbxZe!?G7woGXz$|?#o#-W>dQRFuRZ$UIHp%2dsDDDJVc}tWV&9QJ0liLh z;g)lYyfVHOy-S&zb9%&yhe7;W=@`C}m(DtFf$AwbKepsdm;IZteWtCG0@j48pH{{FZX;@7B_kBI0*9@9nqI zHb@swxJT*jvdypQxrnKf7uud^FpZjbXe+7-MBy$w9dqvL2&x#$A248ki1|3NTv=o5eCRN0pZMxqL7>f%X>dh-|V$@2(j|CC-CD9mpfa|7aqeQiePpJu&@=Q?~Pa-I> zq3CD>l`;+ds4whV%S?y2*~_@_torZjdp55U^)mHX4si-?MKk`^qvdT~QH<-1gKfYw zB|||i3HENz^5YV{U^@34;H@A06B51$XdBa?0SgyDafGuefRX+ zPp`+wB_`b0%+W&^b}#SaY5OqIQA>jw)gy?hz4NG>rnQgaNm-s7gu)HIJ>Zc3&P%UL zXGC-4j^m|8a{JicI>XPqZ1JmajkW4}-9_S0m|Al2AJ0~#>E8PgywC@wuCc`-*Nx%A zAKj+{<6^zv7Fam^Md2zc7N6;A`}Q|}BH>otBF$cRr9^ zp(1bW#d1id1o(o?GN0D@@MrN~GcJ}~+xFc?l~0vd+i=O%kjfkJPO4QS3T~2aoC|{T zVeF~jWkEf5F+WWu0{5WLP|72Br=a)<2k?4LFgM!ic>^7BhT*N$h13gw7NV0Zll`C@ z5<)NzSfctP2gIPd#2^368Nh^9F#rHAbKB8UltXy?$tR|1_nF(l^g-c*T=~yYmGpG} z6P#l~TCqAG=WH8WNz8MsyZGuRDn{mj>=5*|O|PizVo4w$oHm4TOY~=ddo*U=tw}g3uk;lZ>Qojgy?#&vyl9+d&$xTd z8V3Bc-y!d9MwSinK5tusp6$n+{#k1fqkABh_uN+T?9KLTQVvw#<=8pIcZ-7zRqYcq zCa$M?=hJ$AweZdK_rCbcA}a&-#bfAd`##K)IK&kG6o0mB!XS@&S`u1G^v1$>NWuuc~ ztNK3aeXGN11p)ZD5VEa~8+KNWt%EdG6m1Hh{oCpTC|Ca4MZ%D)n^(@>t?be@BgAvm zN=6mG=g9@JWV6e|=Q6xjAbP&5iYl+cEtzwM7t$}gJ^JqXQ~8iAkzMSmhxPR8f7rre z(iv3tJNg>kzvV3a7bN040o(Le)sd1xXAo4 zPmu0o#U@jHLD0AEU=tHK_-!1iN;wj<{+-T_^Z31AC*0F59SZ~^zV6`H3yNWD$%|CG z5h@V?f^L6Mt;$_sIH2e{zsUmIa@Nb4@5Pp9HBK#U$gRk31sNof`7A|HcMicFm}R+x z@f{RhV;uZ*;dH$EKlDgS{2r~1_tC8)=PHl52irWf6%5hvM0uW923KLOc1 z6ql*A1NzPA>l^N(joyo%PtDoCRjynSQiE#=u<>?h5qE;Zho#^+ynpU0|0Luqip21z z-IdjBAD)ozm5m#Aaexbhz6yVjUFpy{XZ^t3A1IF1^Hrh#CDs`0G4kc9I}(F~dpzH@ z`bBjlGnb0q>4?c@jk10sC3`j#Qc23_zWP7L!GOcbV9)o=vVgvi%gxwWT?9wedD8~x~{W@ zBvj4?%B4%SmYejhiZ-am?69NOJ~7Y{(E~Uo@zLo&_jOO34VCQ*tDG3w(lt=zfw1#& z20NWE*%_rECc7;v&itm(!>F|M+X-PW5rbOD?z9Z zj?$T~YyVv}38Nk9I^@U~D{j#Gx)jp^aSaDwEPA&+E-vfkrg``}VjV@lwtpH^x*JJP zzPjs{cf|7QG^-KCReByz+>h^L|*S`SClw zK3)GjtMJhwhm4Ph4WwOWo�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 Date: Thu, 3 Sep 2026 00:47:37 +0200 Subject: [PATCH 02/56] feat: add ActivityIndicator optimizer --- .../content/docs/configuration/configure.mdx | 1 + apps/docs/content/docs/index.mdx | 2 +- .../content/docs/information/deep-dive.mdx | 17 +- .../content/docs/information/how-it-works.mdx | 6 +- .../information/optimization-coverage.mdx | 9 + apps/example/src/screens/benchmark.tsx | 9 +- .../src/plugin/__tests__/parity/boost.ts | 20 +- .../src/plugin/__tests__/parity/capture.tsx | 1 + .../plugin/__tests__/parity/fuzz/fuzz.test.ts | 40 ++- .../plugin/__tests__/parity/fuzz/generator.ts | 22 +- .../__tests__/parity/fuzz/vocabulary.ts | 23 ++ .../ActivityIndicatorViewNativeComponent.ts | 1 + .../ProgressBarAndroidNativeComponent.ts | 1 + .../__tests__/parity/mocks/StyleSheet.ts | 1 + .../__tests__/parity/mocks/react-native.ts | 13 +- .../plugin/__tests__/parity/parity.test.ts | 47 ++- .../__tests__/parity/vitest.config.parity.mts | 18 ++ .../src/plugin/__tests__/parity/wrapper.ts | 4 + .../react-native-boost/src/plugin/index.ts | 3 + .../__tests__/index.test.ts | 123 ++++++++ .../optimizers/activity-indicator/index.ts | 284 ++++++++++++++++++ .../src/plugin/types/index.ts | 15 +- .../src/runtime/__tests__/index.test.ts | 34 +++ .../runtime/__tests__/mocks/react-native.ts | 1 + .../native-activity-indicator.test.ts | 42 +++ .../components/native-activity-indicator.ts | 20 ++ .../react-native-boost/src/runtime/index.ts | 28 +- .../src/runtime/index.web.ts | 25 +- 28 files changed, 771 insertions(+), 39 deletions(-) create mode 100644 packages/react-native-boost/src/plugin/__tests__/parity/mocks/ActivityIndicatorViewNativeComponent.ts create mode 100644 packages/react-native-boost/src/plugin/__tests__/parity/mocks/ProgressBarAndroidNativeComponent.ts create mode 100644 packages/react-native-boost/src/plugin/optimizers/activity-indicator/__tests__/index.test.ts create mode 100644 packages/react-native-boost/src/plugin/optimizers/activity-indicator/index.ts create mode 100644 packages/react-native-boost/src/runtime/__tests__/native-activity-indicator.test.ts create mode 100644 packages/react-native-boost/src/runtime/components/native-activity-indicator.ts diff --git a/apps/docs/content/docs/configuration/configure.mdx b/apps/docs/content/docs/configuration/configure.mdx index 0399073a..aec268ee 100644 --- a/apps/docs/content/docs/configuration/configure.mdx +++ b/apps/docs/content/docs/configuration/configure.mdx @@ -24,6 +24,7 @@ module.exports = { text: true, view: true, image: true, + activityIndicator: true, }, }, ], diff --git a/apps/docs/content/docs/index.mdx b/apps/docs/content/docs/index.mdx index dda0e607..c017bd8d 100644 --- a/apps/docs/content/docs/index.mdx +++ b/apps/docs/content/docs/index.mdx @@ -9,7 +9,7 @@ import { Tab, Tabs } from 'fumadocs-ui/components/tabs' React Native Boost consists of two pieces: -- A Babel plugin that statically analyzes your source code and replaces safe `Text`, `View`, and `Image` components with their direct native counterparts, leading to significant performance improvements compared to the JS-based wrapper components. +- A Babel plugin that statically analyzes your source code and replaces safe `Text`, `View`, `Image`, and `ActivityIndicator` components with their direct native output, leading to significant performance improvements compared to the JS-based wrapper components. - A runtime package used internally by the plugin for cross-platform-safe imports and helper utilities. The analyzer is intentionally strict and skips any optimizations that may lead to user-facing bugs and behavioral changes. diff --git a/apps/docs/content/docs/information/deep-dive.mdx b/apps/docs/content/docs/information/deep-dive.mdx index a5051067..7ad96917 100644 --- a/apps/docs/content/docs/information/deep-dive.mdx +++ b/apps/docs/content/docs/information/deep-dive.mdx @@ -1,6 +1,6 @@ --- title: Technical Deep Dive -description: A technical tour of the Text and View wrappers, the render-time tax they impose, and how React Native Boost removes it at build time. +description: A technical tour of React Native wrapper overhead and how React Native Boost removes it at build time. --- This page is the long version of [How It Works](/docs/information/how-it-works). It walks through what the @@ -288,7 +288,11 @@ Dynamic values, or `aria-*` state/value groups that the wrapper merges, are rout `Image` source, style, and accessibility props are normalized before Boost swaps the wrapper for `NativeImage`. Static values are processed at build time. Dynamic values use small runtime helpers. -Compared to `Text` and `View`, the host component for `Image` is not imported directly. React Native does not export it through a supported interface, and only exports it through deprecated deep imports which log warnings when used. The plugin therefore registers the `RCTImageView` host directly. +Compared to `Text` and `View`, the host component for `Image` is not imported directly. React Native does not export it through a supported interface, and only exports it through deprecated deep imports which log warnings when used. The runtime loads the public `Image` module to register `RCTImageView`, then renders that registered host directly. + +### ActivityIndicator + +`ActivityIndicator` normally renders an outer `View`, an iOS spinner host or Android `ProgressBarAndroid` wrapper, and then the platform host. Boost emits the outer native `View` and platform host directly. It inlines static defaults, sizes, and styles. Dynamic direct props use small helpers. Similar to `Image`, `ActivityIndicator` is registered manually without a deep import. For the complete matrix of what's optimized, translated, and skipped, see [Coverage & Bailouts](/docs/information/optimization-coverage). @@ -296,11 +300,11 @@ For the complete matrix of what's optimized, translated, and skipped, see ## Inside the plugin The plugin is a single Babel visitor on `JSXOpeningElement`. For each element it runs the `Text`, -`View`, and `Image` optimizers; each follows the same shape. +`View`, `Image`, and `ActivityIndicator` optimizers; each follows the same shape. g{"Resolves to the react-native component?"} + el["JSXOpeningElement (supported component)"] --> g{"Resolves to the react-native component?"} g -- no --> skip["Leave unchanged"] g -- yes --> b{"Does any bailout check fail?"} b -- "yes, and no @boost-force" --> skip @@ -328,7 +332,7 @@ to a string/number; `{maybeJSX()}` is not. ### Ancestor classification -The most intricate check is shared by all three optimizers. Components under a `Text` can need different +The most intricate check is shared by the optimizers. Components under a `Text` can need different host semantics. A nested `Text` uses `RCTVirtualText`, and Android uses a separate inline Image host. Before optimizing, the plugin therefore walks **up** the tree and classifies the ancestor chain as one of: @@ -344,7 +348,7 @@ false-negatives (a regression). The `unknown` case is *often* safe in practice (third-party components rarely wrap children in `Text`), but there are still cases where optimizing components with an `unknown` ancestor could genuinely cause regressions. Therefore, Boost provides explicit opt-in escape hatches: `dangerouslyOptimizeViewWithUnknownAncestors`, -`dangerouslyOptimizeTextWithUnknownAncestors` and `dangerouslyOptimizeImageWithUnknownAncestors` (see [Configuration](/docs/configuration/configure)). +`dangerouslyOptimizeTextWithUnknownAncestors`, `dangerouslyOptimizeImageWithUnknownAncestors`, and `dangerouslyOptimizeActivityIndicatorWithUnknownAncestors` (see [Configuration](/docs/configuration/configure)). ### Rewriting and import injection @@ -359,6 +363,7 @@ API lives on the [Runtime Library](/docs/runtime-library) page. The most load-be - **`NativeText` / `NativeView`** resolve `unstable_NativeText` / `unstable_NativeView` from `react-native` at module load, and **gracefully fall back** to the standard `Text`/`View` on web or any runtime where these exports are missing. - **`NativeImage`** loads React Native's public `Image` module to register its host, then renders the registered `RCTImageView` name directly. Web uses the standard `Image` component. +- **`ActivityIndicator` runtime** registers the platform host through the public module. Small helpers preserve dynamic default, size, and style behavior. Static cases do not call them per render. - **`processTextStyle(style)`** does the same flatten-and-normalize work as the wrapper, with one small difference: it **caches by reference in a `WeakMap`**. When you pass a `StyleSheet.create` reference, the first call flattens it and every later call returns the cached result. The wrapper re-flattens on every render. (Only stable references hit the cache; an inline `style={{โ€ฆ}}` is a fresh reference each render, so it re-flattens either way.) - **`processAccessibilityProps(props)`** mirrors `Text`'s `aria-*` translation, `accessibilityState` merge, `disabled` reconciliation, and platform `accessible` default. It runs only when the element actually has accessibility props. - **`processViewAccessibilityProps(props)`** does the same for `View`'s ARIA cluster (`aria-labelledby` split, live-region mapping, state/value aggregation, `tabIndex` โ†’ `focusable`). diff --git a/apps/docs/content/docs/information/how-it-works.mdx b/apps/docs/content/docs/information/how-it-works.mdx index 5ef257cd..20fdc986 100644 --- a/apps/docs/content/docs/information/how-it-works.mdx +++ b/apps/docs/content/docs/information/how-it-works.mdx @@ -3,7 +3,7 @@ title: How It Works description: Why React Native Boost makes your app faster (the short version). --- -In React Native, `Text`, `View`, and `Image` aren't quite what they appear to be. They look like basic building blocks, but each one is a small JavaScript component that runs **every time it renders**, wrapping a lower-level native component underneath. +In React Native, `Text`, `View`, `Image`, and `ActivityIndicator` aren't quite what they appear to be. They look like basic building blocks, but each one runs JavaScript components **every time it renders**, wrapping lower-level native components underneath. That wrapper is genuinely useful. It handles edge cases and powers conveniences such as accessibility props, style normalization, and Image source processing. But many elements do not need that runtime work, so the wrapper becomes pure overhead. On a busy screen with hundreds of these components, that overhead adds up and starts costing you frames. @@ -11,7 +11,7 @@ React Native Boost removes the wrapper when it isn't needed. ## The one-sentence version -At build time, Boost rewrites `Text`, `View`, and `Image` elements into the native components they were going to render anyway. The work the wrapper used to repeat on every render is either gone completely, or moved from the user's device to build-time. +At build time, Boost rewrites `Text`, `View`, `Image`, and `ActivityIndicator` elements into the native output they were going to render anyway. The work the wrapper used to repeat on every render is either gone completely, or moved from the user's device to build-time. ## A quick before and after @@ -23,7 +23,7 @@ At build time, Boost rewrites `Text`, `View`, and `Image` elements into the nati Hello ``` -`NativeText` is exactly what the `Text` wrapper would have rendered after doing the wrapper work outlines above. Boost just skips the middleman. The defaults the wrapper would have applied are baked in at build time, so what ends up on screen is identical. +`NativeText` is exactly what the `Text` wrapper would have rendered after doing the wrapper work outlined above. Boost just skips the middleman. The defaults the wrapper would have applied are baked in at build time, so what ends up on screen is identical. These optimized components are imported from `react-native-boost/runtime` rather than `react-native` directly. That indirection lets them fall back to the standard components on web and other platforms where the native versions aren't available. diff --git a/apps/docs/content/docs/information/optimization-coverage.mdx b/apps/docs/content/docs/information/optimization-coverage.mdx index b1b1d87d..616d1a26 100644 --- a/apps/docs/content/docs/information/optimization-coverage.mdx +++ b/apps/docs/content/docs/information/optimization-coverage.mdx @@ -12,6 +12,7 @@ React Native Boost is conservative by design. If it cannot prove an optimization | `Text` | Imported from `react-native`, no blacklisted props, primitive children, safe ancestor chain | `contains blacklisted props`, `has Text ancestor`, `has unresolved ancestor and dangerous optimization is disabled`, `has unresolved runtime parent that may render Text`, `contains non-primitive children`, `is a direct child of expo-router Link with asChild` | | `View` | Imported from `react-native`, safe ancestor chain, no spread that may carry a translated prop | `has a spread that may carry a translated prop`, `has both a dynamic id and a nativeID (ambiguous precedence)`, `has Text ancestor`, `has unresolved ancestor and dangerous optimization is disabled` | | `Image` | Imported from `react-native`, native platform known, supported source/style props, safe ancestor chain | `target platform is unknown`, `has a Unistyles style and there is no lean Image host to route to`, `has an unresolved style source that may be a Unistyles style`, `contains unsupported Image props`, `has a spread that may carry Image wrapper props`, `has Text ancestor`, `has unresolved ancestor and dangerous optimization is disabled` | +| `ActivityIndicator` | Imported from `react-native`, native platform known, direct props only, no children, safe ancestor chain | `target platform is unknown`, `has spread props`, `contains children`, `contains an impure prop expression that cannot be safely reordered`, `has Text ancestor`, `has unresolved ancestor and dangerous optimization is disabled` | ## Global Bailouts @@ -120,6 +121,14 @@ source/style/accessibility props can be reproduced safely. In Unistyles mode, an Image is skipped when its `style` is (or may be) a Unistyles style. +## ActivityIndicator Coverage + +The `ActivityIndicator` optimizer replaces the wrapper tree with the same outer native `View` and platform spinner host. It resolves static defaults, built-in or numeric sizes, and static style composition at build time. Dynamic direct props use small runtime helpers. + +It skips elements with spreads, children, impure prop expressions, Unistyles styles, or an unsafe ancestor chain. A spread can change the wrapper's prop precedence. An impure expression could run in a different order after one component expands into two hosts. These cases stay on the React Native wrapper. + +Set `dangerouslyOptimizeActivityIndicatorWithUnknownAncestors: true` to optimize unknown ancestors too. This has the same Text-ancestor risk as the View option. + ## Spread Props: Resolvable vs Unresolvable Unresolvable spread props are treated as unsafe and cause bailouts. diff --git a/apps/example/src/screens/benchmark.tsx b/apps/example/src/screens/benchmark.tsx index 8f732e64..4a3a1c93 100644 --- a/apps/example/src/screens/benchmark.tsx +++ b/apps/example/src/screens/benchmark.tsx @@ -1,4 +1,4 @@ -import { Image, Pressable, StyleSheet, Text, View } from 'react-native'; +import { ActivityIndicator, Image, Pressable, StyleSheet, Text, View } from 'react-native'; import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context'; import { useMemo, useState } from 'react'; import { startMarker } from 'react-native-time-to-render'; @@ -21,6 +21,13 @@ const benchmarks = [ unoptimizedComponent: , optimizedComponent: , }, + { + title: 'ActivityIndicator', + count: 2000, + // @boost-ignore + unoptimizedComponent: , + optimizedComponent: , + }, { title: 'Image', count: 2000, diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/boost.ts b/packages/react-native-boost/src/plugin/__tests__/parity/boost.ts index 2e9bf8ff..60fbe986 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/boost.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/boost.ts @@ -2,7 +2,7 @@ import { transformSync, type TransformCaller } from '@babel/core'; import * as React from 'react'; import boostPlugin from '../../index'; // src/plugin/index.ts โ€” the full Boost plugin import { RUNTIME_MODULE_NAME } from '../../utils/constants'; -import { renderAndCaptureSingle } from './capture'; +import { renderAndCaptureAll, type Capture } from './capture'; import { writeAndImportFresh } from './generated'; import { setPlatformOS, type PlatformOS } from './mocks/Platform'; @@ -24,7 +24,7 @@ interface BoostOptimized { function transformBoostCase(os: PlatformOS, jsxBody: string, preamble = '', runtimeParentIsSafe = true): string { setPlatformOS(os); const source = - `import { Image, Text, View } from 'react-native';\n${preamble}\n` + + `import { ActivityIndicator, Image, Text, View } from 'react-native';\n${preamble}\n` + `export default function Case(){ return ${jsxBody}; }`; const out = transformSync(source, { configFile: false, @@ -56,11 +56,21 @@ export async function captureBoost( jsxBody: string, preamble = '' ): Promise { + const result = await captureBoostHosts(os, jsxBody, preamble); + if (!result.optimized) return result; + if (result.hosts.length !== 1) throw new Error(`Expected one Boost host, received ${result.hosts.length}`); + const { which, props } = result.hosts[0]; + return { optimized: true, which, props }; +} + +export async function captureBoostHosts( + os: PlatformOS, + jsxBody: string, + preamble = '' +): Promise { const code = transformBoostCase(os, jsxBody, preamble); - // Single-element snippet: the runtime import is injected iff that element was optimized. if (!code.includes(RUNTIME_MODULE_NAME)) return { optimized: false }; const mod = await writeAndImportFresh('boost', code); - const { which, props } = renderAndCaptureSingle(React.createElement(mod.default)); - return { optimized: true, which, props }; + return { optimized: true, hosts: renderAndCaptureAll(React.createElement(mod.default)) }; } diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/capture.tsx b/packages/react-native-boost/src/plugin/__tests__/parity/capture.tsx index 01680474..3ecd6b61 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/capture.tsx +++ b/packages/react-native-boost/src/plugin/__tests__/parity/capture.tsx @@ -32,6 +32,7 @@ export const NativeTextCapturer = makeCapturer('NativeText'); export const NativeVirtualTextCapturer = makeCapturer('NativeVirtualText'); export const NativeViewCapturer = makeCapturer('NativeView'); export const NativeImageCapturer = makeCapturer('NativeImage'); +export const NativeActivityIndicatorCapturer = makeCapturer('NativeActivityIndicator'); export const TextInlineImageCapturer = makeCapturer('TextInlineImage'); /** Render an element and return every native host it produced, in render order. */ diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/fuzz/fuzz.test.ts b/packages/react-native-boost/src/plugin/__tests__/parity/fuzz/fuzz.test.ts index ac34a10d..bf77f601 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/fuzz/fuzz.test.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/fuzz/fuzz.test.ts @@ -13,9 +13,12 @@ vi.mock('../../../../runtime/components/native-view', async () => ({ vi.mock('../../../../runtime/components/native-image', async () => ({ NativeImage: (await import('../capture')).NativeImageCapturer, })); +vi.mock('../../../../runtime/components/native-activity-indicator', async () => ({ + NativeActivityIndicator: (await import('../capture')).NativeActivityIndicatorCapturer, +})); -import { captureBoost } from '../boost'; -import { captureWrapper } from '../wrapper'; +import { captureBoostHosts } from '../boost'; +import { captureWrapperHosts } from '../wrapper'; import { normalize, normalizeImage } from '../normalize'; import { reactNativeVersion, type PlatformOS } from '../mocks/Platform'; import { elementSpecArb, platformArb, render, type Tag } from './generator'; @@ -45,26 +48,29 @@ type CaseResult = Skipped | Matched | Diverged; /** * Run one generated case through both oracles. Returns `skipped` when Boost bails (equivalent to the * wrapper by construction), `match` when the optimized output equals the wrapper, or `divergence` with - * the differing keys + both bags. Throws only on a genuine harness error (e.g. a value that makes BOTH - * sides throw, or a wrapper render that is not single-host) โ€” never on a parity difference. + * the differing keys + both bags. Throws only on a genuine harness error, never on a parity difference. */ async function runCase(os: PlatformOS, jsxBody: string, preamble: string): Promise { - const boost = await captureBoost(os, jsxBody, preamble); + const boost = await captureBoostHosts(os, jsxBody, preamble); if (!boost.optimized) return { status: 'skipped' }; - const wrapper = await captureWrapper(os, jsxBody, preamble); - const isImage = boost.which === 'NativeImage' || wrapper.which === 'NativeImage'; - const boostNorm = isImage ? normalizeImage(boost.props, reactNativeVersion.minor) : normalize(boost.props); - const wrapperNorm = isImage ? normalizeImage(wrapper.props, reactNativeVersion.minor) : normalize(wrapper.props); - const keys = divergingKeys(boostNorm, wrapperNorm); + const wrapper = await captureWrapperHosts(os, jsxBody, preamble); + const normalizeHost = (host: (typeof boost.hosts)[number]) => ({ + which: host.which, + props: + host.which === 'NativeImage' ? normalizeImage(host.props, reactNativeVersion.minor) : normalize(host.props), + }); + const boostProps = { hosts: boost.hosts.map(normalizeHost) }; + const wrapperProps = { hosts: wrapper.map(normalizeHost) }; + const keys = divergingKeys(boostProps, wrapperProps); + if (keys.length === 0) return { status: 'match' }; - if (boost.which === wrapper.which && keys.length === 0) return { status: 'match' }; return { status: 'divergence', - whichBoost: boost.which, - whichWrapper: wrapper.which, - boost: boostNorm, - wrapper: wrapperNorm, + whichBoost: boost.hosts.map((host) => host.which).join(' โ†’ '), + whichWrapper: wrapper.map((host) => host.which).join(' โ†’ '), + boost: boostProps, + wrapper: wrapperProps, keys, }; } @@ -90,6 +96,7 @@ describe.skipIf(DISCOVER)('parity fuzzing', () => { let optimized = 0; let skipped = 0; const byTag: Record = { + ActivityIndicator: { optimized: 0, skipped: 0 }, Image: { optimized: 0, skipped: 0 }, Text: { optimized: 0, skipped: 0 }, View: { optimized: 0, skipped: 0 }, @@ -118,6 +125,7 @@ describe.skipIf(DISCOVER)('parity fuzzing', () => { `[fuzz] cases=${total} optimized=${optimized} skipped=${skipped} ` + `optimize-rate=${(rate * 100).toFixed(1)}% elapsed=${elapsed.toFixed(0)}ms ` + `(${(total / (elapsed / 1000)).toFixed(1)} cases/s) ` + + `activity=${byTag.ActivityIndicator.optimized}/${byTag.ActivityIndicator.optimized + byTag.ActivityIndicator.skipped} ` + `image=${byTag.Image.optimized}/${byTag.Image.optimized + byTag.Image.skipped} ` + `text=${byTag.Text.optimized}/${byTag.Text.optimized + byTag.Text.skipped} ` + `view=${byTag.View.optimized}/${byTag.View.optimized + byTag.View.skipped}` @@ -129,6 +137,8 @@ describe.skipIf(DISCOVER)('parity fuzzing', () => { const imageRate = byTag.Image.optimized / imageTotal; expect(imageTotal).toBeGreaterThan(0); expect(imageRate).toBeGreaterThan(0.2); + const activityTotal = byTag.ActivityIndicator.optimized + byTag.ActivityIndicator.skipped; + expect(activityTotal).toBeGreaterThan(0); }, Math.max(30_000, NUM_RUNS * 80) ); diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/fuzz/generator.ts b/packages/react-native-boost/src/plugin/__tests__/parity/fuzz/generator.ts index 1c92191d..5a71b0c2 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/fuzz/generator.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/fuzz/generator.ts @@ -1,5 +1,6 @@ import fc from 'fast-check'; import { + ACTIVITY_INDICATOR_VOCAB, IMAGE_SOURCE_VOCAB, IMAGE_VOCAB, TEXT_VOCAB, @@ -12,7 +13,7 @@ import { // attr, simplify a value, collapse dynamicโ†’static) and the renderer turns it into valid JSX by // construction, so shrinking never explores malformed snippets. -export type Tag = 'Image' | 'Text' | 'View'; +export type Tag = 'ActivityIndicator' | 'Image' | 'Text' | 'View'; /** One attribute: the value's source code, and whether it is inlined or hoisted to a preamble const. */ export interface GenAttr { @@ -135,6 +136,14 @@ const viewSpecArb: fc.Arbitrary = fc.record({ child: fc.constant(null), }); +const activityIndicatorSpecArb: fc.Arbitrary = fc.record({ + tag: fc.constant('ActivityIndicator'), + attrs: attrsArb(ACTIVITY_INDICATOR_VOCAB), + blacklisted: fc.constant(null), + spreads: spreadsArb(ACTIVITY_INDICATOR_VOCAB), + child: fc.constant(null), +}); + const imageSourceArb: fc.Arbitrary = fc .constantFrom(...IMAGE_SOURCE_VOCAB) .chain((spec) => spec.arb.map((code): GenAttr => ({ name: spec.name, code, dynamic: false }))); @@ -147,7 +156,12 @@ const imageSpecArb: fc.Arbitrary = fc.record({ child: fc.constant(null), }); -export const elementSpecArb: fc.Arbitrary = fc.oneof(textSpecArb, viewSpecArb, imageSpecArb); +export const elementSpecArb: fc.Arbitrary = fc.oneof( + activityIndicatorSpecArb, + textSpecArb, + viewSpecArb, + imageSpecArb +); export const platformArb = fc.constantFrom('ios' as const, 'android' as const); @@ -191,6 +205,10 @@ export function render(spec: ElementSpec): RenderedCase { return { preamble: declarations.join('\n'), jsxBody: `` }; } + if (spec.tag === 'ActivityIndicator') { + return { preamble: declarations.join('\n'), jsxBody: `` }; + } + if (spec.tag === 'Image') { return { preamble: declarations.join('\n'), jsxBody: `` }; } diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/fuzz/vocabulary.ts b/packages/react-native-boost/src/plugin/__tests__/parity/fuzz/vocabulary.ts index 33a80e4d..192eee90 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/fuzz/vocabulary.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/fuzz/vocabulary.ts @@ -308,6 +308,29 @@ export const VIEW_VOCAB: PropSpec[] = [ { name: 'shouldRasterizeIOS', arb: bool, disposition: 'probe pass-through' }, ]; +// โ”€โ”€ ActivityIndicator โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +export const ACTIVITY_INDICATOR_VOCAB: PropSpec[] = [ + { name: 'animating', arb: withNullish(bool), disposition: 'undefined default true; null passes through' }, + { name: 'color', arb: withNullish(fc.constantFrom('"red"', '"blue"')), disposition: 'platform default' }, + { name: 'hidesWhenStopped', arb: withNullish(bool), disposition: 'undefined default true' }, + { + name: 'size', + arb: withNullish(fc.constantFrom('"small"', '"large"', '16', '24')), + disposition: 'size prop and inner dimensions', + }, + { name: 'style', arb: styleValue, disposition: 'outer container style composition' }, + { name: 'onLayout', arb: fc.constant('() => {}'), disposition: 'moved to outer View' }, + { name: 'testID', arb: withNullish(str), disposition: 'inner host pass-through' }, + { name: 'accessibilityLabel', arb: withNullish(str), disposition: 'inner host pass-through' }, + { + name: 'accessibilityRole', + arb: fc.constantFrom('"progressbar"', '"none"'), + disposition: 'inner host pass-through', + }, + { name: 'accessible', arb: withNullish(bool), disposition: 'inner host pass-through' }, + { name: 'collapsable', arb: bool, disposition: 'inner host pass-through' }, +]; + // โ”€โ”€ Image โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ export const IMAGE_SOURCE_VOCAB: PropSpec[] = [ { diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/mocks/ActivityIndicatorViewNativeComponent.ts b/packages/react-native-boost/src/plugin/__tests__/parity/mocks/ActivityIndicatorViewNativeComponent.ts new file mode 100644 index 00000000..345cff78 --- /dev/null +++ b/packages/react-native-boost/src/plugin/__tests__/parity/mocks/ActivityIndicatorViewNativeComponent.ts @@ -0,0 +1 @@ +export { NativeActivityIndicatorCapturer as default } from '../capture'; diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/mocks/ProgressBarAndroidNativeComponent.ts b/packages/react-native-boost/src/plugin/__tests__/parity/mocks/ProgressBarAndroidNativeComponent.ts new file mode 100644 index 00000000..345cff78 --- /dev/null +++ b/packages/react-native-boost/src/plugin/__tests__/parity/mocks/ProgressBarAndroidNativeComponent.ts @@ -0,0 +1 @@ +export { NativeActivityIndicatorCapturer as default } from '../capture'; diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/mocks/StyleSheet.ts b/packages/react-native-boost/src/plugin/__tests__/parity/mocks/StyleSheet.ts index f9b42ccf..ba524379 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/mocks/StyleSheet.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/mocks/StyleSheet.ts @@ -3,6 +3,7 @@ import { flattenStyle } from '../normalize'; const StyleSheet = { create: (styles: T): T => styles, flatten: flattenStyle, + compose: (first: unknown, second: unknown) => (second ? [first, second] : first), }; export default StyleSheet; diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/mocks/react-native.ts b/packages/react-native-boost/src/plugin/__tests__/parity/mocks/react-native.ts index 159491ff..10c2ca8c 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/mocks/react-native.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/mocks/react-native.ts @@ -1,5 +1,10 @@ import Platform from './Platform'; -import { NativeImageCapturer, NativeTextCapturer, NativeViewCapturer } from '../capture'; +import { + NativeActivityIndicatorCapturer, + NativeImageCapturer, + NativeTextCapturer, + NativeViewCapturer, +} from '../capture'; import { flattenStyle } from '../normalize'; import { processColor } from './processColor'; @@ -18,9 +23,13 @@ export const View = NativeViewCapturer; export const Image = Object.assign(NativeImageCapturer, { resolveAssetSource: (source: T): T => source, }); +export const ActivityIndicator = NativeActivityIndicatorCapturer; // `processTextStyle` (the runtime under test) calls `StyleSheet.flatten`, so it must faithfully // reproduce RN's flatten semantics โ€” an identity stub would silently break every dynamic-`style` parity // comparison (arrays would never merge, the top-level conversions would never fire). It shares the one // `flattenStyle` the comparison normalizer uses, so the Boost side flattens identically to the wrapper. -export const StyleSheet = { flatten: flattenStyle }; +export const StyleSheet = { + flatten: flattenStyle, + compose: (first: unknown, second: unknown) => (second ? [first, second] : first), +}; diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts b/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts index 10e09eb1..5ee4f6a0 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts @@ -13,9 +13,12 @@ vi.mock('../../../runtime/components/native-view', async () => ({ vi.mock('../../../runtime/components/native-image', async () => ({ NativeImage: (await import('./capture')).NativeImageCapturer, })); +vi.mock('../../../runtime/components/native-activity-indicator', async () => ({ + NativeActivityIndicator: (await import('./capture')).NativeActivityIndicatorCapturer, +})); import { captureWrapper, captureWrapperHosts } from './wrapper'; -import { captureBoost, boostOptimizes } from './boost'; +import { captureBoost, captureBoostHosts, boostOptimizes } from './boost'; import { reactNativeVersion } from './mocks/Platform'; import { normalize, normalizeImage } from './normalize'; @@ -113,6 +116,31 @@ const VIEW_CASES = [ // a silent loss of optimization โ€” from masquerading as a passing parity test. const BAILED_VIEW_CASES = new Set(['', '']); +const ACTIVITY_INDICATOR_CASES: Array<[string, string?]> = [ + [''], + [''], + [''], + [''], + [''], + [''], + [''], + [' {}} testID="spinner" accessibilityLabel="Loading" />'], + [''], + [ + '', + 'const animating = undefined; const color = undefined; const hides = undefined; const size = 28; const style = { margin: 3 };', + ], + [''], + ['child'], + [''], +]; + +const BAILED_ACTIVITY_INDICATOR_CASES = new Set([ + '', + 'child', + '', +]); + const IMAGE_CASES = [ '', '', @@ -241,6 +269,23 @@ describe('differential parity', () => { expect(normalize(boost.props)).toEqual(normalize(wrapper.props)); }); + it.each(ACTIVITY_INDICATOR_CASES)('ActivityIndicator: %s', async (jsx, preamble = '') => { + const boost = await captureBoostHosts(os, jsx, preamble); + expect(boost.optimized).toBe(!BAILED_ACTIVITY_INDICATOR_CASES.has(jsx)); + if (!boost.optimized) return; + + const wrapper = await captureWrapperHosts(os, jsx, preamble); + expect(boost.hosts.map((host) => host.which)).toEqual(['NativeView', 'NativeActivityIndicator']); + expect(boost.hosts.map((host) => host.which)).toEqual(wrapper.map((host) => host.which)); + if (jsx.includes('onLayout')) { + expect(typeof boost.hosts[0].props.onLayout).toBe('function'); + expect(typeof wrapper[0].props.onLayout).toBe('function'); + expect(boost.hosts[1].props.onLayout).toBeUndefined(); + expect(wrapper[1].props.onLayout).toBeUndefined(); + } + expect(boost.hosts.map((host) => normalize(host.props))).toEqual(wrapper.map((host) => normalize(host.props))); + }); + it.each(IMAGE_CASES)('Image: %s', async (jsx) => { const boost = await captureBoost(os, jsx); expect(boost.optimized).toBe(!BAILED_IMAGE_CASES.has(jsx)); diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/vitest.config.parity.mts b/packages/react-native-boost/src/plugin/__tests__/parity/vitest.config.parity.mts index cf13fd5f..97ddb10f 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/vitest.config.parity.mts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/vitest.config.parity.mts @@ -40,6 +40,8 @@ const basenameRedirects: Array<[RegExp, string]> = [ [/(^|[./])ViewNativeComponent$/, u('./mocks/ViewNativeComponent.ts')], [/(^|[./])TextNativeComponent$/, u('./mocks/TextNativeComponent.ts')], [/(^|[./])ImageViewNativeComponent$/, u('./mocks/ImageViewNativeComponent.ts')], + [/(^|[./])ActivityIndicatorViewNativeComponent(?:\.js)?$/, u('./mocks/ActivityIndicatorViewNativeComponent.ts')], + [/(^|[./])ProgressBarAndroidNativeComponent(?:\.js)?$/, u('./mocks/ProgressBarAndroidNativeComponent.ts')], [/(^|[./])TextInlineImageNativeComponent$/, u('./mocks/TextInlineImageNativeComponent.ts')], [/(^|[./])NativeImageLoader(Android|IOS)$/, u('./mocks/NativeImageLoader.ts')], [/(^|[./])StyleSheet$/, u('./mocks/StyleSheet.ts')], @@ -67,6 +69,22 @@ export default defineConfig({ }, transform(code, id) { if (!RN_SRC.test(id)) return null; + if (/\/ActivityIndicator\/ActivityIndicator\.js$/.test(id)) { + // The real wrapper binds its platform host at module load. The parity suite changes platforms + // in one process, so select at render time while leaving the wrapper's prop logic unchanged. + code = code.replace( + `const PlatformActivityIndicator = + Platform.OS === 'android' + ? require('../ProgressBarAndroid/ProgressBarAndroid').default + : require('./ActivityIndicatorViewNativeComponent').default;`, + `import ProgressBarAndroid from '../ProgressBarAndroid/ProgressBarAndroid.android'; +import ActivityIndicatorView from './ActivityIndicatorViewNativeComponent'; +const PlatformActivityIndicator = props => + Platform.OS === 'android' + ? React.createElement(ProgressBarAndroid, props) + : React.createElement(ActivityIndicatorView, props);` + ); + } const out = transformSync(code, { configFile: false, babelrc: false, diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/wrapper.ts b/packages/react-native-boost/src/plugin/__tests__/parity/wrapper.ts index 18dcecae..7900ffa5 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/wrapper.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/wrapper.ts @@ -18,10 +18,14 @@ async function compileWrapperCase(os: PlatformOS, jsxBody: string, preamble = '' os === 'ios' ? 'react-native/Libraries/Image/Image.ios' : 'react-native/Libraries/Image/Image.android' }';\n` : ''; + const activityIndicatorImport = jsxBody.includes(' { if (options.optimizations?.text !== false) textOptimizer(path, logger, options, platform, unistylesEnabled); if (options.optimizations?.view !== false) viewOptimizer(path, logger, options, platform, unistylesEnabled); if (options.optimizations?.image !== false) imageOptimizer(path, logger, options, platform, unistylesEnabled); + if (options.optimizations?.activityIndicator !== false) + activityIndicatorOptimizer(path, logger, options, platform, unistylesEnabled); }, }, }; diff --git a/packages/react-native-boost/src/plugin/optimizers/activity-indicator/__tests__/index.test.ts b/packages/react-native-boost/src/plugin/optimizers/activity-indicator/__tests__/index.test.ts new file mode 100644 index 00000000..b357851a --- /dev/null +++ b/packages/react-native-boost/src/plugin/optimizers/activity-indicator/__tests__/index.test.ts @@ -0,0 +1,123 @@ +import { transformSync } from '@babel/core'; +import { describe, expect, it } from 'vitest'; +import { activityIndicatorOptimizer } from '..'; +import type { PluginOptions, TargetPlatform } from '../../../types'; +import { generateTestPlugin } from '../../../utils/generate-test-plugin'; + +const transformActivityIndicator = ( + source: string, + platform?: TargetPlatform, + options: { dangerous?: boolean; unistyles?: boolean } = {} +): string => { + const pluginOptions: PluginOptions = { + dangerouslyOptimizeActivityIndicatorWithUnknownAncestors: options.dangerous, + unistyles: options.unistyles, + }; + return transformSync(source, { + configFile: false, + babelrc: false, + plugins: ['@babel/plugin-syntax-jsx', generateTestPlugin(activityIndicatorOptimizer, pluginOptions, platform)], + })!.code!; +}; + +const source = (element: string) => `import { ActivityIndicator } from 'react-native';\n${element};`; + +describe('ActivityIndicator optimizer', () => { + it('expands static iOS props into the two native hosts', () => { + const output = transformActivityIndicator( + source(''), + 'ios' + ); + + expect(output).toContain('<_NativeActivityIndicator'); + expect(output).toContain('<_NativeView style={_activityIndicatorStyles.container}>'); + expect(output).toContain('animating={false}'); + expect(output).toContain('color="red"'); + expect(output).toContain('hidesWhenStopped={true}'); + expect(output).toContain('style={_activityIndicatorStyles.large}'); + expect(output).toContain('size="large"'); + expect(output).not.toContain('processActivityIndicator'); + }); + + it('inlines Android defaults and native ProgressBar props', () => { + const output = transformActivityIndicator(source(''), 'android'); + + expect(output).toContain('<_NativeActivityIndicator'); + expect(output).toContain('animating={true}'); + expect(output).toContain('color={null}'); + expect(output).toContain('styleAttr="Normal"'); + expect(output).toContain('indeterminate={true}'); + }); + + it('uses runtime helpers only for dynamic wrapper props', () => { + const output = transformActivityIndicator( + ` + import { ActivityIndicator } from 'react-native'; + const animating = true; + const color = 'red'; + const hides = false; + const size = 24; + const style = { margin: 4 }; + ; + `, + 'ios' + ); + + expect(output).toContain('_resolveActivityIndicatorDefault(animating, true)'); + expect(output).toContain('_resolveActivityIndicatorDefault(color, "#999999")'); + expect(output).toContain('_resolveActivityIndicatorDefault(hides, true)'); + expect(output).toContain('{..._processActivityIndicatorSize(size)}'); + expect(output).toContain('style={_processActivityIndicatorStyle(style)}'); + }); + + it('inlines static custom size and composed style objects', () => { + const output = transformActivityIndicator( + source(''), + 'android' + ); + + expect(output).toMatch(/style=\{\{\s*height: 24,\s*width: 24\s*\}\}/); + expect(output).toMatch(/style=\{\[_activityIndicatorStyles\.container,\s*\{\s*margin: 4\s*\}\]\}/); + }); + + it.each([ + ['spread props', ''], + ['children', ''], + ['impure props', ''], + ['Text ancestor', ''], + ])('bails on %s', (_, element) => { + const output = transformActivityIndicator( + `import { ActivityIndicator, Text, View } from 'react-native';\n${element};`, + 'ios' + ); + expect(output).not.toContain('_NativeActivityIndicator'); + }); + + it('bails when the target platform is unknown or web', () => { + expect(transformActivityIndicator(source(''))).not.toContain('_NativeActivityIndicator'); + expect(transformActivityIndicator(source(''), 'web')).not.toContain( + '_NativeActivityIndicator' + ); + }); + + it('bails on Unistyles styles and permits dangerous unknown ancestors', () => { + const unistyles = transformActivityIndicator( + ` + import { ActivityIndicator } from 'react-native'; + import { StyleSheet } from 'react-native-unistyles'; + const styles = StyleSheet.create({ spinner: { margin: 4 } }); + ; + `, + 'ios', + { unistyles: true } + ); + expect(unistyles).not.toContain('_NativeActivityIndicator'); + + const dangerous = transformActivityIndicator( + `import { ActivityIndicator } from 'react-native'; import { Wrapper } from './wrapper'; ;`, + 'ios', + { dangerous: true } + ); + expect(dangerous).toContain('_NativeActivityIndicator'); + }); +}); diff --git a/packages/react-native-boost/src/plugin/optimizers/activity-indicator/index.ts b/packages/react-native-boost/src/plugin/optimizers/activity-indicator/index.ts new file mode 100644 index 00000000..3f9b037e --- /dev/null +++ b/packages/react-native-boost/src/plugin/optimizers/activity-indicator/index.ts @@ -0,0 +1,284 @@ +import { NodePath, types as t } from '@babel/core'; +import { HubFile, Optimizer } from '../../types'; +import PluginError from '../../utils/plugin-error'; +import { BailoutCheck, getFirstBailoutReason } from '../../utils/helpers'; +import { + addFileImportHint, + ancestorBailoutChecks, + createStyleOriginResolver, + isForcedLine, + isIgnoredLine, + isReactNativeComponent, + isStaticLiteralTree, + makeAttribute, +} from '../../utils/common'; +import { RUNTIME_MODULE_NAME } from '../../utils/constants'; + +const CONSUMED_PROPS = new Set([ + 'animating', + 'children', + 'color', + 'hidesWhenStopped', + 'key', + 'onLayout', + 'ref', + 'size', + 'style', +]); + +export const activityIndicatorOptimizer: Optimizer = (path, logger, options, platform, unistylesEnabled) => { + if (platform === 'web') return; + if (!isReactNativeComponent(path, 'ActivityIndicator')) return; + + const parent = path.parent as t.JSXElement; + const forced = isForcedLine(path); + const getStyleOrigin = createStyleOriginResolver(path, unistylesEnabled); + + const hardChecks: BailoutCheck[] = [ + { + reason: 'target platform is unknown', + shouldBail: () => platform !== 'ios' && platform !== 'android', + }, + { + reason: 'has a Unistyles style that cannot be moved to the generated outer host', + shouldBail: () => getStyleOrigin() === 'unistyles', + }, + { + reason: 'has spread props', + shouldBail: () => path.node.attributes.some((attribute) => t.isJSXSpreadAttribute(attribute)), + }, + { + reason: 'contains children', + shouldBail: () => + findAttribute(path.node.attributes, 'children') !== undefined || + parent.children.some((child) => !t.isJSXText(child) || child.value.trim() !== ''), + }, + { + reason: 'contains an impure prop expression that cannot be safely reordered', + shouldBail: () => hasImpureAttributeValue(path), + }, + ]; + + const overridableChecks: BailoutCheck[] = [ + { + reason: 'has an unresolved style source that may be a Unistyles style', + shouldBail: () => getStyleOrigin() === 'unknown', + }, + ...ancestorBailoutChecks(path, options?.dangerouslyOptimizeActivityIndicatorWithUnknownAncestors === true), + ]; + + const hardSkipReason = getFirstBailoutReason(hardChecks); + if (hardSkipReason) { + logger.skipped({ component: 'ActivityIndicator', path, reason: hardSkipReason }); + return; + } + + if (forced) { + const overriddenReason = getFirstBailoutReason(overridableChecks); + if (overriddenReason) logger.forced({ component: 'ActivityIndicator', path, reason: overriddenReason }); + } else { + const skipReason = getFirstBailoutReason([ + { + reason: 'line is marked with @boost-ignore', + shouldBail: () => isIgnoredLine(path), + }, + ...overridableChecks, + ]); + if (skipReason) { + logger.skipped({ component: 'ActivityIndicator', path, reason: skipReason }); + return; + } + } + + const hub = path.hub as unknown; + const file = typeof hub === 'object' && hub !== null && 'file' in hub ? (hub.file as HubFile) : undefined; + if (!file) throw new PluginError('No file found in Babel hub'); + + const view = addRuntimeImport(path, file, 'NativeView'); + const styles = addRuntimeImport(path, file, 'activityIndicatorStyles'); + const host = addRuntimeImport(path, file, 'NativeActivityIndicator'); + const attributes = path.node.attributes; + const animating = buildDefaultedAttribute(path, file, attributes, 'animating', t.booleanLiteral(true)); + const color = buildDefaultedAttribute( + path, + file, + attributes, + 'color', + platform === 'ios' ? t.stringLiteral('#999999') : t.nullLiteral() + ); + const hidesWhenStopped = buildDefaultedAttribute(path, file, attributes, 'hidesWhenStopped', t.booleanLiteral(true)); + const sizeAttributes = buildSizeAttributes(path, file, attributes, styles); + const outerStyle = buildOuterStyle(path, file, attributes, styles); + + const remaining = attributes + .filter( + (attribute) => + !t.isJSXAttribute(attribute) || !t.isJSXIdentifier(attribute.name) || !CONSUMED_PROPS.has(attribute.name.name) + ) + .map((attribute) => t.cloneNode(attribute, true)); + + const ref = findAttribute(attributes, 'ref'); + const onLayout = findAttribute(attributes, 'onLayout'); + const key = findAttribute(attributes, 'key'); + + const innerAttributes: Array = [ + animating, + color, + hidesWhenStopped, + ...remaining, + ref ? t.cloneNode(ref, true) : undefined, + ...sizeAttributes, + platform === 'android' ? makeAttribute('styleAttr', t.stringLiteral('Normal')) : undefined, + platform === 'android' ? makeAttribute('indeterminate', t.booleanLiteral(true)) : undefined, + ].filter((attribute): attribute is t.JSXAttribute | t.JSXSpreadAttribute => attribute !== undefined); + + const inner = t.jsxElement(t.jsxOpeningElement(t.jsxIdentifier(host.name), innerAttributes, true), null, [], true); + const outerAttributes = [ + key ? t.cloneNode(key, true) : undefined, + onLayout ? t.cloneNode(onLayout, true) : undefined, + makeAttribute('style', outerStyle), + ].filter((attribute): attribute is t.JSXAttribute => attribute !== undefined); + const outer = t.jsxElement( + t.jsxOpeningElement(t.jsxIdentifier(view.name), outerAttributes, false), + t.jsxClosingElement(t.jsxIdentifier(view.name)), + [inner], + false + ); + + t.inheritsComments(outer, parent); + logger.optimized({ component: 'ActivityIndicator', path }); + path.parentPath.replaceWith(outer); +}; + +function addRuntimeImport(path: NodePath, file: HubFile, importName: string): t.Identifier { + return addFileImportHint({ + file, + nameHint: importName, + path, + importName, + moduleName: RUNTIME_MODULE_NAME, + }); +} + +function buildDefaultedAttribute( + path: NodePath, + file: HubFile, + attributes: Array, + name: string, + fallback: t.Expression +): t.JSXAttribute { + const attribute = findAttribute(attributes, name); + if (!attribute) return makeAttribute(name, fallback); + + const value = getAttributeValueExpression(attribute); + if (isDefinitelyDefined(value)) return makeAttribute(name, t.cloneNode(value, true)); + + const resolver = addRuntimeImport(path, file, 'resolveActivityIndicatorDefault'); + return makeAttribute( + name, + t.callExpression(t.identifier(resolver.name), [t.cloneNode(value, true), t.cloneNode(fallback, true)]) + ); +} + +function buildSizeAttributes( + path: NodePath, + file: HubFile, + attributes: Array, + styles: t.Identifier +): Array { + const attribute = findAttribute(attributes, 'size'); + if (!attribute) return staticSizeAttributes('small', styles); + + const value = getAttributeValueExpression(attribute); + if (isStaticLiteralTree(value)) { + if (t.isStringLiteral(value) && (value.value === 'small' || value.value === 'large')) { + return staticSizeAttributes(value.value, styles); + } + return [ + makeAttribute( + 'style', + t.objectExpression([ + t.objectProperty(t.identifier('height'), t.cloneNode(value, true)), + t.objectProperty(t.identifier('width'), t.cloneNode(value, true)), + ]) + ), + ]; + } + + const resolver = addRuntimeImport(path, file, 'processActivityIndicatorSize'); + return [t.jsxSpreadAttribute(t.callExpression(t.identifier(resolver.name), [t.cloneNode(value, true)]))]; +} + +function staticSizeAttributes(size: 'small' | 'large', styles: t.Identifier): t.JSXAttribute[] { + return [ + makeAttribute('style', t.memberExpression(t.identifier(styles.name), t.identifier(size))), + makeAttribute('size', t.stringLiteral(size)), + ]; +} + +function buildOuterStyle( + path: NodePath, + file: HubFile, + attributes: Array, + styles: t.Identifier +): t.Expression { + const container = t.memberExpression(t.identifier(styles.name), t.identifier('container')); + const attribute = findAttribute(attributes, 'style'); + if (!attribute) return container; + + const value = getAttributeValueExpression(attribute); + const truthiness = getStaticTruthiness(value); + if (truthiness === false) return container; + if (truthiness === true) return t.arrayExpression([container, t.cloneNode(value, true)]); + + const resolver = addRuntimeImport(path, file, 'processActivityIndicatorStyle'); + return t.callExpression(t.identifier(resolver.name), [t.cloneNode(value, true)]); +} + +function findAttribute( + attributes: Array, + name: string +): t.JSXAttribute | undefined { + return attributes.findLast( + (attribute): attribute is t.JSXAttribute => + t.isJSXAttribute(attribute) && t.isJSXIdentifier(attribute.name, { name }) + ); +} + +function getAttributeValueExpression(attribute: t.JSXAttribute): t.Expression { + if (!attribute.value) return t.booleanLiteral(true); + if (t.isStringLiteral(attribute.value)) return attribute.value; + if (t.isJSXExpressionContainer(attribute.value)) { + return t.isJSXEmptyExpression(attribute.value.expression) ? t.booleanLiteral(true) : attribute.value.expression; + } + return t.nullLiteral(); +} + +function isDefinitelyDefined(expression: t.Expression): boolean { + return ( + isStaticLiteralTree(expression) || + t.isArrowFunctionExpression(expression) || + t.isFunctionExpression(expression) || + t.isTemplateLiteral(expression) + ); +} + +function getStaticTruthiness(expression: t.Expression): boolean | undefined { + if (t.isNullLiteral(expression)) return false; + if (t.isBooleanLiteral(expression)) return expression.value; + if (t.isStringLiteral(expression)) return expression.value.length > 0; + if (t.isNumericLiteral(expression)) return expression.value !== 0 && !Number.isNaN(expression.value); + if (t.isUnaryExpression(expression) && expression.operator === '-' && t.isNumericLiteral(expression.argument)) { + return expression.argument.value !== 0; + } + if (t.isObjectExpression(expression) || t.isArrayExpression(expression)) return true; + return undefined; +} + +function hasImpureAttributeValue(path: NodePath): boolean { + return path.node.attributes.some((attribute) => { + if (!t.isJSXAttribute(attribute) || !t.isJSXExpressionContainer(attribute.value)) return false; + if (t.isJSXEmptyExpression(attribute.value.expression)) return false; + return !path.scope.isPure(attribute.value.expression); + }); +} diff --git a/packages/react-native-boost/src/plugin/types/index.ts b/packages/react-native-boost/src/plugin/types/index.ts index 27501cc9..3428bf1f 100644 --- a/packages/react-native-boost/src/plugin/types/index.ts +++ b/packages/react-native-boost/src/plugin/types/index.ts @@ -16,6 +16,11 @@ export interface PluginOptimizationOptions { * @default true */ image?: boolean; + /** + * Whether to optimize the `ActivityIndicator` component. + * @default true + */ + activityIndicator?: boolean; } export interface PluginOptions { @@ -94,9 +99,17 @@ export interface PluginOptions { * @default false */ dangerouslyOptimizeImageWithUnknownAncestors?: boolean; + /** + * Opt-in flag that allows ActivityIndicator optimization when ancestor components cannot be statically resolved. + * + * This can change Text ancestor context when an unresolved ancestor renders a React Native `Text` wrapper. + * Prefer targeted `@boost-force` first, and enable this only after verifying affected screens. + * @default false + */ + dangerouslyOptimizeActivityIndicatorWithUnknownAncestors?: boolean; } -export type OptimizableComponent = 'Text' | 'View' | 'Image'; +export type OptimizableComponent = 'Text' | 'View' | 'Image' | 'ActivityIndicator'; export type TargetPlatform = 'ios' | 'android' | 'web'; diff --git a/packages/react-native-boost/src/runtime/__tests__/index.test.ts b/packages/react-native-boost/src/runtime/__tests__/index.test.ts index a407d1be..2df0b6d4 100644 --- a/packages/react-native-boost/src/runtime/__tests__/index.test.ts +++ b/packages/react-native-boost/src/runtime/__tests__/index.test.ts @@ -10,6 +10,10 @@ import { clampNumberOfLines, userSelectToSelectableMap, verticalAlignToTextAlignVerticalMap, + processActivityIndicatorSize, + processActivityIndicatorStyle, + resolveActivityIndicatorDefault, + activityIndicatorStyles, } from '..'; import { Platform, StyleSheet, TextStyle } from 'react-native'; @@ -53,9 +57,11 @@ vi.mock('react-native', () => { Image: Object.assign(() => 'Image', { resolveAssetSource: (source: T): T => source, }), + ActivityIndicator: () => 'ActivityIndicator', Platform, StyleSheet: { flatten: flattenStyle, + compose: (first: unknown, second: unknown) => (second ? [first, second] : first), }, // Distinguishable stand-in for RN's `processColor` so `processSelectionColor` can be asserted to // actually call it (a named color โ†’ packed int) rather than passing the value through unchanged. @@ -148,6 +154,34 @@ describe('processTextStyle', () => { }); }); +describe('ActivityIndicator helpers', () => { + it('applies defaults only to undefined', () => { + expect(resolveActivityIndicatorDefault(undefined, true)).toBe(true); + expect(resolveActivityIndicatorDefault(null, true)).toBeNull(); + expect(resolveActivityIndicatorDefault(false, true)).toBe(false); + }); + + it('resolves built-in and numeric sizes', () => { + expect(processActivityIndicatorSize()).toEqual({ style: activityIndicatorStyles.small, size: 'small' }); + expect(processActivityIndicatorSize().style).toBe(activityIndicatorStyles.small); + expect(processActivityIndicatorSize('large')).toEqual({ style: activityIndicatorStyles.large, size: 'large' }); + expect(processActivityIndicatorSize('large').style).toBe(activityIndicatorStyles.large); + expect(processActivityIndicatorSize(24)).toEqual({ style: { height: 24, width: 24 }, size: undefined }); + expect(processActivityIndicatorSize(null as never)).toEqual({ + style: { height: null, width: null }, + size: undefined, + }); + }); + + it('composes the container and user styles', () => { + expect(processActivityIndicatorStyle(undefined)).toEqual({ alignItems: 'center', justifyContent: 'center' }); + expect(processActivityIndicatorStyle({ margin: 4 })).toEqual([ + { alignItems: 'center', justifyContent: 'center' }, + { margin: 4 }, + ]); + }); +}); + describe('processSelectionColor', () => { it('omits the prop for null/undefined input', () => { expect(processSelectionColor(null)).toEqual({}); diff --git a/packages/react-native-boost/src/runtime/__tests__/mocks/react-native.ts b/packages/react-native-boost/src/runtime/__tests__/mocks/react-native.ts index 07f2236a..1955258c 100644 --- a/packages/react-native-boost/src/runtime/__tests__/mocks/react-native.ts +++ b/packages/react-native-boost/src/runtime/__tests__/mocks/react-native.ts @@ -3,6 +3,7 @@ export const Text = () => 'Text'; export const Image = Object.assign(() => 'Image', { resolveAssetSource: (source: T): T => source, }); +export const ActivityIndicator = () => 'ActivityIndicator'; // `constants.reactNativeVersion` backs the runtime's Image wrapper-version gates. Pinned rather than // read from the installed RN so unit expectations are deterministic; the version-dependent branches diff --git a/packages/react-native-boost/src/runtime/__tests__/native-activity-indicator.test.ts b/packages/react-native-boost/src/runtime/__tests__/native-activity-indicator.test.ts new file mode 100644 index 00000000..600c8caa --- /dev/null +++ b/packages/react-native-boost/src/runtime/__tests__/native-activity-indicator.test.ts @@ -0,0 +1,42 @@ +import type { ComponentType } from 'react'; +import type { ActivityIndicatorProps } from 'react-native'; +import { afterEach, describe, expect, it, vi } from 'vitest'; + +const reactNativeActivityIndicator = (() => null) as ComponentType; + +async function importNativeActivityIndicator(os: string) { + vi.resetModules(); + const loadActivityIndicator = vi.fn(() => reactNativeActivityIndicator); + vi.doMock('react-native', () => ({ + get ActivityIndicator() { + return loadActivityIndicator(); + }, + Platform: { OS: os }, + })); + + return { ...(await import('../components/native-activity-indicator')), loadActivityIndicator }; +} + +afterEach(() => { + vi.doUnmock('react-native'); + vi.resetModules(); +}); + +describe('NativeActivityIndicator', () => { + it.each([ + ['ios', 'RCTActivityIndicatorView'], + ['android', 'AndroidProgressBar'], + ])('loads React Native ActivityIndicator to register and use the %s host', async (os, host) => { + const { NativeActivityIndicator, loadActivityIndicator } = await importNativeActivityIndicator(os); + + expect(loadActivityIndicator).toHaveBeenCalledOnce(); + expect(NativeActivityIndicator).toBe(host); + }); + + it('uses React Native ActivityIndicator on other platforms', async () => { + const { NativeActivityIndicator, loadActivityIndicator } = await importNativeActivityIndicator('web'); + + expect(loadActivityIndicator).toHaveBeenCalledOnce(); + expect(NativeActivityIndicator).toBe(reactNativeActivityIndicator); + }); +}); diff --git a/packages/react-native-boost/src/runtime/components/native-activity-indicator.ts b/packages/react-native-boost/src/runtime/components/native-activity-indicator.ts new file mode 100644 index 00000000..e135e51d --- /dev/null +++ b/packages/react-native-boost/src/runtime/components/native-activity-indicator.ts @@ -0,0 +1,20 @@ +import type { ComponentType } from 'react'; +import type { ActivityIndicatorProps } from 'react-native'; +import * as reactNativeModule from 'react-native'; + +type ReactNativeActivityIndicatorModule = { + ActivityIndicator: ComponentType; + Platform: { + OS: string; + }; +}; + +// Accessing ActivityIndicator registers the platform host view config before its string is used. +const { ActivityIndicator, Platform } = reactNativeModule as ReactNativeActivityIndicatorModule; + +export const NativeActivityIndicator: ComponentType = + Platform.OS === 'android' + ? ('AndroidProgressBar' as unknown as ComponentType) + : Platform.OS === 'ios' + ? ('RCTActivityIndicatorView' as unknown as ComponentType) + : ActivityIndicator; diff --git a/packages/react-native-boost/src/runtime/index.ts b/packages/react-native-boost/src/runtime/index.ts index 70222f58..54558002 100644 --- a/packages/react-native-boost/src/runtime/index.ts +++ b/packages/react-native-boost/src/runtime/index.ts @@ -6,7 +6,7 @@ import { Image as RNImage, processColor as rnProcessColor, } from 'react-native'; -import type { ColorValue, ProcessedColorValue } from 'react-native'; +import type { ActivityIndicatorProps, ColorValue, ProcessedColorValue } from 'react-native'; import { GenericStyleProp } from './types'; import { userSelectToSelectableMap, verticalAlignToTextAlignVerticalMap } from './utils/constants'; @@ -14,6 +14,13 @@ const propsCache = new WeakMap(); const imageBaseStyle = { overflow: 'hidden' } as const; const textDefaultOverflowStyle = { overflow: 'hidden' } as const; const emptyImageSource = { uri: undefined, width: undefined, height: undefined }; +export const activityIndicatorStyles = { + container: { alignItems: 'center', justifyContent: 'center' }, + small: { width: 20, height: 20 }, + large: { width: 36, height: 36 }, +} as const; +let activityIndicatorSmallProps: { style: (typeof activityIndicatorStyles)['small']; size: 'small' } | undefined; +let activityIndicatorLargeProps: { style: (typeof activityIndicatorStyles)['large']; size: 'large' } | undefined; // Resolve RN's `processColor` once. The `typeof` guard degrades to a passthrough on // a non-RN host that lacks it (see {@link processSelectionColor}); the web build never reaches this โ€” it @@ -199,6 +206,24 @@ export function processSelectionColor(selectionColor?: ColorValue | number | nul return processed === undefined ? {} : { selectionColor: processed }; } +export function resolveActivityIndicatorDefault(value: T | undefined, fallback: T): T { + return value === undefined ? fallback : value; +} + +export function processActivityIndicatorStyle(style: ActivityIndicatorProps['style']) { + return StyleSheet.compose(activityIndicatorStyles.container, style); +} + +export function processActivityIndicatorSize(size: ActivityIndicatorProps['size'] = 'small') { + if (size === 'small') { + return (activityIndicatorSmallProps ??= { style: activityIndicatorStyles.small, size: 'small' }); + } + if (size === 'large') { + return (activityIndicatorLargeProps ??= { style: activityIndicatorStyles.large, size: 'large' }); + } + return { style: { height: size, width: size }, size: undefined }; +} + // eslint-disable-next-line @typescript-eslint/no-explicit-any type ImageSourceHelperProps = Record; // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -598,3 +623,4 @@ export * from './utils/constants'; export * from './components/native-text'; export * from './components/native-view'; export { NativeImage } from './components/native-image'; +export { NativeActivityIndicator } from './components/native-activity-indicator'; diff --git a/packages/react-native-boost/src/runtime/index.web.ts b/packages/react-native-boost/src/runtime/index.web.ts index 95a02499..4780d71f 100644 --- a/packages/react-native-boost/src/runtime/index.web.ts +++ b/packages/react-native-boost/src/runtime/index.web.ts @@ -1,6 +1,7 @@ // This is a dummy file to ensure that nothing breaks when using the runtime in a web environment. -import { TextProps, TextStyle } from 'react-native'; +import { ActivityIndicator as NativeActivityIndicator } from 'react-native'; +import type { ActivityIndicatorProps, TextProps, TextStyle } from 'react-native'; import { GenericStyleProp } from './types'; export const processTextStyle = (style: GenericStyleProp) => ({ style }) as Partial; @@ -12,6 +13,28 @@ export function processSelectionColor(selectionColor?: unknown): { selectionColo return selectionColor == null ? {} : { selectionColor }; } +export function resolveActivityIndicatorDefault(value: T | undefined, fallback: T): T { + return value === undefined ? fallback : value; +} + +export const activityIndicatorStyles = { + container: { alignItems: 'center', justifyContent: 'center' }, + small: { width: 20, height: 20 }, + large: { width: 36, height: 36 }, +} as const; + +export function processActivityIndicatorStyle(style: ActivityIndicatorProps['style']) { + return style ? [activityIndicatorStyles.container, style] : activityIndicatorStyles.container; +} + +export function processActivityIndicatorSize(size: ActivityIndicatorProps['size'] = 'small') { + if (size === 'small') return { style: activityIndicatorStyles.small, size }; + if (size === 'large') return { style: activityIndicatorStyles.large, size }; + return { style: { height: size, width: size }, size: undefined }; +} + +export { NativeActivityIndicator }; + // On Web there is no platform-specific `accessible` default to apply; react-native-web's `Text` // derives accessibility from the rendered DOM. Returning `undefined` makes the injected // `accessible={getDefaultTextAccessible()}` a no-op. From 9aa6c33cb8b63413624d9bee7505e47041c11032 Mon Sep 17 00:00:00 2001 From: Maximilian Krause Date: Thu, 3 Sep 2026 00:59:12 +0200 Subject: [PATCH 03/56] feat(example): drive mount benchmark automatically --- apps/example/src/screens/benchmark.tsx | 188 ++++++++++++++++++------- 1 file changed, 139 insertions(+), 49 deletions(-) diff --git a/apps/example/src/screens/benchmark.tsx b/apps/example/src/screens/benchmark.tsx index 4a3a1c93..8b201cfc 100644 --- a/apps/example/src/screens/benchmark.tsx +++ b/apps/example/src/screens/benchmark.tsx @@ -1,6 +1,6 @@ import { ActivityIndicator, Image, Pressable, StyleSheet, Text, View } from 'react-native'; import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context'; -import { useMemo, useState } from 'react'; +import { useEffect, useMemo, useState } from 'react'; import { startMarker } from 'react-native-time-to-render'; import { Benchmark, BenchmarkStep } from '../types'; import MeasureComponent from '../components/measure-component'; @@ -55,37 +55,35 @@ const benchmarks = [ }, ] satisfies Benchmark[]; +type RunStatus = 'idle' | 'settling' | 'measuring' | 'complete'; +type ScheduledStep = { benchmarkIndex: number; step: BenchmarkStep }; + +const SETTLE_DELAY_MS = 500; + export default function BenchmarkScreen() { const insets = useSafeAreaInsets(); + const [selectedBenchmarks, setSelectedBenchmarks] = useState(() => benchmarks.map(() => true)); + const [schedule, setSchedule] = useState([]); const [currentStepIndex, setCurrentStepIndex] = useState(0); - const [runBenchmark, setRunBenchmark] = useState(false); + const [runStatus, setRunStatus] = useState('idle'); const [results, setResults] = useState>({}); - const totalSteps = benchmarks.length * 2; - const currentBenchmark = useMemo(() => Math.floor(currentStepIndex / 2), [currentStepIndex]); - const currentStep = useMemo( - () => (currentStepIndex % 2 === 0 ? BenchmarkStep.Unoptimized : BenchmarkStep.Optimized), - [currentStepIndex] - ); - - const progress = useMemo<[number, number]>(() => { - return [currentStepIndex, totalSteps]; - }, [currentStepIndex, totalSteps]); - - const buttonTitle = useMemo(() => { - if (currentStepIndex === 0) { - return 'Start Benchmark'; - } - if (currentStepIndex === totalSteps - 1) { - return 'Last Step'; - } - return 'Next Step'; - }, [currentStepIndex, totalSteps]); - - const markerName = useMemo( - () => getMarkerName(benchmarks[currentBenchmark].title, currentStep), - [currentBenchmark, currentStep] - ); + const activeStep = schedule[currentStepIndex]; + const activeBenchmark = activeStep ? benchmarks[activeStep.benchmarkIndex] : undefined; + const isRunning = runStatus === 'settling' || runStatus === 'measuring'; + const selectedCount = selectedBenchmarks.filter(Boolean).length; + const markerName = activeStep ? getMarkerName(benchmarks[activeStep.benchmarkIndex].title, activeStep.step) : ''; + const subtitle = + isRunning && activeStep + ? `Step ${currentStepIndex + 1} / ${schedule.length}: ${activeBenchmark?.title} (${activeStep.step})` + : runStatus === 'complete' + ? 'Benchmark complete' + : `${selectedCount} of ${benchmarks.length} benchmarks selected`; + const buttonTitle = isRunning + ? `Running ${currentStepIndex + 1} / ${schedule.length}` + : runStatus === 'complete' + ? 'Run Selected Again' + : 'Run Selected'; const resultRows = useMemo(() => { return benchmarks.map((benchmark, index) => { @@ -106,28 +104,74 @@ export default function BenchmarkScreen() { }); }, [results]); - const handleRun = (timestamp: number) => { - startMarker(markerName, timestamp); - setRunBenchmark(true); + // Let cleanup and result UI work finish before the next measurement starts. + useEffect(() => { + if (runStatus !== 'settling' || !activeStep) return; + + let frame: number | undefined; + const timeout = setTimeout(() => { + frame = requestAnimationFrame((timestamp) => { + startMarker(markerName, timestamp); + setRunStatus('measuring'); + }); + }, SETTLE_DELAY_MS); + + return () => { + clearTimeout(timeout); + if (frame !== undefined) cancelAnimationFrame(frame); + }; + }, [activeStep, markerName, runStatus]); + + const handleRun = () => { + const nextSchedule = selectedBenchmarks.flatMap((selected, benchmarkIndex) => + selected + ? [ + { benchmarkIndex, step: BenchmarkStep.Unoptimized }, + { benchmarkIndex, step: BenchmarkStep.Optimized }, + ] + : [] + ); + if (nextSchedule.length === 0) return; + + setSchedule(nextSchedule); + setCurrentStepIndex(0); + setResults({}); + setRunStatus('settling'); + }; + + const handleToggleBenchmark = (benchmarkIndex: number) => { + if (isRunning) return; + setSelectedBenchmarks((current) => + current.map((selected, index) => (index === benchmarkIndex ? !selected : selected)) + ); + if (runStatus === 'complete') setRunStatus('idle'); }; const handleRenderTimeChange = (renderTime: number) => { - setRunBenchmark(false); + if (!activeStep) return; setResults((previousResults) => { - const baseResults = currentStepIndex === 0 ? {} : previousResults; - const previousBenchmarkResult = baseResults[currentBenchmark] ?? { unoptimized: null, optimized: null }; + const previousBenchmarkResult = previousResults[activeStep.benchmarkIndex] ?? { + unoptimized: null, + optimized: null, + }; return { - ...baseResults, - [currentBenchmark]: - currentStep === BenchmarkStep.Unoptimized + ...previousResults, + [activeStep.benchmarkIndex]: + activeStep.step === BenchmarkStep.Unoptimized ? { unoptimized: renderTime, optimized: null } : { ...previousBenchmarkResult, optimized: renderTime }, }; }); - setCurrentStepIndex((previousStepIndex) => (previousStepIndex + 1) % totalSteps); + const nextStepIndex = currentStepIndex + 1; + if (nextStepIndex < schedule.length) { + setCurrentStepIndex(nextStepIndex); + setRunStatus('settling'); + } else { + setRunStatus('complete'); + } }; return ( @@ -135,10 +179,7 @@ export default function BenchmarkScreen() { React Native Boost Benchmark - {`Step ${progress[0] + 1} / ${progress[1]}: ${benchmarks[currentBenchmark].title} (${currentStep})`} + {subtitle} @@ -155,9 +196,22 @@ export default function BenchmarkScreen() { style={[ styles.tableRow, index % 2 === 0 ? styles.tableStripeLight : styles.tableStripeDark, - index === currentBenchmark && styles.tableActiveRow, + isRunning && index === activeStep?.benchmarkIndex && styles.tableActiveRow, + !selectedBenchmarks[index] && styles.tableRowDisabled, ]}> - {row.title} + handleToggleBenchmark(index)} + style={[styles.tableCell, styles.benchmarkColumn, styles.benchmarkSelector]}> + + {selectedBenchmarks[index] && } + + {row.title} + {row.unoptimizedText} {row.optimizedText} handleRun(event.nativeEvent.timestamp)} - style={({ pressed }) => [styles.runButton, pressed && styles.runButtonPressed]}> + accessibilityState={{ disabled: isRunning || selectedCount === 0 }} + disabled={isRunning || selectedCount === 0} + onPress={handleRun} + style={({ pressed }) => [ + styles.runButton, + (isRunning || selectedCount === 0) && styles.runButtonDisabled, + pressed && styles.runButtonPressed, + ]}> {buttonTitle} - {runBenchmark && ( + {runStatus === 'measuring' && activeStep && activeBenchmark && ( )} @@ -245,6 +305,9 @@ const styles = StyleSheet.create({ transform: [{ scale: 0.985 }], opacity: 0.95, }, + runButtonDisabled: { + opacity: 0.5, + }, runButtonText: { color: '#0b0e11', fontSize: 15, @@ -287,6 +350,9 @@ const styles = StyleSheet.create({ tableActiveRow: { backgroundColor: '#1f2a36', }, + tableRowDisabled: { + opacity: 0.45, + }, tableCell: { paddingHorizontal: 10, paddingVertical: 8, @@ -298,6 +364,30 @@ const styles = StyleSheet.create({ flex: 1, alignItems: 'flex-end', }, + benchmarkSelector: { + flexDirection: 'row', + alignItems: 'center', + gap: 8, + }, + checkbox: { + width: 18, + height: 18, + borderRadius: 4, + borderWidth: 1, + borderColor: '#6c7480', + alignItems: 'center', + justifyContent: 'center', + }, + checkboxSelected: { + backgroundColor: '#f0b90b', + borderColor: '#f0b90b', + }, + checkboxMark: { + width: 8, + height: 8, + borderRadius: 2, + backgroundColor: '#0b0e11', + }, benchmarkText: { fontSize: 14, color: '#eaecef', From 278bbdf848b5887b20a533fd6c3d0024051f4508 Mon Sep 17 00:00:00 2001 From: Maximilian Krause Date: Thu, 3 Sep 2026 01:48:13 +0200 Subject: [PATCH 04/56] feat(plugin)!: redesign configuration API --- AGENTS.md | 2 +- apps/docs/app/docs/[[...slug]]/page.tsx | 26 +++- .../content/docs/compatibility/unistyles.mdx | 4 +- .../content/docs/configuration/configure.mdx | 50 +++++-- .../content/docs/information/deep-dive.mdx | 13 +- .../information/optimization-coverage.mdx | 31 ++-- .../docs/information/troubleshooting.mdx | 21 ++- apps/example/babel.config.js | 2 +- .../build-time-accessible-default.test.ts | 8 +- .../src/plugin/__tests__/nesting.test.ts | 4 +- .../src/plugin/__tests__/parity/boost.ts | 12 +- .../plugin/__tests__/parity/fibers.collect.ts | 2 +- .../react-native-boost/src/plugin/index.ts | 54 ++++--- .../__tests__/index.test.ts | 16 +-- .../optimizers/activity-indicator/index.ts | 2 +- .../optimizers/image/__tests__/index.test.ts | 14 +- .../src/plugin/optimizers/image/index.ts | 2 +- .../optimizers/text/__tests__/index.test.ts | 16 +-- .../src/plugin/optimizers/text/index.ts | 8 +- .../optimizers/view/__tests__/index.test.ts | 6 +- .../src/plugin/optimizers/view/index.ts | 2 +- .../src/plugin/types/index.ts | 134 ++++++++---------- .../src/plugin/utils/__tests__/logger.test.ts | 29 ++-- .../plugin/utils/__tests__/options.test.ts | 56 ++++++++ .../src/plugin/utils/common/validation.ts | 16 +-- .../src/plugin/utils/generate-test-plugin.ts | 10 +- .../src/plugin/utils/logger.ts | 14 +- .../src/plugin/utils/options.ts | 104 ++++++++++++++ .../src/plugin/utils/unistyles.ts | 4 +- 29 files changed, 423 insertions(+), 239 deletions(-) create mode 100644 packages/react-native-boost/src/plugin/utils/__tests__/options.test.ts create mode 100644 packages/react-native-boost/src/plugin/utils/options.ts diff --git a/AGENTS.md b/AGENTS.md index c2d84d5b..9d964ab4 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -56,7 +56,7 @@ Native host components are loaded from a runtime library to gracefully fall back ## Testing -Optimizer tests use `babel-plugin-tester` with fixture directories, each containing `code.js` (input) and `output.js` (expected transform). Some cases have `dangerous-output.js` variants for the optional dangerous-ancestor option. +Optimizer tests use `babel-plugin-tester` with fixture directories, each containing `code.js` (input) and `output.js` (expected transform). Some cases have `dangerous-output.js` variants for the optional unknown-ancestor assumption. ## Tooling notes diff --git a/apps/docs/app/docs/[[...slug]]/page.tsx b/apps/docs/app/docs/[[...slug]]/page.tsx index f9d8b9a9..80607f7f 100644 --- a/apps/docs/app/docs/[[...slug]]/page.tsx +++ b/apps/docs/app/docs/[[...slug]]/page.tsx @@ -29,7 +29,7 @@ async function getTocInsertions(slug: string): Promise { } if (slug === 'configuration/configure') { - const [pluginOptionsToc, pluginOptimizationOptionsToc] = await Promise.all([ + const [pluginOptionsToc, optimizationOptionsToc, assumptionsToc, integrationOptionsToc] = await Promise.all([ getAutoOptionSectionsToc({ path: pluginTypesPath, name: 'PluginOptions', @@ -42,6 +42,18 @@ async function getTocInsertions(slug: string): Promise { idPrefix: 'plugin-optimization-options', depth: 3, }), + getAutoOptionSectionsToc({ + path: pluginTypesPath, + name: 'PluginAssumptions', + idPrefix: 'plugin-assumptions', + depth: 3, + }), + getAutoOptionSectionsToc({ + path: pluginTypesPath, + name: 'PluginIntegrationOptions', + idPrefix: 'plugin-integration-options', + depth: 3, + }), ]); return [ @@ -50,8 +62,16 @@ async function getTocInsertions(slug: string): Promise { items: pluginOptionsToc, }, { - afterUrl: '#plugin-optimization-options', - items: pluginOptimizationOptionsToc, + afterUrl: '#optimization-options', + items: optimizationOptionsToc, + }, + { + afterUrl: '#assumptions', + items: assumptionsToc, + }, + { + afterUrl: '#integration-options', + items: integrationOptionsToc, }, ]; } diff --git a/apps/docs/content/docs/compatibility/unistyles.mdx b/apps/docs/content/docs/compatibility/unistyles.mdx index 60ffa238..830b2ae3 100644 --- a/apps/docs/content/docs/compatibility/unistyles.mdx +++ b/apps/docs/content/docs/compatibility/unistyles.mdx @@ -13,13 +13,13 @@ Enable Boost's Unistyles support layer through the Babel plugin's config options // babel.config.js module.exports = { plugins: [ - ['react-native-boost/plugin', { unistyles: true }], + ['react-native-boost/plugin', { integrations: { unistyles: 'on' } }], ['react-native-unistyles/plugin', { root: 'src' }], ], }; ``` -Set `unistyles: false` to turn the mode off, e.g. when Unistyles is installed in your project's dependencies, but not actually used in code. The order of the two plugins does not matter. +Set `integrations.unistyles` to `off` when Unistyles is installed in your project's dependencies, but not actually used in code. The order of the two plugins does not matter. React Native Boost can auto-detect Unistyles and enable this mode automatically if you haven't explicitly disabled it. However, this auto-detection is fragile and Boost will therefore log a warning to the console. Explicitly set the config flag as shown above to silence the warning. diff --git a/apps/docs/content/docs/configuration/configure.mdx b/apps/docs/content/docs/configuration/configure.mdx index aec268ee..7ba7be49 100644 --- a/apps/docs/content/docs/configuration/configure.mdx +++ b/apps/docs/content/docs/configuration/configure.mdx @@ -1,14 +1,14 @@ --- title: Configure the Babel Plugin -description: Control logging, ignores, and optimization behavior. +description: Control logging, ignores, integrations, and optimization behavior. --- -The Babel plugin (`react-native-boost/plugin`) is the core of React Native Boost. - -Defaults are safe and usable out of the box, but you can tune behavior for your app. +The Babel plugin (`react-native-boost/plugin`) is the core of React Native Boost. Its defaults enable all stable optimizations. ## Example Configuration +Only set values that differ from the defaults: + ```js // babel.config.js module.exports = { @@ -16,15 +16,13 @@ module.exports = { [ 'react-native-boost/plugin', { - verbose: false, - silent: false, - unistyles: false, + logLevel: 'debug', ignores: ['node_modules/**'], + integrations: { + unistyles: 'on', + }, optimizations: { - text: true, - view: true, - image: true, - activityIndicator: true, + 'native-activity-indicator': 'off', }, }, ], @@ -36,7 +34,11 @@ module.exports = { -## Plugin Optimization Options +## Optimization Options + +Set an optimization to `on` or `off`. Omitted entries use their documented defaults. + +An optimization with its own options can use the tuple form `[state, options]`. +## Assumptions + +Assumptions let Boost optimize code that static analysis cannot prove safe. + + + A false assumption can change runtime behavior. Be careful and ensure you know what you're doing. + + + + +## Integration Options + +Integrations change Boost behavior for supported third-party libraries. + + + ## Environment-Specific Enablement You can enable React Native Boost by environment with Babel `env` config: diff --git a/apps/docs/content/docs/information/deep-dive.mdx b/apps/docs/content/docs/information/deep-dive.mdx index 7ad96917..048307d2 100644 --- a/apps/docs/content/docs/information/deep-dive.mdx +++ b/apps/docs/content/docs/information/deep-dive.mdx @@ -346,9 +346,7 @@ identifiers, recurses into **local function components** (including `memo()`/`fo it can't prove safety, it returns `unknown` and bails. False-positives (a missed optimization) are, as everywhere in the plugin, preferred over false-negatives (a regression). -The `unknown` case is *often* safe in practice (third-party components rarely wrap children in `Text`), but there are still cases where optimizing components with an `unknown` ancestor could genuinely cause regressions. Therefore, Boost provides -explicit opt-in escape hatches: `dangerouslyOptimizeViewWithUnknownAncestors`, -`dangerouslyOptimizeTextWithUnknownAncestors`, `dangerouslyOptimizeImageWithUnknownAncestors`, and `dangerouslyOptimizeActivityIndicatorWithUnknownAncestors` (see [Configuration](/docs/configuration/configure)). +The `unknown` case is often safe in practice because third-party components rarely wrap children in `Text`, but there are still cases where this can cause regressions. The project-wide `assumptions.unknownAncestorsDoNotRenderText` option provides an opt-in escape hatch to enable optimizations for this case. See [Configuration](/docs/configuration/configure). ### Rewriting and import injection @@ -373,10 +371,9 @@ API lives on the [Runtime Library](/docs/runtime-library) page. The most load-be Boost is built on one strict contract: **never change rendered output, layout, or the accessibility tree.** Skipping a `Text` that could have been optimized just leaves performance on the table; optimizing one that needed the wrapper would be a correctness bug with potential UI or behavior regressions. -Two escape hatches let you override the analysis when *you* know more than the plugin can prove: -[`@boost-force`](/docs/configuration/boost-decorator#boost-force) on a single element, or the -`dangerouslyOptimize*WithUnknownAncestors` options for whole-project ancestor resolution. Both are named -to signal that you've taken ownership of the correctness argument. +Two escape hatches let you override the analysis when you know more than the plugin can prove: +[`@boost-force`](/docs/configuration/boost-decorator#boost-force) on one element, or the +`assumptions.unknownAncestorsDoNotRenderText` option for the full project. Both make you responsible for the resulting behavior. ## React Native's own roadmap @@ -418,6 +415,6 @@ So, **React Native core is optimizing the runtime, while Boost patches the call diff --git a/apps/docs/content/docs/information/optimization-coverage.mdx b/apps/docs/content/docs/information/optimization-coverage.mdx index 616d1a26..2b366b26 100644 --- a/apps/docs/content/docs/information/optimization-coverage.mdx +++ b/apps/docs/content/docs/information/optimization-coverage.mdx @@ -9,10 +9,10 @@ React Native Boost is conservative by design. If it cannot prove an optimization | Component | Optimized when... | Common bailout reasons | | --- | --- | --- | -| `Text` | Imported from `react-native`, no blacklisted props, primitive children, safe ancestor chain | `contains blacklisted props`, `has Text ancestor`, `has unresolved ancestor and dangerous optimization is disabled`, `has unresolved runtime parent that may render Text`, `contains non-primitive children`, `is a direct child of expo-router Link with asChild` | -| `View` | Imported from `react-native`, safe ancestor chain, no spread that may carry a translated prop | `has a spread that may carry a translated prop`, `has both a dynamic id and a nativeID (ambiguous precedence)`, `has Text ancestor`, `has unresolved ancestor and dangerous optimization is disabled` | -| `Image` | Imported from `react-native`, native platform known, supported source/style props, safe ancestor chain | `target platform is unknown`, `has a Unistyles style and there is no lean Image host to route to`, `has an unresolved style source that may be a Unistyles style`, `contains unsupported Image props`, `has a spread that may carry Image wrapper props`, `has Text ancestor`, `has unresolved ancestor and dangerous optimization is disabled` | -| `ActivityIndicator` | Imported from `react-native`, native platform known, direct props only, no children, safe ancestor chain | `target platform is unknown`, `has spread props`, `contains children`, `contains an impure prop expression that cannot be safely reordered`, `has Text ancestor`, `has unresolved ancestor and dangerous optimization is disabled` | +| `Text` | Imported from `react-native`, no blacklisted props, primitive children, safe ancestor chain | `contains blacklisted props`, `has Text ancestor`, `has unresolved ancestor that may render Text`, `contains non-primitive children`, `is a direct child of expo-router Link with asChild` | +| `View` | Imported from `react-native`, safe ancestor chain, no spread that may carry a translated prop | `has a spread that may carry a translated prop`, `has both a dynamic id and a nativeID (ambiguous precedence)`, `has Text ancestor`, `has unresolved ancestor that may render Text` | +| `Image` | Imported from `react-native`, native platform known, supported source/style props, safe ancestor chain | `target platform is unknown`, `has a Unistyles style and there is no lean Image host to route to`, `has an unresolved style source that may be a Unistyles style`, `contains unsupported Image props`, `has a spread that may carry Image wrapper props`, `has Text ancestor`, `has unresolved ancestor that may render Text` | +| `ActivityIndicator` | Imported from `react-native`, native platform known, direct props only, no children, safe ancestor chain | `target platform is unknown`, `has spread props`, `contains children`, `contains an impure prop expression that cannot be safely reordered`, `has Text ancestor`, `has unresolved ancestor that may render Text` | ## Global Bailouts @@ -30,6 +30,8 @@ These skip optimization before component-specific checks: Use `@boost-force` to force optimization on a component that would otherwise be skipped. This bypasses all bailout checks except the `react-native` import check. See the [Decorators](/docs/configuration/boost-decorator#boost-force) page for details. +Set `assumptions.unknownAncestorsDoNotRenderText` to `true` to optimize components under unknown ancestors across the project. This can produce the wrong native host if an unknown ancestor renders a `Text` around its children. + ## Text Coverage `Text` is optimized when all checks pass. @@ -56,18 +58,10 @@ Like `View`, `Text` optimization depends on ancestor classification: - `text`: skip (`has Text ancestor`) โ€” a `Text` nested in another `Text` renders as the inline `NativeVirtualText` host (`RCTVirtualText`), not `NativeText` (`RCTText`), so optimizing it would emit the wrong host. - `unknown`: skip by default -A root `Text` returned by a component or renderer also skips as `has unresolved runtime parent that may render Text`. Its caller can mount it inside another `Text`, which requires `NativeVirtualText` instead of `NativeText`. - -Set `dangerouslyOptimizeTextWithUnknownAncestors: true` to optimize unknown ancestors and runtime parents. - - - Enabling dangerous mode can introduce regressions if an unresolved ancestor or runtime parent renders a `Text` - wrapper. For example, `expo-router`'s `Link` wraps its children in a `` by default. A `Text` under a `Link` - must render as `NativeVirtualText`, and optimizing it would be wrong. - +The project-wide unknown ancestor assumption can optimize this case. A false assumption can introduce regressions. For example, `expo-router`'s `Link` wraps its children in a `Text` by default. A `Text` under that `Link` must render as `NativeVirtualText`. A `Text` used as a direct child of `expo-router` `Link` with `asChild` is **always** skipped -(`is a direct child of expo-router Link with asChild`), even under the dangerous flag, because `Link` makes that child +(`is a direct child of expo-router Link with asChild`), even when the assumption is enabled, because `Link` makes that child pressable. ```tsx @@ -107,12 +101,7 @@ is passed through unchanged. - `text`: skip (`has Text ancestor`) - `unknown`: skip by default -Set `dangerouslyOptimizeViewWithUnknownAncestors: true` to optimize `unknown` ancestors too. - - - Enabling dangerous mode can increase optimization coverage, but it can also introduce regressions if unresolved - ancestors render Text wrappers. - +The project-wide unknown ancestor assumption can optimize this case. A false assumption can introduce regressions if an unresolved ancestor renders a `Text` around its children. ## Image Coverage @@ -127,7 +116,7 @@ The `ActivityIndicator` optimizer replaces the wrapper tree with the same outer It skips elements with spreads, children, impure prop expressions, Unistyles styles, or an unsafe ancestor chain. A spread can change the wrapper's prop precedence. An impure expression could run in a different order after one component expands into two hosts. These cases stay on the React Native wrapper. -Set `dangerouslyOptimizeActivityIndicatorWithUnknownAncestors: true` to optimize unknown ancestors too. This has the same Text-ancestor risk as the View option. +The project-wide unknown ancestor assumption can optimize unknown ancestors. This has the same `Text`-ancestor risk as the other host-component optimizations. ## Spread Props: Resolvable vs Unresolvable diff --git a/apps/docs/content/docs/information/troubleshooting.mdx b/apps/docs/content/docs/information/troubleshooting.mdx index 86d1d2b6..83ef2bf2 100644 --- a/apps/docs/content/docs/information/troubleshooting.mdx +++ b/apps/docs/content/docs/information/troubleshooting.mdx @@ -5,7 +5,7 @@ description: Common setup and optimization issues, plus fast ways to diagnose th ## Quick Diagnostic Flow -1. Set `verbose: true` and `silent: false` in plugin config. +1. Set `logLevel: 'debug'` in the plugin configuration. 2. Restart Metro with cache clear. 3. Check skip reasons in logs. 4. Compare with the coverage rules in [Optimization Coverage](/docs/information/optimization-coverage). @@ -17,7 +17,7 @@ description: Common setup and optimization issues, plus fast ways to diagnose th Likely causes: - Plugin not loaded in `babel.config.js` -- `silent: true` +- `logLevel: 'silent'` - File matched by `ignores` Quick checks: @@ -28,8 +28,7 @@ module.exports = { [ 'react-native-boost/plugin', { - verbose: true, - silent: false, + logLevel: 'debug', }, ], ], @@ -57,18 +56,18 @@ Fix options: A `View` with a spread (`{...props}`) Boost can't statically resolve, or that may contain a prop the `View` wrapper translates (`aria-*`, `tabIndex`, `id`). -### Skip reason: `has unresolved ancestor and dangerous optimization is disabled` +### Skip reason: `has unresolved ancestor that may render Text` -A `View` or `Text` is inside an ancestor React Native Boost cannot statically classify, so it cannot prove the -ancestor is not a `Text` (which would change the correct native host). A common case is a `Text` inside a -third-party wrapper such as `expo-router`'s `Link` (which itself wraps its children in a ``). +A component is inside an ancestor React Native Boost cannot statically classify. Boost cannot prove that the +ancestor does not render a `Text` around its children. That context can require a different native host. A common +case is a `Text` inside a third-party wrapper such as `expo-router`'s `Link`. Options: -- Keep default behavior (safest) +- Keep the default behavior (safest) - Use `@boost-force` on a specific line you have verified is safe -- Refactor ancestor/component structure to be statically obvious -- Enable `dangerouslyOptimizeViewWithUnknownAncestors` / `dangerouslyOptimizeTextWithUnknownAncestors` to override this behavior +- Refactor the ancestor or component structure so Boost can classify it +- Set `assumptions.unknownAncestorsDoNotRenderText` to `true` only if that statement is true across the project ### Skip reason: `has unresolved runtime parent that may render Text` diff --git a/apps/example/babel.config.js b/apps/example/babel.config.js index f8f8eca3..de161bd6 100644 --- a/apps/example/babel.config.js +++ b/apps/example/babel.config.js @@ -6,7 +6,7 @@ module.exports = function (api) { [ 'react-native-boost/plugin', { - unistyles: true, + integrations: { unistyles: 'on' }, ignores: ['node_modules/**', '../../node_modules/**', '**/*.unoptimized.tsx'], }, ], diff --git a/packages/react-native-boost/src/plugin/__tests__/build-time-accessible-default.test.ts b/packages/react-native-boost/src/plugin/__tests__/build-time-accessible-default.test.ts index d6f73a98..23be2e5b 100644 --- a/packages/react-native-boost/src/plugin/__tests__/build-time-accessible-default.test.ts +++ b/packages/react-native-boost/src/plugin/__tests__/build-time-accessible-default.test.ts @@ -2,17 +2,15 @@ import { describe, it, expect } from 'vitest'; import { transformSync, type TransformCaller } from '@babel/core'; import boostPlugin from '../index'; -// Compile a bare `` with the given Metro platform. The assumption marks this isolated test root as safe. +// Compile a bare `` (common path: no accessibility props) with the given Babel caller platform, +// mirroring how Metro invokes the plugin per platform bundle. const compile = (platform?: string): string => transformSync(`import { Text } from 'react-native';\nexport default () => hi;`, { configFile: false, babelrc: false, filename: 'case.jsx', caller: (platform ? { name: 'metro', platform } : { name: 'test' }) as TransformCaller, - plugins: [ - '@babel/plugin-syntax-jsx', - [boostPlugin, { silent: true, dangerouslyOptimizeTextWithUnknownAncestors: true }], - ], + plugins: ['@babel/plugin-syntax-jsx', [boostPlugin, { logLevel: 'silent' }]], })!.code!; describe('build-time `accessible` default', () => { diff --git a/packages/react-native-boost/src/plugin/__tests__/nesting.test.ts b/packages/react-native-boost/src/plugin/__tests__/nesting.test.ts index 0bc38ffc..605d531d 100644 --- a/packages/react-native-boost/src/plugin/__tests__/nesting.test.ts +++ b/packages/react-native-boost/src/plugin/__tests__/nesting.test.ts @@ -5,7 +5,7 @@ import { formatTestResult } from '../utils/format-test-result'; pluginTester({ plugin, - pluginOptions: { silent: true }, + pluginOptions: { logLevel: 'silent' }, title: 'nesting', fixtures: path.resolve(import.meta.dirname, 'fixtures-nesting'), babelOptions: { @@ -16,7 +16,7 @@ pluginTester({ pluginTester({ plugin, - pluginOptions: { silent: true, unistyles: true }, + pluginOptions: { logLevel: 'silent', integrations: { unistyles: 'on' } }, title: 'nesting unistyles', fixtures: path.resolve(import.meta.dirname, 'fixtures-nesting-unistyles'), babelOptions: { diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/boost.ts b/packages/react-native-boost/src/plugin/__tests__/parity/boost.ts index 60fbe986..a6b3bf6b 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/boost.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/boost.ts @@ -18,10 +18,10 @@ interface BoostOptimized { /** * Transform a JSX body with the full Boost plugin under the given platform (mirroring how Metro builds - * per platform, so the plugin inlines build-time defaults exactly as in production). The generated - * component is rendered at the test root, so that runtime parent is safe unless a test says otherwise. + * per platform, so the plugin inlines build-time defaults exactly as in production). Returns the + * generated code. */ -function transformBoostCase(os: PlatformOS, jsxBody: string, preamble = '', runtimeParentIsSafe = true): string { +function transformBoostCase(os: PlatformOS, jsxBody: string, preamble = ''): string { setPlatformOS(os); const source = `import { ActivityIndicator, Image, Text, View } from 'react-native';\n${preamble}\n` + @@ -32,7 +32,7 @@ function transformBoostCase(os: PlatformOS, jsxBody: string, preamble = '', runt filename: 'boost-case.jsx', caller: { name: 'metro', platform: os } as TransformCaller, presets: [['@babel/preset-react', { runtime: 'automatic' }]], - plugins: [[boostPlugin, { silent: true, dangerouslyOptimizeTextWithUnknownAncestors: runtimeParentIsSafe }]], + plugins: [[boostPlugin, { logLevel: 'silent' }]], }); return out!.code!; } @@ -42,8 +42,8 @@ function transformBoostCase(os: PlatformOS, jsxBody: string, preamble = '', runt * element. A compile-only check (no render), so nested snippets that produce multiple hosts can assert * deferral without tripping {@link renderAndCaptureSingle}. */ -export function boostOptimizes(os: PlatformOS, jsxBody: string, preamble = '', runtimeParentIsSafe = true): boolean { - return transformBoostCase(os, jsxBody, preamble, runtimeParentIsSafe).includes(RUNTIME_MODULE_NAME); +export function boostOptimizes(os: PlatformOS, jsxBody: string): boolean { + return transformBoostCase(os, jsxBody).includes(RUNTIME_MODULE_NAME); } /** diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/fibers.collect.ts b/packages/react-native-boost/src/plugin/__tests__/parity/fibers.collect.ts index ac4a003a..d706b74f 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/fibers.collect.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/fibers.collect.ts @@ -47,7 +47,7 @@ async function compile(source: string, tag: string, boost: boolean): Promise { api.assertVersion(7); - const options = (rawOptions ?? {}) as PluginOptions; - const logger = createLogger({ - verbose: options.verbose === true, - silent: options.silent === true, - }); + const options = validatePluginOptions(rawOptions ?? {}); + const logger = createLogger(options.logLevel ?? 'info'); // Target platform, resolved at build time. Metro sets this on the Babel caller per platform bundle, // letting optimizers inline platform-specific defaults instead of deferring them to the runtime. @@ -25,18 +32,18 @@ export default declare((api, rawOptions, dirname?: string) => { normalizeTargetPlatform((caller as { platform?: string } | undefined)?.platform) ); - // Resolve "Unistyles mode" once per plugin instance. An explicit `unistyles` flag always wins; - // otherwise auto-detect an installed `react-native-unistyles` and, when found, enable the mode but - // hint to set the flag explicitly โ€” a detected package does not prove its Babel plugin is active. - const autoDetectedUnistyles = options.unistyles === undefined && isUnistylesInstalled(dirname); - const unistylesEnabled = options.unistyles === true || autoDetectedUnistyles; + // A detected package does not prove its Babel plugin is active, so auto-detection still asks users + // to configure the integration explicitly. + const unistylesMode = options.integrations?.unistyles ?? 'auto'; + const autoDetectedUnistyles = unistylesMode === 'auto' && isUnistylesInstalled(dirname); + const unistylesEnabled = unistylesMode === 'on' || autoDetectedUnistyles; if (autoDetectedUnistyles) { logger.warning({ message: 'react-native-unistyles was detected, so Unistyles mode was enabled automatically. Set ' + - '`unistyles: true` in the react-native-boost plugin options to make this explicit, or ' + - '`unistyles: false` to opt out.', + "`integrations: { unistyles: 'on' }` in the react-native-boost plugin options to make this explicit, or " + + "`integrations: { unistyles: 'off' }` to opt out.", }); } @@ -45,16 +52,27 @@ export default declare((api, rawOptions, dirname?: string) => { visitor: { JSXOpeningElement(path) { if (isIgnoredFile(path, options.ignores ?? [])) return; - if (options.optimizations?.text !== false) textOptimizer(path, logger, options, platform, unistylesEnabled); - if (options.optimizations?.view !== false) viewOptimizer(path, logger, options, platform, unistylesEnabled); - if (options.optimizations?.image !== false) imageOptimizer(path, logger, options, platform, unistylesEnabled); - if (options.optimizations?.activityIndicator !== false) + if (isOptimizationEnabled(options, 'native-text')) + textOptimizer(path, logger, options, platform, unistylesEnabled); + if (isOptimizationEnabled(options, 'native-view')) + viewOptimizer(path, logger, options, platform, unistylesEnabled); + if (isOptimizationEnabled(options, 'native-image')) + imageOptimizer(path, logger, options, platform, unistylesEnabled); + if (isOptimizationEnabled(options, 'native-activity-indicator')) activityIndicatorOptimizer(path, logger, options, platform, unistylesEnabled); }, }, }; }); +function isOptimizationEnabled( + options: PluginOptions, + name: keyof NonNullable +): boolean { + const setting = options.optimizations?.[name]; + return (Array.isArray(setting) ? setting[0] : setting) !== 'off'; +} + function normalizeTargetPlatform(platform?: string): TargetPlatform | undefined { return platform === 'ios' || platform === 'android' || platform === 'web' ? platform : undefined; } diff --git a/packages/react-native-boost/src/plugin/optimizers/activity-indicator/__tests__/index.test.ts b/packages/react-native-boost/src/plugin/optimizers/activity-indicator/__tests__/index.test.ts index b357851a..ea9b64ce 100644 --- a/packages/react-native-boost/src/plugin/optimizers/activity-indicator/__tests__/index.test.ts +++ b/packages/react-native-boost/src/plugin/optimizers/activity-indicator/__tests__/index.test.ts @@ -7,11 +7,11 @@ import { generateTestPlugin } from '../../../utils/generate-test-plugin'; const transformActivityIndicator = ( source: string, platform?: TargetPlatform, - options: { dangerous?: boolean; unistyles?: boolean } = {} + options: { unknownAncestorsDoNotRenderText?: boolean; unistylesEnabled?: boolean } = {} ): string => { const pluginOptions: PluginOptions = { - dangerouslyOptimizeActivityIndicatorWithUnknownAncestors: options.dangerous, - unistyles: options.unistyles, + assumptions: { unknownAncestorsDoNotRenderText: options.unknownAncestorsDoNotRenderText }, + integrations: { unistyles: options.unistylesEnabled ? 'on' : 'off' }, }; return transformSync(source, { configFile: false, @@ -100,7 +100,7 @@ describe('ActivityIndicator optimizer', () => { ); }); - it('bails on Unistyles styles and permits dangerous unknown ancestors', () => { + it('bails on Unistyles styles and permits the unknown ancestor assumption', () => { const unistyles = transformActivityIndicator( ` import { ActivityIndicator } from 'react-native'; @@ -109,15 +109,15 @@ describe('ActivityIndicator optimizer', () => { ; `, 'ios', - { unistyles: true } + { unistylesEnabled: true } ); expect(unistyles).not.toContain('_NativeActivityIndicator'); - const dangerous = transformActivityIndicator( + const assumed = transformActivityIndicator( `import { ActivityIndicator } from 'react-native'; import { Wrapper } from './wrapper'; ;`, 'ios', - { dangerous: true } + { unknownAncestorsDoNotRenderText: true } ); - expect(dangerous).toContain('_NativeActivityIndicator'); + expect(assumed).toContain('_NativeActivityIndicator'); }); }); diff --git a/packages/react-native-boost/src/plugin/optimizers/activity-indicator/index.ts b/packages/react-native-boost/src/plugin/optimizers/activity-indicator/index.ts index 3f9b037e..937ee6ef 100644 --- a/packages/react-native-boost/src/plugin/optimizers/activity-indicator/index.ts +++ b/packages/react-native-boost/src/plugin/optimizers/activity-indicator/index.ts @@ -64,7 +64,7 @@ export const activityIndicatorOptimizer: Optimizer = (path, logger, options, pla reason: 'has an unresolved style source that may be a Unistyles style', shouldBail: () => getStyleOrigin() === 'unknown', }, - ...ancestorBailoutChecks(path, options?.dangerouslyOptimizeActivityIndicatorWithUnknownAncestors === true), + ...ancestorBailoutChecks(path, options?.assumptions?.unknownAncestorsDoNotRenderText === true), ]; const hardSkipReason = getFirstBailoutReason(hardChecks); diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts index 4a3192eb..3e080a8a 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts +++ b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts @@ -13,19 +13,19 @@ const transformImage = async ( source: string, platform: TargetPlatform, { - dangerouslyOptimizeImageWithUnknownAncestors = false, + unknownAncestorsDoNotRenderText = false, unistylesEnabled = false, }: { - dangerouslyOptimizeImageWithUnknownAncestors?: boolean; + unknownAncestorsDoNotRenderText?: boolean; unistylesEnabled?: boolean; } = {} ): Promise => { - const logger = createLogger({ silent: true, verbose: false }); + const logger = createLogger('silent'); const plugin = (): PluginObj => ({ name: `${platform}-image-optimizer-test`, visitor: { JSXOpeningElement(path) { - imageOptimizer(path, logger, { dangerouslyOptimizeImageWithUnknownAncestors }, platform, unistylesEnabled); + imageOptimizer(path, logger, { assumptions: { unknownAncestorsDoNotRenderText } }, platform, unistylesEnabled); }, }, }); @@ -117,8 +117,8 @@ pluginTester({ }); pluginTester({ - plugin: generateTestPlugin(imageOptimizer, { dangerouslyOptimizeImageWithUnknownAncestors: true }, 'ios'), - title: 'image dangerous unknown ancestors', + plugin: generateTestPlugin(imageOptimizer, { assumptions: { unknownAncestorsDoNotRenderText: true } }, 'ios'), + title: 'image unknown ancestor assumption', babelOptions: { plugins: ['@babel/plugin-syntax-jsx'], }, @@ -403,7 +403,7 @@ describe('image unistyles', () => { describe('image unknown platform output', () => { it('bails because the native Image host prop contract is platform-specific', async () => { - const logger = createLogger({ silent: true, verbose: false }); + const logger = createLogger('silent'); const plugin = (): PluginObj => ({ name: 'unknown-platform-image-optimizer-test', visitor: { diff --git a/packages/react-native-boost/src/plugin/optimizers/image/index.ts b/packages/react-native-boost/src/plugin/optimizers/image/index.ts index 75f2ea95..493f2521 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/index.ts +++ b/packages/react-native-boost/src/plugin/optimizers/image/index.ts @@ -128,7 +128,7 @@ export const imageOptimizer: Optimizer = (path, logger, options, platform, unist reason: 'has an unresolved style source that may be a Unistyles style', shouldBail: () => getStyleOrigin() === 'unknown', }, - ...ancestorBailoutChecks(path, options?.dangerouslyOptimizeImageWithUnknownAncestors === true), + ...ancestorBailoutChecks(path, options?.assumptions?.unknownAncestorsDoNotRenderText === true), ]; const hardSkipReason = getFirstBailoutReason(hardChecks); diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/index.test.ts b/packages/react-native-boost/src/plugin/optimizers/text/__tests__/index.test.ts index 799e4e2f..cc3f0ba9 100644 --- a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/index.test.ts +++ b/packages/react-native-boost/src/plugin/optimizers/text/__tests__/index.test.ts @@ -14,10 +14,8 @@ pluginTester({ formatResult: formatTestResult, }); -// Fixtures whose `'unknown'` ancestor bail is lifted by the dangerous flag. The expo-router cases also -// pin that the `asChild` bail is independent of the flag: a Text directly inside `` still -// bails (it would be made pressable), while a Text under a plain `` optimizes. -const dangerousUnknownAncestorFixtures = [ +// The expo-router cases also pin that the `asChild` bail is independent of the ancestor assumption. +const unknownAncestorAssumptionFixtures = [ 'text-under-unknown-ancestor', 'text-with-runtime-parent', 'expo-router-link-as-child', @@ -29,14 +27,14 @@ const dangerousUnknownAncestorFixtures = [ pluginTester({ plugin: generateTestPlugin(textOptimizer, { - dangerouslyOptimizeTextWithUnknownAncestors: true, + assumptions: { unknownAncestorsDoNotRenderText: true }, }), - title: 'text dangerous unknown ancestors', + title: 'text unknown ancestor assumption', babelOptions: { plugins: ['@babel/plugin-syntax-jsx'], }, formatResult: formatTestResult, - tests: dangerousUnknownAncestorFixtures.map((name) => ({ + tests: unknownAncestorAssumptionFixtures.map((name) => ({ title: name, fixture: path.resolve(import.meta.dirname, `fixtures/${name}/code.js`), outputFixture: path.resolve(import.meta.dirname, `fixtures/${name}/dangerous-output.js`), @@ -44,7 +42,7 @@ pluginTester({ }); pluginTester({ - plugin: generateTestPlugin(textOptimizer, { unistyles: true }), + plugin: generateTestPlugin(textOptimizer, { integrations: { unistyles: 'on' } }), title: 'text unistyles', fixtures: path.resolve(import.meta.dirname, 'fixtures-unistyles'), babelOptions: { @@ -54,7 +52,7 @@ pluginTester({ }); pluginTester({ - plugin: generateTestPlugin(textOptimizer, { unistyles: true }), + plugin: generateTestPlugin(textOptimizer, { integrations: { unistyles: 'on' } }), title: 'text unistyles typescript', fixtures: path.resolve(import.meta.dirname, 'fixtures-unistyles-ts'), babelOptions: { diff --git a/packages/react-native-boost/src/plugin/optimizers/text/index.ts b/packages/react-native-boost/src/plugin/optimizers/text/index.ts index fef8d2fb..810ba152 100644 --- a/packages/react-native-boost/src/plugin/optimizers/text/index.ts +++ b/packages/react-native-boost/src/plugin/optimizers/text/index.ts @@ -22,7 +22,6 @@ import { extractSelectableAndUpdateStyle, tryBuildStaticTextStyle, ancestorBailoutChecks, - inheritsTextContextFromRuntimeParent, createStyleOriginResolver, UNISTYLES_TEXT_HOST, } from '../../utils/common'; @@ -121,12 +120,7 @@ export const textOptimizer: Optimizer = (path, logger, options, platform, unisty reason: 'contains non-primitive children', shouldBail: () => hasInvalidChildren(path, parent), }, - { - reason: 'has unresolved runtime parent that may render Text', - shouldBail: () => - options?.dangerouslyOptimizeTextWithUnknownAncestors !== true && inheritsTextContextFromRuntimeParent(path), - }, - ...ancestorBailoutChecks(path, options?.dangerouslyOptimizeTextWithUnknownAncestors === true), + ...ancestorBailoutChecks(path, options?.assumptions?.unknownAncestorsDoNotRenderText === true), ]; if (forced) { diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/index.test.ts b/packages/react-native-boost/src/plugin/optimizers/view/__tests__/index.test.ts index 7d303a95..1a3d07b0 100644 --- a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/index.test.ts +++ b/packages/react-native-boost/src/plugin/optimizers/view/__tests__/index.test.ts @@ -16,9 +16,9 @@ pluginTester({ pluginTester({ plugin: generateTestPlugin(viewOptimizer, { - dangerouslyOptimizeViewWithUnknownAncestors: true, + assumptions: { unknownAncestorsDoNotRenderText: true }, }), - title: 'view dangerous unknown ancestors', + title: 'view unknown ancestor assumption', babelOptions: { plugins: ['@babel/plugin-syntax-jsx'], }, @@ -33,7 +33,7 @@ pluginTester({ }); pluginTester({ - plugin: generateTestPlugin(viewOptimizer, { unistyles: true }), + plugin: generateTestPlugin(viewOptimizer, { integrations: { unistyles: 'on' } }), title: 'view unistyles', fixtures: path.resolve(import.meta.dirname, 'fixtures-unistyles'), babelOptions: { diff --git a/packages/react-native-boost/src/plugin/optimizers/view/index.ts b/packages/react-native-boost/src/plugin/optimizers/view/index.ts index 26c13307..b33bb3d4 100644 --- a/packages/react-native-boost/src/plugin/optimizers/view/index.ts +++ b/packages/react-native-boost/src/plugin/optimizers/view/index.ts @@ -81,7 +81,7 @@ export const viewOptimizer: Optimizer = (path, logger, options, _platform, unist reason: 'has both a dynamic `id` and a `nativeID` (ambiguous precedence)', shouldBail: () => hasAmbiguousIdNativeID(path), }, - ...ancestorBailoutChecks(path, options?.dangerouslyOptimizeViewWithUnknownAncestors === true), + ...ancestorBailoutChecks(path, options?.assumptions?.unknownAncestorsDoNotRenderText === true), ]; if (forced) { diff --git a/packages/react-native-boost/src/plugin/types/index.ts b/packages/react-native-boost/src/plugin/types/index.ts index 3428bf1f..a108d2a2 100644 --- a/packages/react-native-boost/src/plugin/types/index.ts +++ b/packages/react-native-boost/src/plugin/types/index.ts @@ -1,112 +1,90 @@ import { NodePath, types as t } from '@babel/core'; +export type OptimizationState = 'on' | 'off'; + +export type OptimizationSetting = OptimizationState | [state: OptimizationState, options: Options]; + export interface PluginOptimizationOptions { /** - * Whether to optimize the `Text` component. - * @default true + * Replaces the React Native `Text` wrapper with its native host. + * @default 'on' */ - text?: boolean; + 'native-text'?: OptimizationSetting; /** - * Whether to optimize the `View` component. - * @default true + * Replaces the React Native `View` wrapper with its native host. + * @default 'on' */ - view?: boolean; + 'native-view'?: OptimizationSetting; /** - * Whether to optimize the `Image` component. - * @default true + * Replaces the React Native `Image` wrapper with its native host. + * @default 'on' */ - image?: boolean; + 'native-image'?: OptimizationSetting; /** - * Whether to optimize the `ActivityIndicator` component. - * @default true + * Replaces the React Native `ActivityIndicator` wrapper with its native hosts. + * @default 'on' */ - activityIndicator?: boolean; + 'native-activity-indicator'?: OptimizationSetting; } -export interface PluginOptions { - /** - * Paths to ignore from optimization. - * - * Patterns are resolved from Babel's current working directory. - * In nested monorepo apps, parent segments may be needed, for example `../../node_modules/**`. - * @default [] - */ - ignores?: string[]; +export interface PluginAssumptions { /** - * Enables verbose logging. + * Assume unresolved ancestor components do not render a React Native `Text` around their children. * - * With `silent: false`, optimized components are logged by default. - * When enabled, skipped components and their skip reasons are also logged. + * This increases optimization coverage, but can emit the wrong native host when the assumption is false. + * Enable it only after you verify this behavior across the project. * @default false */ - verbose?: boolean; + unknownAncestorsDoNotRenderText?: boolean; +} + +export type IntegrationState = 'auto' | 'on' | 'off'; + +export interface PluginIntegrationOptions { /** - * Disables all plugin logs. + * Keeps `react-native-unistyles` reactivity working on optimized elements. * - * When set to `true`, this overrides `verbose`. - * @default false + * `auto` detects an installed `react-native-unistyles` package and logs a warning when found. Use `on` + * when the project uses Unistyles, or `off` when the package is installed but not used in transformed code. + * @default 'auto' */ - silent?: boolean; + unistyles?: IntegrationState; +} + +export type LogLevel = 'silent' | 'warn' | 'info' | 'debug'; + +export interface PluginOptions { /** - * Toggle individual optimizers. - * - * If omitted, all optimizers are enabled. + * Configures individual optimizations. Omitted entries use their documented defaults. + * @default {} */ optimizations?: PluginOptimizationOptions; /** - * Enables "Unistyles mode": keep `react-native-unistyles` reactivity working on optimized elements. - * - * When enabled, a `Text`/`View` whose `style` resolves to a Unistyles `StyleSheet.create` style is - * rewritten to Unistyles' own lean host (so its shadow-tree registration survives and theme/breakpoint/ - * variant updates keep working) instead of Boost's raw host; a `Text`/`View` with an unresolvable - * direct `style` (e.g. `style={props.style}`, a function call) is left untouched, because it could be a - * Unistyles style arriving from elsewhere; plain/RN styles still optimize to Boost's host as usual. - * - * Style origin is resolved within a single file only (cross-file stylesheets count as unresolvable). - * - * When omitted, the plugin auto-detects whether `react-native-unistyles` is installed and enables this - * if so (and logs a one-time hint to set the flag explicitly). Set to `false` to force it off even when - * Unistyles is installed. - * @default undefined (auto-detected) - */ - unistyles?: boolean; - /** - * Opt-in flag that allows View optimization when ancestor components cannot be statically resolved. - * - * This increases optimization coverage, but may introduce behavioral differences - * when unresolved ancestors render React Native `Text` wrappers. - * Prefer targeted ignores first, and enable this only after verifying affected screens. - * @default false + * Declares project-wide facts that let Boost apply optimizations it cannot prove safe by static analysis. + * @default {} */ - dangerouslyOptimizeViewWithUnknownAncestors?: boolean; + assumptions?: PluginAssumptions; /** - * Opt-in flag that allows Text optimization when ancestors or runtime parents cannot be statically resolved. - * - * This increases optimization coverage, but may introduce behavioral differences when an unresolved - * ancestor or runtime parent renders a React Native `Text` wrapper: a nested `Text` must render as the - * inline `NativeVirtualText` host rather than `NativeText`, and optimizing it would emit the wrong host. - * Prefer targeted `@boost-force` first, and enable this only after verifying affected screens. - * @default false + * Configures behavior for supported third-party libraries. + * @default {} */ - dangerouslyOptimizeTextWithUnknownAncestors?: boolean; + integrations?: PluginIntegrationOptions; /** - * Opt-in flag that allows Image optimization when ancestor components cannot be statically resolved. + * Paths to ignore from optimization. * - * This increases optimization coverage, but may introduce behavioral differences when an unresolved - * ancestor renders a React Native `Text` wrapper: Android images under text render through the inline - * image host rather than the normal image view, and optimizing them would emit the wrong host. - * Prefer targeted `@boost-force` first, and enable this only after verifying affected screens. - * @default false + * Patterns are resolved from Babel's current working directory. + * In nested monorepo apps, parent segments may be needed, for example `../../node_modules/**`. + * @default [] */ - dangerouslyOptimizeImageWithUnknownAncestors?: boolean; + ignores?: string[]; /** - * Opt-in flag that allows ActivityIndicator optimization when ancestor components cannot be statically resolved. + * Controls plugin logging. * - * This can change Text ancestor context when an unresolved ancestor renders a React Native `Text` wrapper. - * Prefer targeted `@boost-force` first, and enable this only after verifying affected screens. - * @default false + * `warn` logs warnings and forced optimizations. `info` also logs successful optimizations. `debug` + * also logs skipped optimizations and their reasons. `silent` disables all logs. + * @default 'info' */ - dangerouslyOptimizeActivityIndicatorWithUnknownAncestors?: boolean; + logLevel?: LogLevel; } export type OptimizableComponent = 'Text' | 'View' | 'Image' | 'ActivityIndicator'; @@ -142,8 +120,8 @@ export type Optimizer = ( /** Target platform from Babel's caller (e.g. Metro sets `'ios'`/`'android'`). Lets optimizers resolve platform-specific defaults at build time. */ platform?: TargetPlatform, /** - * Whether "Unistyles mode" is active for this build (resolved once at plugin init from the `unistyles` - * option + install auto-detection). When `true`, optimizers classify each element's `style` origin and + * Whether "Unistyles mode" is active for this build (resolved once at plugin init from the integration + * setting and install auto-detection). When `true`, optimizers classify each element's `style` origin and * route Unistyles styles to Unistyles' lean host instead of Boost's raw host. */ unistylesEnabled?: boolean diff --git a/packages/react-native-boost/src/plugin/utils/__tests__/logger.test.ts b/packages/react-native-boost/src/plugin/utils/__tests__/logger.test.ts index 2740a29d..c64960c3 100644 --- a/packages/react-native-boost/src/plugin/utils/__tests__/logger.test.ts +++ b/packages/react-native-boost/src/plugin/utils/__tests__/logger.test.ts @@ -7,9 +7,9 @@ describe('logger', () => { vi.restoreAllMocks(); }); - it('logs optimized components by default', () => { + it('logs optimized components at the default info level', () => { const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {}); - const logger = createLogger({ verbose: false, silent: false }); + const logger = createLogger(); const path = createMockPath('/app/screens/LoginScreen.tsx', 42); logger.optimized({ component: 'Text', path }); @@ -19,26 +19,39 @@ describe('logger', () => { expect(String(consoleSpy.mock.calls[0][0])).toContain('Optimized Text in /app/screens/LoginScreen.tsx:42'); }); - it('logs skipped components and reasons when verbose is enabled', () => { + it('logs skipped components and reasons at the debug level', () => { const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {}); - const logger = createLogger({ verbose: true, silent: false }); + const logger = createLogger('debug'); const path = createMockPath('/app/screens/Settings.tsx', 10); logger.skipped({ component: 'View', path, - reason: 'has unresolved ancestor and dangerous optimization is disabled', + reason: 'has unresolved ancestor that may render Text', }); expect(consoleSpy).toHaveBeenCalledTimes(1); expect(String(consoleSpy.mock.calls[0][0])).toContain( - 'Skipped View in /app/screens/Settings.tsx:10 (has unresolved ancestor and dangerous optimization is disabled)' + 'Skipped View in /app/screens/Settings.tsx:10 (has unresolved ancestor that may render Text)' ); }); - it('disables all logs when silent is enabled', () => { + it('logs only warnings and forced optimizations at the warn level', () => { const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {}); - const logger = createLogger({ verbose: true, silent: true }); + const logger = createLogger('warn'); + const path = createMockPath('/app/screens/Profile.tsx', 7); + + logger.optimized({ component: 'Text', path }); + logger.skipped({ component: 'View', path, reason: 'line is marked with @boost-ignore' }); + logger.warning({ component: 'Text', path, message: 'numberOfLines is invalid' }); + logger.forced({ component: 'View', path, reason: 'contains unsupported props' }); + + expect(consoleSpy).toHaveBeenCalledTimes(2); + }); + + it('disables all logs at the silent level', () => { + const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {}); + const logger = createLogger('silent'); const path = createMockPath('/app/screens/Profile.tsx', 7); logger.optimized({ component: 'Text', path }); diff --git a/packages/react-native-boost/src/plugin/utils/__tests__/options.test.ts b/packages/react-native-boost/src/plugin/utils/__tests__/options.test.ts new file mode 100644 index 00000000..ec316f00 --- /dev/null +++ b/packages/react-native-boost/src/plugin/utils/__tests__/options.test.ts @@ -0,0 +1,56 @@ +import { transformSync } from '@babel/core'; +import { describe, expect, it } from 'vitest'; +import boostPlugin from '../../index'; +import { validatePluginOptions } from '../options'; + +describe('plugin options', () => { + it('accepts the current configuration', () => { + const options = { + optimizations: { 'native-image': 'off' as const }, + assumptions: { unknownAncestorsDoNotRenderText: true }, + integrations: { unistyles: 'on' as const }, + ignores: ['node_modules/**'], + logLevel: 'info' as const, + }; + + expect(validatePluginOptions(options)).toEqual(options); + }); + + it('disables an optimization with its public name', () => { + const output = transformSync(`import { Text } from 'react-native'; Hello;`, { + configFile: false, + babelrc: false, + plugins: [ + '@babel/plugin-syntax-jsx', + [boostPlugin, { logLevel: 'silent', optimizations: { 'native-text': 'off' } }], + ], + })!.code!; + + expect(output).toContain('Hello'); + expect(output).not.toContain('NativeText'); + }); + + it.each([ + [{ silent: true }, 'Use `logLevel` instead.'], + [{ unistyles: true }, 'Use `integrations.unistyles` instead.'], + [ + { dangerouslyOptimizeTextWithUnknownAncestors: true }, + 'Use `assumptions.unknownAncestorsDoNotRenderText` instead.', + ], + [{ optimizations: { text: false } }, 'Use `native-text` instead.'], + ])('rejects removed configuration %#', (options, message) => { + expect(() => validatePluginOptions(options)).toThrow(message); + }); + + it.each([ + [{ unknown: true }, 'Unknown plugin option `unknown`.'], + [{ optimizations: { unknown: 'on' } }, 'Unknown optimization `unknown`.'], + [{ assumptions: { unknown: true } }, 'Unknown assumption `unknown`.'], + [{ integrations: { unknown: 'on' } }, 'Unknown integration `unknown`.'], + [{ logLevel: 'verbose' }, '`logLevel` must be one of'], + [{ optimizations: { 'native-text': true } }, 'must be `on` or `off`'], + [{ integrations: { unistyles: true } }, 'must be `auto`, `on`, or `off`'], + ])('rejects invalid configuration %#', (options, message) => { + expect(() => validatePluginOptions(options)).toThrow(message); + }); +}); diff --git a/packages/react-native-boost/src/plugin/utils/common/validation.ts b/packages/react-native-boost/src/plugin/utils/common/validation.ts index 1e28e6c0..72f7dede 100644 --- a/packages/react-native-boost/src/plugin/utils/common/validation.ts +++ b/packages/react-native-boost/src/plugin/utils/common/validation.ts @@ -190,17 +190,13 @@ export const inheritsTextContextFromRuntimeParent = (path: NodePath, - dangerousOptimizationEnabled: boolean + unknownAncestorsDoNotRenderText: boolean ): BailoutCheck[] => { let classification: AncestorClassification | undefined; const classify = () => (classification ??= getAncestorClassification(path)); @@ -211,8 +207,8 @@ export const ancestorBailoutChecks = ( shouldBail: () => classify() === 'text', }, { - reason: 'has unresolved ancestor and dangerous optimization is disabled', - shouldBail: () => classify() === 'unknown' && !dangerousOptimizationEnabled, + reason: 'has unresolved ancestor that may render Text', + shouldBail: () => classify() === 'unknown' && !unknownAncestorsDoNotRenderText, }, ]; }; diff --git a/packages/react-native-boost/src/plugin/utils/generate-test-plugin.ts b/packages/react-native-boost/src/plugin/utils/generate-test-plugin.ts index 1d61f3e7..49edfd59 100644 --- a/packages/react-native-boost/src/plugin/utils/generate-test-plugin.ts +++ b/packages/react-native-boost/src/plugin/utils/generate-test-plugin.ts @@ -3,10 +3,7 @@ import { Optimizer, PluginOptions, TargetPlatform } from '../types'; import { createLogger } from './logger'; export const generateTestPlugin = (optimizer: Optimizer, options: PluginOptions = {}, platform?: TargetPlatform) => { - const logger = createLogger({ - verbose: false, - silent: true, - }); + const logger = createLogger('silent'); return declare((api) => { api.assertVersion(7); @@ -15,9 +12,8 @@ export const generateTestPlugin = (optimizer: Optimizer, options: PluginOptions name: 'react-native-boost', visitor: { JSXOpeningElement(path) { - // Mirror the real plugin's explicit-flag resolution for Unistyles mode (auto-detection is not - // exercised in fixtures); a fixture opts in with `{ unistyles: true }`. - optimizer(path, logger, options, platform, options.unistyles === true); + // Auto-detection is not exercised in fixtures. + optimizer(path, logger, options, platform, options.integrations?.unistyles === 'on'); }, }, }; diff --git a/packages/react-native-boost/src/plugin/utils/logger.ts b/packages/react-native-boost/src/plugin/utils/logger.ts index f349af54..1f5c3859 100644 --- a/packages/react-native-boost/src/plugin/utils/logger.ts +++ b/packages/react-native-boost/src/plugin/utils/logger.ts @@ -1,6 +1,7 @@ import { styleText } from 'node:util'; import { HubFile, + LogLevel, OptimizationLogPayload, PluginLogger, SkippedOptimizationLogPayload, @@ -16,15 +17,16 @@ export const noopLogger: PluginLogger = { warning() {}, }; -export const createLogger = ({ verbose, silent }: { verbose: boolean; silent: boolean }): PluginLogger => { - if (silent) return noopLogger; +export const createLogger = (logLevel: LogLevel = 'info'): PluginLogger => { + if (logLevel === 'silent') return noopLogger; return { optimized(payload) { + if (logLevel === 'warn') return; writeLog('optimized', `Optimized ${payload.component} in ${formatPathLocation(payload.path)}`); }, skipped(payload) { - if (!verbose) return; + if (logLevel !== 'debug') return; writeLog('skipped', `Skipped ${payload.component} in ${formatPathLocation(payload.path)} (${payload.reason})`); }, forced(payload) { @@ -55,14 +57,14 @@ function formatWarningContext(payload: WarningLogPayload): string { return location; } -type LogLevel = 'optimized' | 'skipped' | 'forced' | 'warning'; +type LogCategory = 'optimized' | 'skipped' | 'forced' | 'warning'; -function writeLog(level: LogLevel, message: string): void { +function writeLog(level: LogCategory, message: string): void { const levelTag = formatLevel(level); console.log(`${LOG_PREFIX} ${levelTag} ${message}`); } -function formatLevel(level: LogLevel): string { +function formatLevel(level: LogCategory): string { if (level === 'optimized') return styleText('green', '[optimized]'); if (level === 'skipped') return styleText('yellow', '[skipped]'); if (level === 'forced') return styleText('red', '[forced]'); diff --git a/packages/react-native-boost/src/plugin/utils/options.ts b/packages/react-native-boost/src/plugin/utils/options.ts new file mode 100644 index 00000000..e52c96f0 --- /dev/null +++ b/packages/react-native-boost/src/plugin/utils/options.ts @@ -0,0 +1,104 @@ +import type { IntegrationState, LogLevel, OptimizationState, PluginOptions } from '../types'; +import PluginError from './plugin-error'; + +const pluginOptionKeys = ['optimizations', 'assumptions', 'integrations', 'ignores', 'logLevel']; +const optimizationKeys = ['native-text', 'native-view', 'native-image', 'native-activity-indicator']; +const assumptionKeys = ['unknownAncestorsDoNotRenderText']; +const integrationKeys = ['unistyles']; +const optimizationStates: OptimizationState[] = ['on', 'off']; +const integrationStates: IntegrationState[] = ['auto', 'on', 'off']; +const logLevels: LogLevel[] = ['silent', 'warn', 'info', 'debug']; + +const legacyPluginOptions: Record = { + verbose: 'Use `logLevel` instead.', + silent: 'Use `logLevel` instead.', + unistyles: 'Use `integrations.unistyles` instead.', + dangerouslyOptimizeViewWithUnknownAncestors: 'Use `assumptions.unknownAncestorsDoNotRenderText` instead.', + dangerouslyOptimizeTextWithUnknownAncestors: 'Use `assumptions.unknownAncestorsDoNotRenderText` instead.', + dangerouslyOptimizeImageWithUnknownAncestors: 'Use `assumptions.unknownAncestorsDoNotRenderText` instead.', + dangerouslyOptimizeActivityIndicatorWithUnknownAncestors: + 'Use `assumptions.unknownAncestorsDoNotRenderText` instead.', +}; + +const legacyOptimizations: Record = { + text: 'Use `native-text` instead.', + view: 'Use `native-view` instead.', + image: 'Use `native-image` instead.', + activityIndicator: 'Use `native-activity-indicator` instead.', +}; + +export function validatePluginOptions(rawOptions: unknown): PluginOptions { + const options = readObject(rawOptions, 'Plugin options'); + validateKeys(options, pluginOptionKeys, 'plugin option', legacyPluginOptions); + + if (options.logLevel !== undefined && !logLevels.some((level) => level === options.logLevel)) { + throw new PluginError('`logLevel` must be one of `silent`, `warn`, `info`, or `debug`.'); + } + + if ( + options.ignores !== undefined && + (!Array.isArray(options.ignores) || options.ignores.some((pattern) => typeof pattern !== 'string')) + ) { + throw new PluginError('`ignores` must be an array of strings.'); + } + + if (options.optimizations !== undefined) { + const optimizations = readObject(options.optimizations, '`optimizations`'); + validateKeys(optimizations, optimizationKeys, 'optimization', legacyOptimizations); + + for (const [name, state] of Object.entries(optimizations)) { + if (state !== undefined && !optimizationStates.some((candidate) => candidate === state)) { + throw new PluginError(`Optimization \`${name}\` must be \`on\` or \`off\`.`); + } + } + } + + if (options.assumptions !== undefined) { + const assumptions = readObject(options.assumptions, '`assumptions`'); + validateKeys(assumptions, assumptionKeys, 'assumption'); + + if ( + assumptions.unknownAncestorsDoNotRenderText !== undefined && + typeof assumptions.unknownAncestorsDoNotRenderText !== 'boolean' + ) { + throw new PluginError('`assumptions.unknownAncestorsDoNotRenderText` must be a boolean.'); + } + } + + if (options.integrations !== undefined) { + const integrations = readObject(options.integrations, '`integrations`'); + validateKeys(integrations, integrationKeys, 'integration'); + + if (integrations.unistyles !== undefined && !integrationStates.some((state) => state === integrations.unistyles)) { + throw new PluginError('`integrations.unistyles` must be `auto`, `on`, or `off`.'); + } + } + + return options as PluginOptions; +} + +function readObject(value: unknown, name: string): Record { + if (typeof value !== 'object' || value === null || Array.isArray(value)) { + throw new PluginError(`${name} must be an object.`); + } + + return value as Record; +} + +function validateKeys( + value: Record, + allowedKeys: string[], + label: string, + replacements: Record = {} +): void { + for (const key of Object.keys(value)) { + if (allowedKeys.includes(key)) continue; + + const replacement = replacements[key]; + if (replacement) { + throw new PluginError(`The \`${key}\` ${label} was removed. ${replacement}`); + } + + throw new PluginError(`Unknown ${label} \`${key}\`.`); + } +} diff --git a/packages/react-native-boost/src/plugin/utils/unistyles.ts b/packages/react-native-boost/src/plugin/utils/unistyles.ts index 6588f52c..a53238aa 100644 --- a/packages/react-native-boost/src/plugin/utils/unistyles.ts +++ b/packages/react-native-boost/src/plugin/utils/unistyles.ts @@ -13,8 +13,8 @@ const DEPENDENCY_FIELDS = ['dependencies', 'devDependencies', 'peerDependencies' * `require.resolve` probe: in a monorepo (or with a hoisted/transitive copy) the package is often * resolvable from a project that does not actually use it, which would wrongly enable the mode and its * bailouts for unrelated packages. A declared dependency is the project's own signal that it uses - * Unistyles. The result still only auto-enables the mode and emits a one-time hint to set the `unistyles` - * flag explicitly, since a declared dependency does not prove Unistyles' own Babel plugin is active. + * Unistyles. The result still only auto-enables the mode and emits a one-time hint to set the integration + * to `on`, since a declared dependency does not prove Unistyles' own Babel plugin is active. */ export function isUnistylesInstalled(fromDirectory: string | undefined): boolean { const packageJson = readNearestPackageJson(fromDirectory ?? process.cwd()); From 3421240ef982bcf93d62f56d298c0c5019552546 Mon Sep 17 00:00:00 2001 From: Maximilian Krause Date: Thu, 3 Sep 2026 11:47:21 +0200 Subject: [PATCH 05/56] perf(native-image): hoist static native image sources --- .../fixtures/accessibility-props/output.js | 60 ++++++++------- .../image/__tests__/fixtures/basic/output.js | 15 ++-- .../fixtures/fallback-semantics/output.js | 75 ++++++++++--------- .../fixtures/force-text-ancestor/output.js | 15 ++-- .../__tests__/fixtures/native-props/output.js | 15 ++-- .../fixtures/request-headers/output.js | 53 ++++++------- .../__tests__/fixtures/source-array/output.js | 29 +++---- .../fixtures/src-precedence/output.js | 15 ++-- .../__tests__/fixtures/src-prop/output.js | 17 +++-- .../static-style-derived-props/output.js | 11 +-- .../dangerous-output.js | 30 ++++---- .../unknown-imported-ancestor/output.js | 15 ++-- .../__tests__/fixtures/view-props/output.js | 15 ++-- .../optimizers/image/__tests__/index.test.ts | 40 ++++++++-- .../src/plugin/optimizers/image/index.ts | 28 ++++++- .../src/plugin/types/index.ts | 1 + 16 files changed, 254 insertions(+), 180 deletions(-) diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/accessibility-props/output.js b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/accessibility-props/output.js index 215dff38..1b6f3609 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/accessibility-props/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/accessibility-props/output.js @@ -3,6 +3,34 @@ import { NativeImage as _NativeImage, } from 'react-native-boost/runtime'; import { Image } from 'react-native'; +const _imageSource = [ + { + uri: 'logo.png', + width: 16, + height: 16, + }, + ], + _imageSource2 = [ + { + uri: 'logo.png', + width: 16, + height: 16, + }, + ], + _imageSource3 = [ + { + uri: 'logo.png', + width: 16, + height: 16, + }, + ], + _imageSource4 = [ + { + uri: 'logo.png', + width: 16, + height: 16, + }, + ]; const label = getLabel(); const labelledBy = getLabelledBy(); <_NativeImage @@ -20,13 +48,7 @@ const labelledBy = getLabelledBy(); overflow: 'hidden', }, ]} - source={[ - { - uri: 'logo.png', - width: 16, - height: 16, - }, - ]} + source={_imageSource} resizeMode="cover" />; <_NativeImage @@ -44,13 +66,7 @@ const labelledBy = getLabelledBy(); overflow: 'hidden', }, ]} - source={[ - { - uri: 'logo.png', - width: 16, - height: 16, - }, - ]} + source={_imageSource2} resizeMode="cover" />; <_NativeImage @@ -71,13 +87,7 @@ const labelledBy = getLabelledBy(); overflow: 'hidden', }, ]} - source={[ - { - uri: 'logo.png', - width: 16, - height: 16, - }, - ]} + source={_imageSource3} resizeMode="cover" />; <_NativeImage @@ -97,12 +107,6 @@ const labelledBy = getLabelledBy(); overflow: 'hidden', }, ]} - source={[ - { - uri: 'logo.png', - width: 16, - height: 16, - }, - ]} + source={_imageSource4} resizeMode="cover" />; diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/basic/output.js b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/basic/output.js index cbd58b82..7deb69bb 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/basic/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/basic/output.js @@ -1,5 +1,12 @@ import { NativeImage as _NativeImage } from 'react-native-boost/runtime'; import { Image } from 'react-native'; +const _imageSource = [ + { + uri: 'logo.png', + width: 24, + height: 16, + }, +]; <_NativeImage testID="logo" style={[ @@ -11,12 +18,6 @@ import { Image } from 'react-native'; overflow: 'hidden', }, ]} - source={[ - { - uri: 'logo.png', - width: 24, - height: 16, - }, - ]} + source={_imageSource} resizeMode="cover" />; diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/fallback-semantics/output.js b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/fallback-semantics/output.js index 6ee1674d..f6f9e1e2 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/fallback-semantics/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/fallback-semantics/output.js @@ -1,22 +1,51 @@ import { NativeImage as _NativeImage } from 'react-native-boost/runtime'; import { Image } from 'react-native'; -<_NativeImage - style={[ +const _imageSource = [ { - width: 16, + uri: 'logo.png', + width: null, height: 12, }, + ], + _imageSource2 = [ { - overflow: 'hidden', + uri: 'logo.png', + width: 16, + height: 16, }, - ]} - source={[ + ], + _imageSource3 = [ { uri: 'logo.png', - width: null, + width: 16, + height: 16, + }, + ], + _imageSource4 = [ + { + uri: 'logo.png', + width: 16, + height: 16, + }, + ], + _imageSource5 = [ + { + uri: 'logo.png', + width: 16, + height: 16, + }, + ]; +<_NativeImage + style={[ + { + width: 16, height: 12, }, + { + overflow: 'hidden', + }, ]} + source={_imageSource} resizeMode="cover" />; <_NativeImage @@ -32,13 +61,7 @@ import { Image } from 'react-native'; resizeMode: 'contain', }, ]} - source={[ - { - uri: 'logo.png', - width: 16, - height: 16, - }, - ]} + source={_imageSource2} resizeMode="contain" />; <_NativeImage @@ -54,13 +77,7 @@ import { Image } from 'react-native'; resizeMode: 'contain', }, ]} - source={[ - { - uri: 'logo.png', - width: 16, - height: 16, - }, - ]} + source={_imageSource3} resizeMode="contain" />; <_NativeImage @@ -76,13 +93,7 @@ import { Image } from 'react-native'; objectFit: 'fill', }, ]} - source={[ - { - uri: 'logo.png', - width: 16, - height: 16, - }, - ]} + source={_imageSource4} resizeMode="stretch" />; <_NativeImage @@ -98,13 +109,7 @@ import { Image } from 'react-native'; tintColor: 'red', }, ]} - source={[ - { - uri: 'logo.png', - width: 16, - height: 16, - }, - ]} + source={_imageSource5} resizeMode="cover" tintColor="red" />; diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/force-text-ancestor/output.js b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/force-text-ancestor/output.js index a65d4cf2..27e1154c 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/force-text-ancestor/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/force-text-ancestor/output.js @@ -1,5 +1,12 @@ import { NativeImage as _NativeImage } from 'react-native-boost/runtime'; import { Image, Text } from 'react-native'; +const _imageSource = [ + { + uri: 'forced.png', + width: 16, + height: 16, + }, +]; ; diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/native-props/output.js b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/native-props/output.js index 2030f3b3..7c4d6ce5 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/native-props/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/native-props/output.js @@ -1,5 +1,12 @@ import { NativeImage as _NativeImage } from 'react-native-boost/runtime'; import { Image } from 'react-native'; +const _imageSource = [ + { + uri: 'logo.png', + width: 16, + height: 16, + }, +]; <_NativeImage blurRadius={2} resizeMethod="resize" @@ -21,12 +28,6 @@ import { Image } from 'react-native'; overflow: 'hidden', }, ]} - source={[ - { - uri: 'logo.png', - width: 16, - height: 16, - }, - ]} + source={_imageSource} resizeMode="cover" />; diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/request-headers/output.js b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/request-headers/output.js index 29460414..cd67c56f 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/request-headers/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/request-headers/output.js @@ -1,13 +1,6 @@ import { NativeImage as _NativeImage } from 'react-native-boost/runtime'; import { Image } from 'react-native'; -<_NativeImage - style={[ - {}, - { - overflow: 'hidden', - }, - ]} - source={[ +const _imageSource = [ { uri: 'https://example.com/logo.png', headers: { @@ -17,17 +10,8 @@ import { Image } from 'react-native'; width: 16, height: 16, }, - ]} - resizeMode="cover" -/>; -<_NativeImage - style={[ - {}, - { - overflow: 'hidden', - }, - ]} - source={[ + ], + _imageSource2 = [ { uri: 'logo.png', width: 16, @@ -37,25 +21,44 @@ import { Image } from 'react-native'; 'Referrer-Policy': 'origin', }, }, + ], + _imageSource3 = [ + { + uri: '', + width: 16, + height: 16, + }, + ]; +<_NativeImage + style={[ + {}, + { + overflow: 'hidden', + }, ]} + source={_imageSource} resizeMode="cover" />; <_NativeImage style={[ - { - width: 16, - height: 16, - }, + {}, { overflow: 'hidden', }, ]} - source={[ + source={_imageSource2} + resizeMode="cover" +/>; +<_NativeImage + style={[ { - uri: '', width: 16, height: 16, }, + { + overflow: 'hidden', + }, ]} + source={_imageSource3} resizeMode="cover" />; diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/source-array/output.js b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/source-array/output.js index 06638335..52abbdb1 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/source-array/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/source-array/output.js @@ -1,5 +1,19 @@ import { NativeImage as _NativeImage } from 'react-native-boost/runtime'; import { Image } from 'react-native'; +const _imageSource = [ + { + uri: 'logo.png', + width: 16, + height: 16, + scale: 1, + }, + { + uri: 'logo@2x.png', + width: 32, + height: 32, + scale: 2, + }, +]; <_NativeImage width={16} height={16} @@ -12,19 +26,6 @@ import { Image } from 'react-native'; opacity: 0.9, }, ]} - source={[ - { - uri: 'logo.png', - width: 16, - height: 16, - scale: 1, - }, - { - uri: 'logo@2x.png', - width: 32, - height: 32, - scale: 2, - }, - ]} + source={_imageSource} resizeMode="cover" />; diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/src-precedence/output.js b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/src-precedence/output.js index f4e6d232..a696d1a3 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/src-precedence/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/src-precedence/output.js @@ -1,5 +1,12 @@ import { NativeImage as _NativeImage } from 'react-native-boost/runtime'; import { Image } from 'react-native'; +const _imageSource = [ + { + uri: 'https://example.com/src.png', + headers: {}, + width: 20, + }, +]; <_NativeImage style={[ {}, @@ -7,12 +14,6 @@ import { Image } from 'react-native'; overflow: 'hidden', }, ]} - source={[ - { - uri: 'https://example.com/src.png', - headers: {}, - width: 20, - }, - ]} + source={_imageSource} resizeMode="cover" />; diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/src-prop/output.js b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/src-prop/output.js index c90a0880..9807103b 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/src-prop/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/src-prop/output.js @@ -1,5 +1,13 @@ import { NativeImage as _NativeImage } from 'react-native-boost/runtime'; import { Image } from 'react-native'; +const _imageSource = [ + { + uri: 'https://example.com/a.png', + headers: {}, + width: 10, + height: 20, + }, +]; <_NativeImage style={[ {}, @@ -7,13 +15,6 @@ import { Image } from 'react-native'; overflow: 'hidden', }, ]} - source={[ - { - uri: 'https://example.com/a.png', - headers: {}, - width: 10, - height: 20, - }, - ]} + source={_imageSource} resizeMode="cover" />; diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/static-style-derived-props/output.js b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/static-style-derived-props/output.js index 6867529a..e17223ed 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/static-style-derived-props/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/static-style-derived-props/output.js @@ -1,5 +1,10 @@ import { NativeImage as _NativeImage } from 'react-native-boost/runtime'; import { Image } from 'react-native'; +const _imageSource = [ + { + uri: 'hero.png', + }, +]; <_NativeImage style={[ {}, @@ -16,11 +21,7 @@ import { Image } from 'react-native'; }, ], ]} - source={[ - { - uri: 'hero.png', - }, - ]} + source={_imageSource} resizeMode="stretch" tintColor="red" />; diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js index e90e7799..43589bd0 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js +++ b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js @@ -1,6 +1,20 @@ import { NativeImage as _NativeImage } from 'react-native-boost/runtime'; import { Image } from 'react-native'; import { ExternalWrapper } from './ExternalWrapper'; +const _imageSource = [ + { + uri: 'safe.png', + width: 16, + height: 16, + }, + ], + _imageSource2 = [ + { + uri: 'unknown.png', + width: 16, + height: 16, + }, + ]; <> <_NativeImage style={[ @@ -12,13 +26,7 @@ import { ExternalWrapper } from './ExternalWrapper'; overflow: 'hidden', }, ]} - source={[ - { - uri: 'safe.png', - width: 16, - height: 16, - }, - ]} + source={_imageSource} resizeMode="cover" /> @@ -32,13 +40,7 @@ import { ExternalWrapper } from './ExternalWrapper'; overflow: 'hidden', }, ]} - source={[ - { - uri: 'unknown.png', - width: 16, - height: 16, - }, - ]} + source={_imageSource2} resizeMode="cover" /> diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/unknown-imported-ancestor/output.js b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/unknown-imported-ancestor/output.js index fe727fba..529c6ac6 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/unknown-imported-ancestor/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/unknown-imported-ancestor/output.js @@ -1,6 +1,13 @@ import { NativeImage as _NativeImage } from 'react-native-boost/runtime'; import { Image } from 'react-native'; import { ExternalWrapper } from './ExternalWrapper'; +const _imageSource = [ + { + uri: 'safe.png', + width: 16, + height: 16, + }, +]; <> <_NativeImage style={[ @@ -12,13 +19,7 @@ import { ExternalWrapper } from './ExternalWrapper'; overflow: 'hidden', }, ]} - source={[ - { - uri: 'safe.png', - width: 16, - height: 16, - }, - ]} + source={_imageSource} resizeMode="cover" /> diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/view-props/output.js b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/view-props/output.js index 3be9364c..739677fc 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/view-props/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/view-props/output.js @@ -1,5 +1,12 @@ import { NativeImage as _NativeImage } from 'react-native-boost/runtime'; import { Image } from 'react-native'; +const _imageSource = [ + { + uri: 'logo.png', + width: 16, + height: 16, + }, +]; <_NativeImage accessible={true} accessibilityLabel="logo" @@ -29,12 +36,6 @@ import { Image } from 'react-native'; overflow: 'hidden', }, ]} - source={[ - { - uri: 'logo.png', - width: 16, - height: 16, - }, - ]} + source={_imageSource} resizeMode="cover" />; diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts index 3e080a8a..26e549ae 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts +++ b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts @@ -57,6 +57,29 @@ const getNativeImageAttributes = (source: string): t.JSXAttribute[][] => { return images; }; +const getHoistedImageSources = (source: string): t.ArrayExpression[] => { + const ast = parseSync(source, { + configFile: false, + babelrc: false, + parserOpts: { sourceType: 'module', plugins: ['jsx'] }, + }); + const sources: t.ArrayExpression[] = []; + + traverse(ast!, { + VariableDeclarator(path) { + if ( + t.isIdentifier(path.node.id) && + path.node.id.name.startsWith('_imageSource') && + t.isArrayExpression(path.node.init) + ) { + sources.push(path.node.init); + } + }, + }); + + return sources; +}; + const getAttributeExpression = (attributes: t.JSXAttribute[], name: string): t.Expression | undefined => { const attribute = attributes.find((item) => t.isJSXIdentifier(item.name, { name })); if (!attribute?.value) return undefined; @@ -166,11 +189,12 @@ describe('image android output', () => { const images = getNativeImageAttributes(output); expect(images).toHaveLength(1); const image = images[0]!; - const source = getAttributeExpression(image, 'source'); + const [source] = getHoistedImageSources(output); const headers = getAttributeExpression(image, 'headers'); expect(getAttributeNames(image).has('src')).toBe(false); - expect(t.isArrayExpression(source)).toBe(true); + expect(getAttributeExpression(image, 'source')).toMatchObject({ name: '_imageSource' }); + expect(source).toBeDefined(); expect(t.isObjectExpression(headers)).toBe(true); expect(getStringPropertyValue(headers as t.ObjectExpression, 'Access-Control-Allow-Credentials')).toBe('true'); expect(getStringPropertyValue(headers as t.ObjectExpression, 'Referrer-Policy')).toBe('origin'); @@ -210,13 +234,12 @@ describe('image android output', () => { expect(t.isObjectExpression(arrayHeaders)).toBe(true); expect(getStringPropertyValue(arrayHeaders as t.ObjectExpression, 'Authorization')).toBe('Bearer first'); - const objectSource = getAttributeExpression(objectSourceImage, 'source'); - const arraySource = getAttributeExpression(arraySourceImage, 'source'); - expect(t.isArrayExpression(objectSource)).toBe(true); - expect(t.isArrayExpression(arraySource)).toBe(true); + const [objectSource, arraySource] = getHoistedImageSources(output); + expect(objectSource).toBeDefined(); + expect(arraySource).toBeDefined(); - const objectSourceEntry = (objectSource as t.ArrayExpression).elements[0]; - const arraySourceEntry = (arraySource as t.ArrayExpression).elements[0]; + const objectSourceEntry = objectSource!.elements[0]; + const arraySourceEntry = arraySource!.elements[0]; expect(t.isObjectExpression(objectSourceEntry)).toBe(true); expect(t.isObjectExpression(arraySourceEntry)).toBe(true); @@ -276,6 +299,7 @@ describe('image android output', () => { // iOS emits the dimensions only once (in the source entry), so it can stay static. const iosOutput = await transformImage(source, 'ios'); expect(iosOutput).not.toContain('processImageSourceProps'); + expect(iosOutput).not.toContain('const _imageSource'); expect(iosOutput).toContain('<_NativeImage'); }); diff --git a/packages/react-native-boost/src/plugin/optimizers/image/index.ts b/packages/react-native-boost/src/plugin/optimizers/image/index.ts index 493f2521..f1b84ced 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/index.ts +++ b/packages/react-native-boost/src/plugin/optimizers/image/index.ts @@ -268,13 +268,39 @@ function processImageProps( ...remaining, accessibilityInfo?.spreadAttribute, makeAttribute('style', buildStyle(nativeSource, styleInfo, arrayDimensionsGate)), - makeAttribute('source', nativeSource.sourceArray), + makeAttribute('source', hoistStaticImageSource(path, file, nativeSource.sourceArray)), androidHeaders ? makeAttribute('headers', androidHeaders) : undefined, makeAttribute('resizeMode', buildResizeMode(explicitResizeMode, styleInfo)), tintColor ? makeAttribute('tintColor', tintColor) : undefined, ].filter((attribute): attribute is t.JSXAttribute | t.JSXSpreadAttribute => attribute !== undefined); } +function hoistStaticImageSource( + path: NodePath, + file: HubFile, + source: t.ArrayExpression +): t.Expression { + if (!isStaticLiteralTree(source)) return source; + + const identifier = path.scope.getProgramParent().generateUidIdentifier('imageSource'); + const declarator = t.variableDeclarator(identifier, source); + + if (file.__staticImageSourceDeclaration) { + file.__staticImageSourceDeclaration.declarations.push(declarator); + } else { + const programPath = path.findParent((ancestor) => ancestor.isProgram()); + if (!programPath?.isProgram()) throw new PluginError('No program found for static Image source'); + + const declaration = t.variableDeclaration('const', [declarator]); + const firstStatement = programPath.get('body').find((statement) => !statement.isImportDeclaration()); + if (firstStatement) firstStatement.insertBefore(declaration); + else programPath.pushContainer('body', declaration); + file.__staticImageSourceDeclaration = declaration; + } + + return t.cloneNode(identifier); +} + function addRuntimeHelper(path: NodePath, file: HubFile, importName: string): t.Identifier { return t.identifier( addFileImportHint({ file, nameHint: importName, path, importName, moduleName: RUNTIME_MODULE_NAME }).name diff --git a/packages/react-native-boost/src/plugin/types/index.ts b/packages/react-native-boost/src/plugin/types/index.ts index a108d2a2..4f92a2b9 100644 --- a/packages/react-native-boost/src/plugin/types/index.ts +++ b/packages/react-native-boost/src/plugin/types/index.ts @@ -133,6 +133,7 @@ export type HubFile = t.File & { }; __hasImports?: Record; __optimized?: boolean; + __staticImageSourceDeclaration?: t.VariableDeclaration; }; /** From b10c47c01faf8bb77f1d9d2ddf0e39a50a6273dd Mon Sep 17 00:00:00 2001 From: Maximilian Krause Date: Thu, 3 Sep 2026 11:54:59 +0200 Subject: [PATCH 06/56] docs: update README compatibility section --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4cc9ff0e..6c21a87c 100644 --- a/README.md +++ b/README.md @@ -43,11 +43,13 @@ See the [benchmarks page](https://react-native-boost.oss.kuatsu.de/docs/informat | `react-native-boost` | React Native | | -------------------- | ---------------- | -| `0.x` | All versions[^1] | +| `0.x` | All versions | | `1.x` | `>=0.83` | | `2.x` | `>=0.83` | -[^1]: Starting from React Native `0.80`, `react-native-boost@0` prints import deprecation warnings. +Current versions of React Native Boost are compatible with **all React Native versions since 0.83**. We test runtime behavior against all of these versions. + +For older React Native versions, you can install `react-native-boost@^0`. Please note that we do not support this version anymore and, starting from React Native `0.80`, it prints import deprecation warnings from React Native. ## Installation From 52ac21d54d041dd09ae6c42f6bfcad27448096a8 Mon Sep 17 00:00:00 2001 From: Maximilian Krause Date: Thu, 3 Sep 2026 15:53:01 +0200 Subject: [PATCH 07/56] perf(native-image): optimize static srcSet sources --- .../information/optimization-coverage.mdx | 4 + .../__tests__/parity/fuzz/vocabulary.ts | 11 ++ .../src/plugin/__tests__/parity/normalize.ts | 1 + .../plugin/__tests__/parity/parity.test.ts | 32 ++++ .../react-native-boost/src/plugin/index.ts | 17 +- .../optimizers/image/__tests__/index.test.ts | 180 +++++++++++++++++- .../src/plugin/optimizers/image/index.ts | 130 ++++++++++++- .../src/plugin/types/index.ts | 4 +- 8 files changed, 372 insertions(+), 7 deletions(-) diff --git a/apps/docs/content/docs/information/optimization-coverage.mdx b/apps/docs/content/docs/information/optimization-coverage.mdx index 2b366b26..233b140e 100644 --- a/apps/docs/content/docs/information/optimization-coverage.mdx +++ b/apps/docs/content/docs/information/optimization-coverage.mdx @@ -108,6 +108,10 @@ The project-wide unknown ancestor assumption can optimize this case. A false ass The `Image` optimizer rewrites supported `Image` elements when the target platform is known (`ios` or `android`) and the source/style/accessibility props can be reproduced safely. +A static `srcSet` is parsed at build time for the installed React Native version. An optional static `src` supplies the +1x fallback. Boost skips this optimization when it cannot detect React Native. Dynamic or malformed sets, sets used with `source`, spreads, dynamic dimensions, +and sets with dynamic styles stay on the React Native wrapper path. + In Unistyles mode, an Image is skipped when its `style` is (or may be) a Unistyles style. ## ActivityIndicator Coverage diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/fuzz/vocabulary.ts b/packages/react-native-boost/src/plugin/__tests__/parity/fuzz/vocabulary.ts index 192eee90..5d418590 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/fuzz/vocabulary.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/fuzz/vocabulary.ts @@ -351,6 +351,17 @@ export const IMAGE_SOURCE_VOCAB: PropSpec[] = [ arb: fc.constantFrom('"https://example.com/logo.png"'), disposition: 'required static src', }, + { + name: 'srcSet', + arb: fc.constantFrom( + '"logo.png 1x, logo@2x.png 2x"', + '"logo.png, logo@3x.png 3x"', + '"logo@2x.png 2x, logo@3x.png 3x"', + '"logo.png 1.5x"', + '"logo.png 1x,logo@2x.png 2x"' + ), + disposition: 'required static srcSet', + }, ]; export const IMAGE_VOCAB: PropSpec[] = [ diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/normalize.ts b/packages/react-native-boost/src/plugin/__tests__/parity/normalize.ts index 03ee5196..97efdb0a 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/normalize.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/normalize.ts @@ -58,6 +58,7 @@ export const normalizeImage = (props: Record, reactNativeMinor: 'aria-selected', 'crossOrigin', 'referrerPolicy', + 'srcSet', 'width', 'height', ]) { diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts b/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts index 5ee4f6a0..5f9249aa 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts @@ -148,6 +148,10 @@ const IMAGE_CASES = [ '', '', '', + '', + '', + '', + '', '', '', '', @@ -168,6 +172,7 @@ const IMAGE_CASES = [ ]; const BAILED_IMAGE_CASES = new Set([ + '', '', '', '', @@ -202,6 +207,33 @@ const IMAGE_PROP_ASSERTIONS = new Map, o '', (props) => expect(getFirstImageSource(props)).toMatchObject({ width: 16, height: 16 }), ], + [ + '', + (props) => + expect(props.source).toMatchObject([ + { uri: 'logo.png', scale: 1 }, + { uri: 'logo@2x.png', scale: 2 }, + ]), + ], + [ + '', + (props) => + expect(props.source).toMatchObject([ + { uri: 'logo@2x.png', scale: 2, width: 16, height: 8 }, + { uri: 'logo@3x.png', scale: 3, width: 16, height: 8 }, + { uri: 'logo.png', scale: 1, width: 16, height: 8 }, + ]), + ], + [ + '', + (props) => { + expect(getFirstImageSource(props)).toMatchObject({ uri: 'logo.png', scale: 1 }); + expect(getFirstImageSource(props).headers).toEqual({ + 'Access-Control-Allow-Credentials': 'true', + 'Referrer-Policy': 'origin', + }); + }, + ], [ '', (props) => diff --git a/packages/react-native-boost/src/plugin/index.ts b/packages/react-native-boost/src/plugin/index.ts index cf11ca68..3d43e074 100644 --- a/packages/react-native-boost/src/plugin/index.ts +++ b/packages/react-native-boost/src/plugin/index.ts @@ -1,3 +1,5 @@ +import { createRequire } from 'node:module'; +import path from 'node:path'; import { declare } from '@babel/helper-plugin-utils'; import { textOptimizer } from './optimizers/text'; import { imageOptimizer } from './optimizers/image'; @@ -25,6 +27,7 @@ export default declare((api, rawOptions, dirname?: string) => { const options = validatePluginOptions(rawOptions ?? {}); const logger = createLogger(options.logLevel ?? 'info'); + const reactNativeMinor = resolveReactNativeMinor(dirname); // Target platform, resolved at build time. Metro sets this on the Babel caller per platform bundle, // letting optimizers inline platform-specific defaults instead of deferring them to the runtime. @@ -57,7 +60,7 @@ export default declare((api, rawOptions, dirname?: string) => { if (isOptimizationEnabled(options, 'native-view')) viewOptimizer(path, logger, options, platform, unistylesEnabled); if (isOptimizationEnabled(options, 'native-image')) - imageOptimizer(path, logger, options, platform, unistylesEnabled); + imageOptimizer(path, logger, options, platform, unistylesEnabled, reactNativeMinor); if (isOptimizationEnabled(options, 'native-activity-indicator')) activityIndicatorOptimizer(path, logger, options, platform, unistylesEnabled); }, @@ -76,3 +79,15 @@ function isOptimizationEnabled( function normalizeTargetPlatform(platform?: string): TargetPlatform | undefined { return platform === 'ios' || platform === 'android' || platform === 'web' ? platform : undefined; } + +function resolveReactNativeMinor(dirname?: string): number | undefined { + try { + const requireFromProject = createRequire(path.resolve(dirname ?? process.cwd(), 'package.json')); + const { version } = requireFromProject('react-native/package.json') as { version?: unknown }; + const match = typeof version === 'string' ? /^0\.(\d+)\./.exec(version) : null; + const minor = match ? Number(match[1]) : undefined; + return minor !== undefined && minor >= 83 && minor <= 87 ? minor : undefined; + } catch { + return undefined; + } +} diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts index 26e549ae..829648eb 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts +++ b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts @@ -1,3 +1,4 @@ +import { createRequire } from 'node:module'; import path from 'node:path'; import { parseSync, transformSync, traverse, types as t, type PluginObj, type TransformCaller } from '@babel/core'; import { pluginTester } from 'babel-plugin-tester'; @@ -15,9 +16,11 @@ const transformImage = async ( { unknownAncestorsDoNotRenderText = false, unistylesEnabled = false, + reactNativeMinor = 86, }: { unknownAncestorsDoNotRenderText?: boolean; unistylesEnabled?: boolean; + reactNativeMinor?: number | null; } = {} ): Promise => { const logger = createLogger('silent'); @@ -25,7 +28,14 @@ const transformImage = async ( name: `${platform}-image-optimizer-test`, visitor: { JSXOpeningElement(path) { - imageOptimizer(path, logger, { assumptions: { unknownAncestorsDoNotRenderText } }, platform, unistylesEnabled); + imageOptimizer( + path, + logger, + { assumptions: { unknownAncestorsDoNotRenderText } }, + platform, + unistylesEnabled, + reactNativeMinor ?? undefined + ); }, }, }); @@ -80,6 +90,12 @@ const getHoistedImageSources = (source: string): t.ArrayExpression[] => { return sources; }; +const getSourceObjects = (source: t.ArrayExpression): t.ObjectExpression[] => + source.elements.map((element) => { + if (!t.isObjectExpression(element)) throw new Error('expected an Image source object'); + return element; + }); + const getAttributeExpression = (attributes: t.JSXAttribute[], name: string): t.Expression | undefined => { const attribute = attributes.find((item) => t.isJSXIdentifier(item.name, { name })); if (!attribute?.value) return undefined; @@ -318,6 +334,168 @@ describe('image android output', () => { }); }); +describe('image srcSet output', () => { + it('parses and hoists static density sources', async () => { + const output = await transformImage( + ` + import { Image } from 'react-native'; + ; + `, + 'ios' + ); + + expect(output).toContain('<_NativeImage'); + expect(output).not.toContain('processImageSourceProps'); + + const image = getNativeImageAttributes(output)[0]!; + expect(getAttributeNames(image).has('srcSet')).toBe(false); + expect(getAttributeExpression(image, 'source')).toMatchObject({ name: '_imageSource' }); + + const entries = getSourceObjects(getHoistedImageSources(output)[0]!); + expect(entries).toHaveLength(3); + expect(getStringPropertyValue(entries[0]!, 'uri')).toBe('logo.png'); + expect(getObjectExpressionProperty(entries[0]!, 'scale')).toMatchObject({ value: 1 }); + expect(getStringPropertyValue(entries[1]!, 'uri')).toBe('logo@2x.png'); + expect(getObjectExpressionProperty(entries[1]!, 'scale')).toMatchObject({ value: 2 }); + expect(getStringPropertyValue(entries[2]!, 'uri')).toBe('logo@3x.png'); + expect(getObjectExpressionProperty(entries[2]!, 'scale')).toMatchObject({ value: 3 }); + }); + + it('matches the scale parser used by the target React Native version', async () => { + const source = ` + import { Image } from 'react-native'; + ; + `; + const legacyEntries = getSourceObjects( + getHoistedImageSources(await transformImage(source, 'ios', { reactNativeMinor: 86 }))[0]! + ); + const modernEntries = getSourceObjects( + getHoistedImageSources(await transformImage(source, 'ios', { reactNativeMinor: 87 }))[0]! + ); + + expect(legacyEntries.map((entry) => getObjectExpressionProperty(entry, 'scale'))).toMatchObject([{ value: 1 }]); + expect(modernEntries.map((entry) => getObjectExpressionProperty(entry, 'scale'))).toMatchObject([ + { value: 1.5 }, + { value: 1 }, + ]); + }); + + it('uses the relaxed RN 0.87 separator parser only for RN 0.87', async () => { + const source = ` + import { Image } from 'react-native'; + ; + `; + const legacyOutput = await transformImage(source, 'ios', { reactNativeMinor: 86 }); + const modernOutput = await transformImage(source, 'ios', { reactNativeMinor: 87 }); + + expect(legacyOutput).not.toContain('_NativeImage'); + expect(getSourceObjects(getHoistedImageSources(modernOutput)[0]!)).toHaveLength(2); + }); + + it('bails when no React Native version was identified', async () => { + const output = await transformImage( + `import { Image } from 'react-native';\n;`, + 'ios', + { + reactNativeMinor: null, + } + ); + + expect(output).not.toContain('_NativeImage'); + }); + + it('detects the installed React Native version through the Babel plugin', async () => { + const output = await formatTestResult( + transformSync(`import { Image } from 'react-native';\n;`, { + configFile: false, + babelrc: false, + filename: 'case.jsx', + caller: { name: 'metro', platform: 'ios' } as TransformCaller, + plugins: ['@babel/plugin-syntax-jsx', [boostPlugin, { logLevel: 'silent' }]], + })!.code! + ); + const { version } = createRequire(import.meta.url)('react-native/package.json') as { version: string }; + const minor = Number(version.split('.')[1]); + + if (minor >= 83) { + const entry = getSourceObjects(getHoistedImageSources(output)[0]!)[0]!; + expect(getObjectExpressionProperty(entry, 'scale')).toMatchObject({ value: minor >= 87 ? 1.5 : 1 }); + } else { + expect(output).not.toContain('_NativeImage'); + } + }); + + it('uses src only when srcSet has no 1x source', async () => { + const output = await transformImage( + ` + import { Image } from 'react-native'; + ; + ; + `, + 'ios' + ); + + const [withFallback, withDefault] = getHoistedImageSources(output).map(getSourceObjects); + expect(withFallback!.map((entry) => getStringPropertyValue(entry, 'uri'))).toEqual([ + 'logo@2x.png', + 'logo@3x.png', + 'fallback.png', + ]); + expect(withFallback!.map((entry) => getObjectExpressionProperty(entry, 'scale'))).toMatchObject([ + { value: 2 }, + { value: 3 }, + { value: 1 }, + ]); + expect(withDefault!.map((entry) => getStringPropertyValue(entry, 'uri'))).toEqual(['logo.png', 'logo@2x.png']); + }); + + it('builds static dimensions and request headers', async () => { + const output = await transformImage( + ` + import { Image } from 'react-native'; + ; + `, + 'android' + ); + + const image = getNativeImageAttributes(output)[0]!; + const entry = getSourceObjects(getHoistedImageSources(output)[0]!)[0]!; + const headers = getAttributeExpression(image, 'headers'); + expect(t.isObjectExpression(headers)).toBe(true); + expect(getStringPropertyValue(headers as t.ObjectExpression, 'Access-Control-Allow-Credentials')).toBe('true'); + expect(getStringPropertyValue(headers as t.ObjectExpression, 'Referrer-Policy')).toBe('origin'); + expect(getObjectExpressionProperty(entry, 'width')).toMatchObject({ value: 24 }); + expect(getObjectExpressionProperty(entry, 'height')).toMatchObject({ value: 12 }); + + const style = getAttributeExpression(image, 'style') as t.ArrayExpression; + const dimensions = unwrapRuntimeGate(style.elements[0] as t.Expression, 'processImageArraySourceDimensions'); + expect(getObjectExpressionProperty(dimensions as t.ObjectExpression, 'width')).toMatchObject({ value: 24 }); + expect(getObjectExpressionProperty(dimensions as t.ObjectExpression, 'height')).toMatchObject({ value: 12 }); + }); + + it.each([ + ['a dynamic srcSet', ''], + ['a source prop', ''], + ['a dynamic dimension', ''], + ['a spread', ''], + ['an unsupported descriptor', ''], + ['a separator unsupported by RN 0.86', ''], + ['a malformed descriptor', ''], + ['a dynamic style', ''], + ])('bails on %s', async (_reason, element) => { + const output = await transformImage(`import { Image } from 'react-native';\n${element};`, 'ios'); + + expect(output).not.toContain('_NativeImage'); + expect(output).toContain(' { it('bails on a Unistyles style because there is no lean Image host', async () => { const output = await transformImage( diff --git a/packages/react-native-boost/src/plugin/optimizers/image/index.ts b/packages/react-native-boost/src/plugin/optimizers/image/index.ts index f1b84ced..be9a5657 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/index.ts +++ b/packages/react-native-boost/src/plugin/optimizers/image/index.ts @@ -36,7 +36,6 @@ const IMAGE_BAILOUT_PROPS = new Set([ 'onPartialLoad', 'onProgress', 'ref', - 'srcSet', 'tabIndex', ]); @@ -67,6 +66,7 @@ const IMAGE_SPREAD_GUARD_PROPS = new Set([ 'resizeMode', 'source', 'src', + 'srcSet', 'style', 'tintColor', 'width', @@ -82,7 +82,7 @@ const OBJECT_FIT_TO_RESIZE_MODE: Record = { 'scale-down': 'contain', }; -export const imageOptimizer: Optimizer = (path, logger, options, platform, unistylesEnabled) => { +export const imageOptimizer: Optimizer = (path, logger, options, platform, unistylesEnabled, reactNativeMinor) => { if (platform === 'web') return; if (!isReactNativeComponent(path, 'Image')) return; @@ -93,6 +93,10 @@ export const imageOptimizer: Optimizer = (path, logger, options, platform, unist // resolvable spread already bails (`style` is in {@link IMAGE_SPREAD_GUARD_PROPS}), as does an // unresolvable spread. See {@link classifyStyleOrigin}. const getStyleOrigin = createStyleOriginResolver(path, unistylesEnabled); + const srcSetAttribute = findAttribute(path.node.attributes, 'srcSet'); + const staticSrcSetSource = srcSetAttribute + ? buildStaticSrcSetSource(path.node.attributes, platform, reactNativeMinor) + : undefined; const hardChecks: BailoutCheck[] = [ { @@ -117,6 +121,14 @@ export const imageOptimizer: Optimizer = (path, logger, options, platform, unist reason: 'contains non-empty children', shouldBail: () => parent.children.some((child) => !t.isJSXText(child) || child.value.trim() !== ''), }, + { + reason: 'has an unsupported or dynamic srcSet', + shouldBail: () => srcSetAttribute !== undefined && staticSrcSetSource === undefined, + }, + { + reason: 'has a dynamic style with srcSet', + shouldBail: () => srcSetAttribute !== undefined && buildStaticStyleInfo(path.node.attributes) === null, + }, { reason: 'has an unsupported or dynamic source', shouldBail: () => !hasImageSourceInput(path.node.attributes), @@ -164,7 +176,7 @@ export const imageOptimizer: Optimizer = (path, logger, options, platform, unist throw new PluginError('No file found in Babel hub'); } - const nativeSource = buildStaticNativeSource(path.node.attributes, platform); + const nativeSource = staticSrcSetSource ?? buildStaticNativeSource(path.node.attributes, platform); const styleInfo = buildStaticStyleInfo(path.node.attributes); logger.optimized({ component: 'Image', path }); @@ -422,6 +434,112 @@ function buildRuntimeImageInfo(path: NodePath, file: HubFil }; } +type StaticSrcSetEntry = { + uri: string; + scale: number; +}; + +function buildStaticSrcSetSource( + attributes: Array, + platform?: string, + reactNativeMinor?: number +): NativeSource | undefined { + if (attributes.some((attribute) => t.isJSXSpreadAttribute(attribute))) return undefined; + if (findAttribute(attributes, 'source')) return undefined; + + const srcSetAttribute = findAttribute(attributes, 'srcSet'); + if (!srcSetAttribute) return undefined; + + const srcSet = getAttributeValueExpression(srcSetAttribute); + if (!t.isStringLiteral(srcSet)) return undefined; + + const entries = parseStaticSrcSet(srcSet.value, reactNativeMinor); + if (!entries) return undefined; + + const srcAttribute = findAttribute(attributes, 'src'); + let src: t.StringLiteral | undefined; + if (srcAttribute) { + const value = getAttributeValueExpression(srcAttribute); + if (!t.isStringLiteral(value)) return undefined; + src = value; + } + + const width = getAttributeExpression(attributes, 'width'); + const height = getAttributeExpression(attributes, 'height'); + if (width && !isStaticSrcSetDimension(width)) return undefined; + if (height && !isStaticSrcSetDimension(height)) return undefined; + + const requestHeaders = buildRequestHeaders(attributes); + if (!requestHeaders) return undefined; + + if (src && !entries.some((entry) => entry.scale === 1)) { + entries.push({ uri: src.value, scale: 1 }); + } + + const sourceArray = t.arrayExpression( + entries.map((entry) => + t.objectExpression([ + t.objectProperty(t.identifier('headers'), t.cloneNode(requestHeaders.headers, true)), + t.objectProperty(t.identifier('scale'), t.numericLiteral(entry.scale)), + t.objectProperty(t.identifier('uri'), t.stringLiteral(entry.uri)), + ...(width ? [t.objectProperty(t.identifier('width'), t.cloneNode(width, true))] : []), + ...(height ? [t.objectProperty(t.identifier('height'), t.cloneNode(height, true))] : []), + ]) + ) + ); + const emitsDimensions = platform === 'android' && entries.length === 1; + + return { + sourceAttributes: [srcSetAttribute, srcAttribute].filter( + (attribute): attribute is t.JSXAttribute => attribute !== undefined + ), + requestHeaderAttributes: requestHeaders.attributes, + sourceArray, + consumesSizeProps: true, + androidHeaders: t.cloneNode(requestHeaders.headers, true), + width: emitsDimensions && width ? t.cloneNode(width, true) : undefined, + height: emitsDimensions && height ? t.cloneNode(height, true) : undefined, + arraySourceDimensions: true, + }; +} + +function parseStaticSrcSet(value: string, reactNativeMinor?: number): StaticSrcSetEntry[] | undefined { + if (reactNativeMinor === undefined || reactNativeMinor < 83) return undefined; + + const modernParser = reactNativeMinor >= 87; + const sources = modernParser + ? value + .split(',') + .map((source) => source.trim()) + .filter(Boolean) + : value.split(', '); + const entries: StaticSrcSetEntry[] = []; + + for (const source of sources) { + const parts = source.split(modernParser ? /\s+/ : ' '); + if (parts.length > 2) return undefined; + + const [uri, descriptor = '1x'] = parts; + if (!uri || !/^(?:\d+(?:\.\d+)?|\.\d+)x$/.test(descriptor)) return undefined; + + const scale = modernParser + ? Number.parseFloat(descriptor.slice(0, -1)) + : Number.parseInt(descriptor.split('x')[0]!, 10); + if (!Number.isFinite(scale) || scale <= 0) return undefined; + entries.push({ uri, scale }); + } + + return entries.length > 0 ? entries : undefined; +} + +function isStaticSrcSetDimension(expression: t.Expression): boolean { + return ( + t.isNumericLiteral(expression) || + t.isNullLiteral(expression) || + (t.isUnaryExpression(expression, { operator: '-' }) && t.isNumericLiteral(expression.argument)) + ); +} + function buildStaticNativeSource( attributes: Array, platform?: string @@ -651,7 +769,11 @@ function flattenStaticStyle(styleExpression: t.Expression): Map): boolean { - return findAttribute(attributes, 'source') !== undefined || findAttribute(attributes, 'src') !== undefined; + return ( + findAttribute(attributes, 'source') !== undefined || + findAttribute(attributes, 'src') !== undefined || + findAttribute(attributes, 'srcSet') !== undefined + ); } function getAttributeExpression( diff --git a/packages/react-native-boost/src/plugin/types/index.ts b/packages/react-native-boost/src/plugin/types/index.ts index 4f92a2b9..cbefd6c9 100644 --- a/packages/react-native-boost/src/plugin/types/index.ts +++ b/packages/react-native-boost/src/plugin/types/index.ts @@ -124,7 +124,9 @@ export type Optimizer = ( * setting and install auto-detection). When `true`, optimizers classify each element's `style` origin and * route Unistyles styles to Unistyles' lean host instead of Boost's raw host. */ - unistylesEnabled?: boolean + unistylesEnabled?: boolean, + /** Installed React Native minor version, when it can be resolved at build time. */ + reactNativeMinor?: number ) => void; export type HubFile = t.File & { From 2a680855e66c48967a37651a7c169979d72a8ef7 Mon Sep 17 00:00:00 2001 From: Maximilian Krause Date: Thu, 3 Sep 2026 15:53:59 +0200 Subject: [PATCH 08/56] feat(metro): add config adapter --- README.md | 17 +-- apps/docs/app/docs/[[...slug]]/page.tsx | 2 +- .../content/docs/compatibility/unistyles.mdx | 16 +-- .../content/docs/configuration/configure.mdx | 76 +++++------ .../content/docs/configuration/non-metro.mdx | 38 ++++++ apps/docs/content/docs/index.mdx | 34 ++--- .../content/docs/information/deep-dive.mdx | 9 +- .../docs/information/troubleshooting.mdx | 19 +-- apps/docs/content/docs/meta.json | 1 + apps/example/babel.config.js | 7 - apps/example/metro.config.js | 7 + packages/react-native-boost/package.json | 7 + packages/react-native-boost/rollup.config.mjs | 19 +++ .../src/metro/__tests__/index.test.ts | 117 ++++++++++++++++ .../src/metro/__tests__/transformer.test.ts | 37 +++++ .../react-native-boost/src/metro/index.ts | 110 +++++++++++++++ .../src/metro/transformer.ts | 71 ++++++++++ .../react-native-boost/src/metro/types.ts | 8 ++ .../react-native-boost/src/plugin/index.ts | 129 ++++++++++++++---- .../__tests__/index.test.ts | 4 +- .../optimizers/image/__tests__/index.test.ts | 23 ++++ .../src/plugin/types/index.ts | 53 ++++--- .../plugin/utils/__tests__/options.test.ts | 57 +++++++- .../__tests__/react-native-target.test.ts | 52 +++++++ .../src/plugin/utils/generate-test-plugin.ts | 4 +- .../src/plugin/utils/options.ts | 51 +++++-- .../src/plugin/utils/plugin-error.ts | 2 +- .../src/plugin/utils/react-native-target.ts | 99 ++++++++++++++ 28 files changed, 882 insertions(+), 187 deletions(-) create mode 100644 apps/docs/content/docs/configuration/non-metro.mdx create mode 100644 apps/example/metro.config.js create mode 100644 packages/react-native-boost/src/metro/__tests__/index.test.ts create mode 100644 packages/react-native-boost/src/metro/__tests__/transformer.test.ts create mode 100644 packages/react-native-boost/src/metro/index.ts create mode 100644 packages/react-native-boost/src/metro/transformer.ts create mode 100644 packages/react-native-boost/src/metro/types.ts create mode 100644 packages/react-native-boost/src/plugin/utils/__tests__/react-native-target.test.ts create mode 100644 packages/react-native-boost/src/plugin/utils/react-native-target.ts diff --git a/README.md b/README.md index 6c21a87c..71b5c416 100644 --- a/README.md +++ b/README.md @@ -61,21 +61,22 @@ npm install react-native-boost yarn add react-native-boost ``` -Then, add the plugin to your Babel configuration (`babel.config.js`): +Then, add Boost to your Metro configuration (`metro.config.js`): ```js -module.exports = { - plugins: ['react-native-boost/plugin'], -}; +const { getDefaultConfig } = require('expo/metro-config'); // use `@react-native/metro-config` for non-Expo apps +const { withBoostConfig } = require('react-native-boost/metro'); + +module.exports = withBoostConfig(getDefaultConfig(__dirname)); ``` -If you're using Expo and don't see the `babel.config.js` file, run the following command to create it: +If you don't see the `metro.config.js` file, run this command first: ```sh -npx expo customize babel.config.js +npx expo customize metro.config.js ``` -If you're using Unistyles or Nativewind, refer to additional required setup instructions in [the documentation](https://react-native-boost.oss.kuatsu.de/docs). +If you're using Unistyles, Nativewind, or a bundler other than Metro, see the [documentation](https://react-native-boost.oss.kuatsu.de/docs) for setup instructions. Finally, restart your React Native development server and clear the bundler cache: @@ -87,7 +88,7 @@ yarn start --clear That's it! No imports in your code, rebuilding, or anything else is required. -Optionally, you can configure the Babel plugin with a few options described in the [documentation](https://react-native-boost.oss.kuatsu.de/docs/configuration/configure). +Optional configuration is described in the [documentation](https://react-native-boost.oss.kuatsu.de/docs/configuration/configure). ## How it works diff --git a/apps/docs/app/docs/[[...slug]]/page.tsx b/apps/docs/app/docs/[[...slug]]/page.tsx index 80607f7f..63e6903a 100644 --- a/apps/docs/app/docs/[[...slug]]/page.tsx +++ b/apps/docs/app/docs/[[...slug]]/page.tsx @@ -32,7 +32,7 @@ async function getTocInsertions(slug: string): Promise { const [pluginOptionsToc, optimizationOptionsToc, assumptionsToc, integrationOptionsToc] = await Promise.all([ getAutoOptionSectionsToc({ path: pluginTypesPath, - name: 'PluginOptions', + name: 'BoostOptions', idPrefix: 'plugin-options', depth: 3, }), diff --git a/apps/docs/content/docs/compatibility/unistyles.mdx b/apps/docs/content/docs/compatibility/unistyles.mdx index 830b2ae3..eabfabf2 100644 --- a/apps/docs/content/docs/compatibility/unistyles.mdx +++ b/apps/docs/content/docs/compatibility/unistyles.mdx @@ -3,23 +3,19 @@ title: Unistyles Support description: Keep Unistyles styling working on Boost-optimized components. --- -React Native Boost is compatible with react-native-unistyles v3. Previous versions of Unistyles are untested and not officially supported. +React Native Boost is compatible with Unistyles v3. Previous versions of Unistyles are untested and not officially supported. ## Setup -Enable Boost's Unistyles support layer through the Babel plugin's config options: +Enable Boost's Unistyles support layer in `metro.config.js`: ```js -// babel.config.js -module.exports = { - plugins: [ - ['react-native-boost/plugin', { integrations: { unistyles: 'on' } }], - ['react-native-unistyles/plugin', { root: 'src' }], - ], -}; +module.exports = withBoostConfig(config, { + integrations: { unistyles: 'on' }, +}); ``` -Set `integrations.unistyles` to `off` when Unistyles is installed in your project's dependencies, but not actually used in code. The order of the two plugins does not matter. +Set `integrations.unistyles` to `off` when Unistyles is installed in your project's dependencies, but not actually used in code. React Native Boost can auto-detect Unistyles and enable this mode automatically if you haven't explicitly disabled it. However, this auto-detection is fragile and Boost will therefore log a warning to the console. Explicitly set the config flag as shown above to silence the warning. diff --git a/apps/docs/content/docs/configuration/configure.mdx b/apps/docs/content/docs/configuration/configure.mdx index 7ba7be49..60494e25 100644 --- a/apps/docs/content/docs/configuration/configure.mdx +++ b/apps/docs/content/docs/configuration/configure.mdx @@ -1,44 +1,48 @@ --- -title: Configure the Babel Plugin +title: Configure Boost description: Control logging, ignores, integrations, and optimization behavior. --- -The Babel plugin (`react-native-boost/plugin`) is the core of React Native Boost. Its defaults enable all stable optimizations. - ## Example Configuration -Only set values that differ from the defaults: +Pass options to `withBoostConfig` in your Metro config. ```js -// babel.config.js -module.exports = { - plugins: [ - [ - 'react-native-boost/plugin', - { - logLevel: 'debug', - ignores: ['node_modules/**'], - integrations: { - unistyles: 'on', - }, - optimizations: { - 'native-activity-indicator': 'off', - }, - }, - ], - ], -}; +// metro.config.js +const { getDefaultConfig } = require('expo/metro-config'); +const { withBoostConfig } = require('react-native-boost/metro'); + +module.exports = withBoostConfig(getDefaultConfig(__dirname), { + logLevel: 'debug', + ignores: ['node_modules/**'], + integrations: { + unistyles: 'on', + }, + optimizations: { + 'native-activity-indicator': 'off', + }, +}); ``` +If you're using a custom `resolver.resolveRequest` that redirects react-native to a different installation, you may need to set the React Native package path explicitly: + +```js +withBoostConfig(config, { + target: { reactNative: { packageJson: require.resolve('react-native/package.json') } }, +}); +``` + + + Boost 2 does not need Babel configuration when you use Metro. For other bundlers, see the [non-Metro setup guide](./non-metro). + + ## Plugin Options - + ## Optimization Options -Set an optimization to `on` or `off`. Omitted entries use their documented defaults. - -An optimization with its own options can use the tuple form `[state, options]`. +Set an optimization to `on` or `off`. Omitted entries use their defaults. - A false assumption can change runtime behavior. Be careful and ensure you know what you're doing. + A false assumption can change runtime behavior. Make sure you know what you're doing. - -## Environment-Specific Enablement - -You can enable React Native Boost by environment with Babel `env` config: - -```js -module.exports = { - env: { - development: { - plugins: ['react-native-boost/plugin'], - }, - }, -}; -``` - -See Babel docs: https://babeljs.io/docs/options#env diff --git a/apps/docs/content/docs/configuration/non-metro.mdx b/apps/docs/content/docs/configuration/non-metro.mdx new file mode 100644 index 00000000..a0505109 --- /dev/null +++ b/apps/docs/content/docs/configuration/non-metro.mdx @@ -0,0 +1,38 @@ +--- +title: Non-Metro environments +description: Configure Boost in apps that do not use Metro. +--- + +Since React Native Boost 2.x, we're using a Metro config adapter. In previous versions, a Babel config plugin was used instead. + +The Babel plugin is still provided as a fallback option for setups where Metro is unavailable. These are rare and it's likely that your app does not fall under this category. If you're unsure if you're using Metro, but simply don't see the `metro.config.js` file in your project, try running this command first to create it: + +```sh +npx expo customize metro.config.js +``` + +Then refer back to the [Metro configuration guide](./configure). + +If Metro is indeed unavailable in your setup, you can use the Babel plugin: + +```js +// babel.config.js +module.exports = { + plugins: [ + [ + 'react-native-boost/plugin', + { + target: { + reactNative: { + packageJson: require.resolve('react-native/package.json'), + }, + }, + }, + ], + ], +}; +``` + +Boost needs to know the React Native version to safely perform optimizations across different supported versions. Instead of `packageJson`, you can also supply `{ version: require('react-native/package.json').version }`. + +While the target is optional, we strongly recommend adding it. If it is not provided, the Babel plugin tries to detect the React Native version automatically, which is fragile and therefore logs a warning. diff --git a/apps/docs/content/docs/index.mdx b/apps/docs/content/docs/index.mdx index c017bd8d..ad1a0d77 100644 --- a/apps/docs/content/docs/index.mdx +++ b/apps/docs/content/docs/index.mdx @@ -7,21 +7,23 @@ import { Tab, Tabs } from 'fumadocs-ui/components/tabs' ## Introduction -React Native Boost consists of two pieces: +React Native Boost is a React Native performance compiler. -- A Babel plugin that statically analyzes your source code and replaces safe `Text`, `View`, `Image`, and `ActivityIndicator` components with their direct native output, leading to significant performance improvements compared to the JS-based wrapper components. -- A runtime package used internally by the plugin for cross-platform-safe imports and helper utilities. +It analyzes your app at build time and automatically applies safe performance optimizations across your React Native code. -The analyzer is intentionally strict and skips any optimizations that may lead to user-facing bugs and behavioral changes. +It eliminates unnecessary runtime work, replaces JavaScript abstractions with more efficient native equivalents, and fixes common performance pitfalls without requiring you to rewrite your application code. ## Compatibility | `react-native-boost` | React Native | | --- | --- | -| `0.x` | All versions[^1] | +| `0.x` | All versions | | `1.x` | `>=0.83` | +| `2.x` | `>=0.83` | -[^1]: Starting from React Native `0.80`, `react-native-boost@0` prints import deprecation warnings. [See react-native-community/discussions-and-proposals #893.](https://github.com/react-native-community/discussions-and-proposals/discussions/893) +In Boost 2.x, we validate runtime behavior against all versions of React Native since 0.83. Boost 0.x and 1.x are not supported anymore and may break with future React Native updates. + +Starting from React Native 0.80, Boost 0.x prints import deprecation warnings. [See react-native-community/discussions-and-proposals #893.](https://github.com/react-native-community/discussions-and-proposals/discussions/893) ## Getting Started @@ -58,20 +60,18 @@ The analyzer is intentionally strict and skips any optimizations that may lead t -2. If you use Expo and do not have a `babel.config.js` yet: +2. Add Boost to `metro.config.js`: + +```js +const { getDefaultConfig } = require('expo/metro-config'); +const { withBoostConfig } = require('react-native-boost/metro'); -```bash -npx expo customize babel.config.js +module.exports = withBoostConfig(getDefaultConfig(__dirname)); ``` -3. Add the plugin: +Bare React Native apps should import `getDefaultConfig` from `@react-native/metro-config` instead. -```js -// babel.config.js -module.exports = { - plugins: ['react-native-boost/plugin'], -}; -``` +If you do not use Metro in your project, refer to the [Babel plugin setup instructions](./configuration/non-metro.mdx) instead. If you're using Unistyles or Nativewind in your project, refer to these additional setup instructions: @@ -80,7 +80,7 @@ If you're using Unistyles or Nativewind in your project, refer to these addition -4. Restart the development server and clear cache: +3. Restart the development server and clear cache: diff --git a/apps/docs/content/docs/information/deep-dive.mdx b/apps/docs/content/docs/information/deep-dive.mdx index 048307d2..b6d23700 100644 --- a/apps/docs/content/docs/information/deep-dive.mdx +++ b/apps/docs/content/docs/information/deep-dive.mdx @@ -287,8 +287,8 @@ Dynamic values, or `aria-*` state/value groups that the wrapper merges, are rout ### Image `Image` source, style, and accessibility props are normalized before Boost swaps the wrapper for -`NativeImage`. Static values are processed at build time. Dynamic values use small runtime helpers. -Compared to `Text` and `View`, the host component for `Image` is not imported directly. React Native does not export it through a supported interface, and only exports it through deprecated deep imports which log warnings when used. The runtime loads the public `Image` module to register `RCTImageView`, then renders that registered host directly. +`NativeImage`. Static values are processed at build time. This includes parsing static `srcSet` density candidates with the detected React Native version and +hoisting the generated source list. Dynamic values use small runtime helpers. Compared to `Text` and `View`, the host component for `Image` is not imported directly. React Native does not export it through a supported interface, and only exports it through deprecated deep imports which log warnings when used. The runtime loads the public `Image` module to register `RCTImageView`, then renders that registered host directly. ### ActivityIndicator @@ -297,10 +297,9 @@ Compared to `Text` and `View`, the host component for `Image` is not imported di For the complete matrix of what's optimized, translated, and skipped, see [Coverage & Bailouts](/docs/information/optimization-coverage). -## Inside the plugin +## Inside the compiler -The plugin is a single Babel visitor on `JSXOpeningElement`. For each element it runs the `Text`, -`View`, `Image`, and `ActivityIndicator` optimizers; each follows the same shape. +The Metro integration injects one Babel visitor on `JSXOpeningElement`. For each element it runs the `Text`, `View`, `Image`, and `ActivityIndicator` optimizers. withBoostConfig(config); +void acceptsMetroConfig; + +afterEach(() => { + vi.restoreAllMocks(); + for (const directory of temporaryDirectories.splice(0)) fs.rmSync(directory, { recursive: true, force: true }); +}); + +describe('Metro integration', () => { + it('wraps the configured Babel transformer with the target and Boost options', () => { + const config = withBoostConfig( + { + projectRoot: process.cwd(), + transformer: { babelTransformerPath: require.resolve('metro-babel-transformer') }, + }, + { logLevel: 'silent', optimizations: { 'native-text': 'off' } } + ); + const wrapper = fs.readFileSync(config.transformer.babelTransformerPath, 'utf8'); + const { version } = require('react-native/package.json') as { version: string }; + + expect(wrapper).toContain('createTransformer'); + expect(wrapper).toContain(JSON.stringify(require.resolve('metro-babel-transformer'))); + expect(wrapper).not.toContain('module.parent'); + expect(wrapper).toContain(`"version":"${version}"`); + expect(wrapper).toContain('"native-text":"off"'); + }); + + it('resolves a named Babel transformer from the project', () => { + const projectRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'react-native-boost-metro-')); + temporaryDirectories.push(projectRoot); + fs.writeFileSync(path.join(projectRoot, 'package.json'), '{}'); + const transformerDirectory = path.join(projectRoot, 'node_modules', 'custom-transformer'); + fs.mkdirSync(transformerDirectory, { recursive: true }); + fs.writeFileSync(path.join(transformerDirectory, 'package.json'), JSON.stringify({ main: 'index.js' })); + const transformer = path.join(transformerDirectory, 'index.js'); + fs.writeFileSync(transformer, 'exports.transform = () => ({ ast: {} });'); + + const config = withBoostConfig( + { projectRoot, transformer: { babelTransformerPath: 'custom-transformer' } }, + { logLevel: 'silent' } + ); + const wrapper = fs.readFileSync(config.transformer.babelTransformerPath, 'utf8'); + + expect(wrapper).toContain(JSON.stringify(fs.realpathSync(transformer))); + }); + + it('fails early when the Babel transformer cannot be resolved', () => { + expect(() => + withBoostConfig( + { + projectRoot: process.cwd(), + transformer: { babelTransformerPath: 'missing-react-native-boost-transformer' }, + }, + { logLevel: 'silent' } + ) + ).toThrow('Set transformer.babelTransformerPath with require.resolve(...)'); + }); + + it('rejects duplicate Metro configuration', () => { + const config = withBoostConfig({ + projectRoot: process.cwd(), + transformer: { babelTransformerPath: require.resolve('metro-babel-transformer') }, + }); + + expect(() => withBoostConfig(config)).toThrow('applied more than once'); + }); + + it('uses an explicit React Native package and changes the cache entry with its version', () => { + const firstPackage = createPackage('0.86.0'); + const secondPackage = createPackage('0.87.1'); + const baseConfig = { + projectRoot: process.cwd(), + transformer: { babelTransformerPath: require.resolve('metro-babel-transformer') }, + }; + + const first = withBoostConfig(baseConfig, { + logLevel: 'silent', + target: { reactNative: { packageJson: firstPackage } }, + }); + const second = withBoostConfig(baseConfig, { + logLevel: 'silent', + target: { reactNative: { packageJson: secondPackage } }, + }); + + expect(first.transformer.babelTransformerPath).not.toBe(second.transformer.babelTransformerPath); + }); + + it('warns when React Native cannot be resolved', () => { + const projectRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'react-native-boost-metro-')); + temporaryDirectories.push(projectRoot); + fs.writeFileSync(path.join(projectRoot, 'package.json'), '{}'); + const warn = vi.spyOn(console, 'warn').mockImplementation(() => undefined); + + withBoostConfig({ + projectRoot, + transformer: { babelTransformerPath: require.resolve('metro-babel-transformer') }, + }); + + expect(warn).toHaveBeenCalledOnce(); + }); +}); + +function createPackage(version: string): string { + const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'react-native-boost-package-')); + temporaryDirectories.push(directory); + const packageJson = path.join(directory, 'package.json'); + fs.writeFileSync(packageJson, JSON.stringify({ name: 'react-native', version })); + return packageJson; +} diff --git a/packages/react-native-boost/src/metro/__tests__/transformer.test.ts b/packages/react-native-boost/src/metro/__tests__/transformer.test.ts new file mode 100644 index 00000000..186d693f --- /dev/null +++ b/packages/react-native-boost/src/metro/__tests__/transformer.test.ts @@ -0,0 +1,37 @@ +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import { afterEach, describe, expect, it } from 'vitest'; +import { createTransformer } from '../transformer'; + +const temporaryDirectories: string[] = []; + +afterEach(() => { + for (const directory of temporaryDirectories.splice(0)) fs.rmSync(directory, { recursive: true, force: true }); +}); + +describe('Metro transformer', () => { + it('injects Boost options and verifies the transform result', async () => { + const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'react-native-boost-transformer-')); + temporaryDirectories.push(directory); + const delegatePath = path.join(directory, 'delegate.cjs'); + const pluginPath = path.join(directory, 'plugin.cjs'); + fs.writeFileSync( + delegatePath, + `exports.transform = args => ({ ast: {}, metadata: { reactNativeBoost: { injectionId: args.plugins[0][1].__reactNativeBoost } } });\nexports.getCacheKey = () => 'delegate';\n` + ); + fs.writeFileSync(pluginPath, 'module.exports = () => ({ visitor: {} });\n'); + const injectionId = 'test-injection'; + const transformer = createTransformer({ + babelTransformerPath: delegatePath, + pluginPath, + pluginOptions: { logLevel: 'silent' }, + injectionId, + }); + + const result = await transformer.transform({ filename: 'case.js', src: '', options: {}, plugins: [] }); + + expect(result.metadata?.reactNativeBoost).toEqual({ injectionId }); + expect(transformer.getCacheKey()).toHaveLength(64); + }); +}); diff --git a/packages/react-native-boost/src/metro/index.ts b/packages/react-native-boost/src/metro/index.ts new file mode 100644 index 00000000..6856a168 --- /dev/null +++ b/packages/react-native-boost/src/metro/index.ts @@ -0,0 +1,110 @@ +import { createHash } from 'node:crypto'; +import fs from 'node:fs'; +import { createRequire } from 'node:module'; +import os from 'node:os'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import type { BabelPluginOptions, MetroPluginOptions } from '../plugin/types'; +import { validateMetroOptions } from '../plugin/utils/options'; +import { resolveReactNativeTarget } from '../plugin/utils/react-native-target'; +import type { MetroTransformerManifest } from './types'; + +export type { MetroPluginOptions } from '../plugin/types'; + +const moduleDirectory = path.dirname(fileURLToPath(import.meta.url)); +const transformerDirectory = path.join(os.tmpdir(), 'react-native-boost'); + +type MetroConfig = { + projectRoot?: string; + transformer?: { + babelTransformerPath?: string; + }; + resolver?: { + extraNodeModules?: Record; + resolveRequest?: unknown; + }; +}; + +export function withBoostConfig(config: T, rawOptions: MetroPluginOptions = {}): T { + const options = validateMetroOptions(rawOptions); + const projectRoot = path.resolve(config.projectRoot ?? process.cwd()); + const delegateRequest = config.transformer?.babelTransformerPath ?? 'metro-babel-transformer'; + if (path.isAbsolute(delegateRequest) && path.dirname(delegateRequest) === transformerDirectory) { + throw new Error('[react-native-boost] withBoostConfig was applied more than once.'); + } + const delegatePath = resolveBabelTransformer(delegateRequest, projectRoot); + const mappedReactNative = config.resolver?.extraNodeModules?.['react-native']; + const configuredPackageJson = + options.target?.reactNative?.packageJson ?? + (mappedReactNative ? path.join(mappedReactNative, 'package.json') : undefined); + const targetResolution = resolveReactNativeTarget( + configuredPackageJson ? { packageJson: configuredPackageJson } : undefined, + [path.join(projectRoot, 'package.json')] + ); + if (configuredPackageJson && !targetResolution.target) { + throw new Error(`[react-native-boost] Cannot read React Native package at ${configuredPackageJson}.`); + } + const pluginOptions = createPluginOptions(options, targetResolution.target?.version); + const injectionId = hash( + `${projectRoot}:${JSON.stringify(pluginOptions)}:${targetResolution.target?.fingerprint ?? 'unknown'}` + ); + const manifest: MetroTransformerManifest = { + babelTransformerPath: delegatePath, + pluginPath: path.resolve(moduleDirectory, '../plugin/index.js'), + pluginOptions, + injectionId, + }; + const transformerPath = writeTransformer(manifest); + + if (config.resolver?.resolveRequest && !configuredPackageJson && options.logLevel !== 'silent') { + console.warn( + '[react-native-boost] A custom Metro resolver is active. Set target.reactNative.packageJson if it resolves React Native elsewhere.' + ); + } + + if (!targetResolution.target && options.logLevel !== 'silent') { + console.warn( + '[react-native-boost] React Native could not be detected. Version-dependent optimizations will be skipped.' + ); + } + + return { + ...config, + transformer: { + ...config.transformer, + babelTransformerPath: transformerPath, + }, + }; +} + +function createPluginOptions(options: MetroPluginOptions, reactNativeVersion?: string): BabelPluginOptions { + const { target, ...pluginOptions } = options; + void target; + if (!reactNativeVersion) return pluginOptions; + return { ...pluginOptions, target: { reactNative: { version: reactNativeVersion } } }; +} + +// Metro accepts a transformer path, so a deterministic wrapper carries this project's options into its workers. +function writeTransformer(manifest: MetroTransformerManifest): string { + const transformerModule = path.resolve(moduleDirectory, 'transformer.js'); + const source = `module.exports = require(${JSON.stringify(transformerModule)}).createTransformer(${JSON.stringify(manifest)});\n`; + const filename = path.join(transformerDirectory, `${hash(source)}.cjs`); + fs.mkdirSync(transformerDirectory, { recursive: true }); + if (!fs.existsSync(filename)) fs.writeFileSync(filename, source); + return filename; +} + +function resolveBabelTransformer(request: string, projectRoot: string): string { + try { + return createRequire(path.join(projectRoot, 'package.json')).resolve(request); + } catch (error) { + throw new Error( + `[react-native-boost] Cannot resolve Babel transformer ${JSON.stringify(request)} from ${projectRoot}. Set transformer.babelTransformerPath with require.resolve(...).`, + { cause: error } + ); + } +} + +function hash(value: string): string { + return createHash('sha256').update(value).digest('hex'); +} diff --git a/packages/react-native-boost/src/metro/transformer.ts b/packages/react-native-boost/src/metro/transformer.ts new file mode 100644 index 00000000..b00ad4f1 --- /dev/null +++ b/packages/react-native-boost/src/metro/transformer.ts @@ -0,0 +1,71 @@ +import { createHash } from 'node:crypto'; +import fs from 'node:fs'; +import { createRequire } from 'node:module'; +import { fileURLToPath } from 'node:url'; +import type { TransformOptions } from '@babel/core'; +import type { MetroTransformerManifest } from './types'; + +const requireFromTransformer = createRequire(import.meta.url); +const moduleFilename = fileURLToPath(import.meta.url); + +type BabelTransformerArgs = { + filename: string; + options: Record; + plugins?: TransformOptions['plugins']; + src: string; +}; + +type TransformResult = { + ast: unknown; + metadata?: Record; +}; + +type BabelTransformer = { + transform: (arguments_: BabelTransformerArgs) => TransformResult | Promise; + getCacheKey?: (options?: Record) => string; +}; + +export function createTransformer(manifest: MetroTransformerManifest) { + const delegate = loadTransformer(manifest.babelTransformerPath); + const boostPlugin = requireFromTransformer(manifest.pluginPath) as unknown; + const pluginOptions = { + ...manifest.pluginOptions, + __reactNativeBoost: manifest.injectionId, + }; + + return { + async transform(arguments_: BabelTransformerArgs): Promise { + const result = await delegate.transform({ + ...arguments_, + plugins: [[boostPlugin, pluginOptions], ...(arguments_.plugins ?? [])], + }); + return validateResult(result); + }, + getCacheKey(options?: Record): string { + const delegateKey = delegate.getCacheKey?.(options) ?? ''; + return createHash('sha256') + .update(JSON.stringify(manifest)) + .update(delegateKey) + .update(fs.readFileSync(moduleFilename)) + .update(fs.readFileSync(manifest.pluginPath)) + .digest('hex'); + }, + }; + + function validateResult(result: TransformResult): TransformResult { + const metadata = result.metadata?.reactNativeBoost as { injectionId?: unknown } | undefined; + if (metadata?.injectionId !== manifest.injectionId) { + throw new Error('[react-native-boost] The configured Babel transformer did not run the Boost plugin.'); + } + return result; + } +} + +function loadTransformer(modulePath: string): BabelTransformer { + const loaded = requireFromTransformer(modulePath) as BabelTransformer | { default?: BabelTransformer }; + const transformer = 'transform' in loaded ? loaded : loaded.default; + if (!transformer || typeof transformer.transform !== 'function') { + throw new Error(`[react-native-boost] ${modulePath} is not a Babel transformer.`); + } + return transformer; +} diff --git a/packages/react-native-boost/src/metro/types.ts b/packages/react-native-boost/src/metro/types.ts new file mode 100644 index 00000000..23fdc9f4 --- /dev/null +++ b/packages/react-native-boost/src/metro/types.ts @@ -0,0 +1,8 @@ +import type { BabelPluginOptions } from '../plugin/types'; + +export interface MetroTransformerManifest { + babelTransformerPath: string; + pluginPath: string; + pluginOptions: BabelPluginOptions; + injectionId: string; +} diff --git a/packages/react-native-boost/src/plugin/index.ts b/packages/react-native-boost/src/plugin/index.ts index 3d43e074..2f762e0e 100644 --- a/packages/react-native-boost/src/plugin/index.ts +++ b/packages/react-native-boost/src/plugin/index.ts @@ -1,17 +1,24 @@ -import { createRequire } from 'node:module'; import path from 'node:path'; import { declare } from '@babel/helper-plugin-utils'; import { textOptimizer } from './optimizers/text'; import { imageOptimizer } from './optimizers/image'; -import type { PluginOptions, TargetPlatform } from './types'; +import type { BabelPluginOptions, HubFile, TargetPlatform } from './types'; import { createLogger } from './utils/logger'; import { viewOptimizer } from './optimizers/view'; import { isIgnoredFile } from './utils/common'; import { isUnistylesInstalled } from './utils/unistyles'; import { activityIndicatorOptimizer } from './optimizers/activity-indicator'; -import { validatePluginOptions } from './utils/options'; +import { validateBabelOptions } from './utils/options'; +import PluginError from './utils/plugin-error'; +import { + getReactNativeMinor, + resolveReactNativeTarget, + type ReactNativeTargetResolution, +} from './utils/react-native-target'; export type { + BabelPluginOptions, + BoostOptions, IntegrationState, LogLevel, OptimizationSetting, @@ -19,24 +26,45 @@ export type { PluginAssumptions, PluginIntegrationOptions, PluginOptimizationOptions, - PluginOptions, + ReactNativeTargetOption, } from './types'; +const warnings = new Set(); + export default declare((api, rawOptions, dirname?: string) => { api.assertVersion(7); - const options = validatePluginOptions(rawOptions ?? {}); - const logger = createLogger(options.logLevel ?? 'info'); - const reactNativeMinor = resolveReactNativeMinor(dirname); + const injectionId = readInternalInjectionId(rawOptions); + const callerData = api.caller((caller) => + JSON.stringify({ + bundler: (caller as { bundler?: unknown } | undefined)?.bundler, + platform: (caller as { platform?: unknown } | undefined)?.platform, + }) + ) as string; + const caller = JSON.parse(callerData) as { bundler?: unknown; platform?: unknown }; + if (!injectionId && caller.bundler === 'metro') { + warnOnce( + createLogger('warn'), + 'React Native Boost 2 must be configured through Metro. Move your options to withBoostConfig in metro.config.js and remove react-native-boost/plugin from babel.config.js.' + ); + return { name: 'react-native-boost', visitor: {} }; + } - // Target platform, resolved at build time. Metro sets this on the Babel caller per platform bundle, - // letting optimizers inline platform-specific defaults instead of deferring them to the runtime. - const platform = api.caller((caller) => - normalizeTargetPlatform((caller as { platform?: string } | undefined)?.platform) - ); + const options = validateBabelOptions(stripInternalOptions(rawOptions ?? {})); + const logger = createLogger(options.logLevel ?? 'info'); + const platform = normalizeTargetPlatform(caller.platform); + const configuredTarget = options.target?.reactNative; + let targetResolution: ReactNativeTargetResolution | undefined = configuredTarget + ? resolveReactNativeTarget(configuredTarget, getRequireOrigins(dirname)) + : injectionId + ? { versions: [] } + : undefined; + if (targetResolution?.target?.packageJson) { + (api as typeof api & { addExternalDependency?: (file: string) => void }).addExternalDependency?.( + targetResolution.target.packageJson + ); + } - // A detected package does not prove its Babel plugin is active, so auto-detection still asks users - // to configure the integration explicitly. const unistylesMode = options.integrations?.unistyles ?? 'auto'; const autoDetectedUnistyles = unistylesMode === 'auto' && isUnistylesInstalled(dirname); const unistylesEnabled = unistylesMode === 'on' || autoDetectedUnistyles; @@ -45,16 +73,44 @@ export default declare((api, rawOptions, dirname?: string) => { logger.warning({ message: 'react-native-unistyles was detected, so Unistyles mode was enabled automatically. Set ' + - "`integrations: { unistyles: 'on' }` in the react-native-boost plugin options to make this explicit, or " + - "`integrations: { unistyles: 'off' }` to opt out.", + "`integrations: { unistyles: 'on' }` to make this explicit, or set it to `off` to opt out.", }); } + const resolveReactNativeMinor = (file: HubFile): number | undefined => { + if (!targetResolution) { + const fileOptions = file.opts as HubFile['opts'] & { cwd?: string }; + targetResolution = resolveReactNativeTarget(undefined, [ + fileOptions.filename, + fileOptions.cwd ? path.join(fileOptions.cwd, 'package.json') : undefined, + ...getRequireOrigins(dirname), + ]); + const versions = targetResolution.versions.join(', '); + if (targetResolution.target && !injectionId) { + warnOnce( + logger, + `Using best-effort React Native ${targetResolution.target.version} detection${versions.includes(',') ? ` from versions ${versions}` : ''}.` + ); + } + } + + if (!targetResolution.target && !injectionId) { + warnOnce(logger, 'React Native could not be detected. Version-dependent optimizations will be skipped.'); + } + + return getReactNativeMinor(targetResolution.target?.version); + }; + return { name: 'react-native-boost', + pre(file) { + if (injectionId) (file.metadata as Record).reactNativeBoost = { injectionId }; + }, visitor: { JSXOpeningElement(path) { if (isIgnoredFile(path, options.ignores ?? [])) return; + const file = (path.hub as unknown as { file: HubFile }).file; + const reactNativeMinor = resolveReactNativeMinor(file); if (isOptimizationEnabled(options, 'native-text')) textOptimizer(path, logger, options, platform, unistylesEnabled); if (isOptimizationEnabled(options, 'native-view')) @@ -69,25 +125,42 @@ export default declare((api, rawOptions, dirname?: string) => { }); function isOptimizationEnabled( - options: PluginOptions, - name: keyof NonNullable + options: BabelPluginOptions, + name: keyof NonNullable ): boolean { const setting = options.optimizations?.[name]; return (Array.isArray(setting) ? setting[0] : setting) !== 'off'; } -function normalizeTargetPlatform(platform?: string): TargetPlatform | undefined { +function normalizeTargetPlatform(platform: unknown): TargetPlatform | undefined { return platform === 'ios' || platform === 'android' || platform === 'web' ? platform : undefined; } -function resolveReactNativeMinor(dirname?: string): number | undefined { - try { - const requireFromProject = createRequire(path.resolve(dirname ?? process.cwd(), 'package.json')); - const { version } = requireFromProject('react-native/package.json') as { version?: unknown }; - const match = typeof version === 'string' ? /^0\.(\d+)\./.exec(version) : null; - const minor = match ? Number(match[1]) : undefined; - return minor !== undefined && minor >= 83 && minor <= 87 ? minor : undefined; - } catch { - return undefined; +function getRequireOrigins(dirname?: string): Array { + return [dirname ? path.join(dirname, 'package.json') : undefined, path.join(process.cwd(), 'package.json')]; +} + +function readInternalInjectionId(rawOptions: unknown): string | undefined { + const value = + typeof rawOptions === 'object' && rawOptions !== null && !Array.isArray(rawOptions) + ? (rawOptions as Record).__reactNativeBoost + : undefined; + if (value === undefined) return; + if (typeof value !== 'string' || value.length === 0) { + throw new PluginError('The Metro integration ID is invalid.'); } + return value; +} + +function stripInternalOptions(rawOptions: unknown): unknown { + if (typeof rawOptions !== 'object' || rawOptions === null || Array.isArray(rawOptions)) return rawOptions; + const { __reactNativeBoost, ...options } = rawOptions as Record; + void __reactNativeBoost; + return options; +} + +function warnOnce(logger: ReturnType, message: string): void { + if (warnings.has(message)) return; + warnings.add(message); + logger.warning({ message }); } diff --git a/packages/react-native-boost/src/plugin/optimizers/activity-indicator/__tests__/index.test.ts b/packages/react-native-boost/src/plugin/optimizers/activity-indicator/__tests__/index.test.ts index ea9b64ce..e97d6550 100644 --- a/packages/react-native-boost/src/plugin/optimizers/activity-indicator/__tests__/index.test.ts +++ b/packages/react-native-boost/src/plugin/optimizers/activity-indicator/__tests__/index.test.ts @@ -1,7 +1,7 @@ import { transformSync } from '@babel/core'; import { describe, expect, it } from 'vitest'; import { activityIndicatorOptimizer } from '..'; -import type { PluginOptions, TargetPlatform } from '../../../types'; +import type { BoostOptions, TargetPlatform } from '../../../types'; import { generateTestPlugin } from '../../../utils/generate-test-plugin'; const transformActivityIndicator = ( @@ -9,7 +9,7 @@ const transformActivityIndicator = ( platform?: TargetPlatform, options: { unknownAncestorsDoNotRenderText?: boolean; unistylesEnabled?: boolean } = {} ): string => { - const pluginOptions: PluginOptions = { + const pluginOptions: BoostOptions = { assumptions: { unknownAncestorsDoNotRenderText: options.unknownAncestorsDoNotRenderText }, integrations: { unistyles: options.unistylesEnabled ? 'on' : 'off' }, }; diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts index 829648eb..87d067a9 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts +++ b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts @@ -404,6 +404,29 @@ describe('image srcSet output', () => { expect(output).not.toContain('_NativeImage'); }); + it('uses an explicit React Native version from the Babel plugin options', async () => { + const output = await formatTestResult( + transformSync(`import { Image } from 'react-native';\n;`, { + configFile: false, + babelrc: false, + filename: 'case.jsx', + caller: { name: 'metro', platform: 'ios' } as TransformCaller, + plugins: [ + '@babel/plugin-syntax-jsx', + [ + boostPlugin, + { + logLevel: 'silent', + target: { reactNative: { version: '0.87.1' } }, + }, + ], + ], + })!.code! + ); + + expect(getSourceObjects(getHoistedImageSources(output)[0]!)).toHaveLength(2); + }); + it('detects the installed React Native version through the Babel plugin', async () => { const output = await formatTestResult( transformSync(`import { Image } from 'react-native';\n;`, { diff --git a/packages/react-native-boost/src/plugin/types/index.ts b/packages/react-native-boost/src/plugin/types/index.ts index cbefd6c9..8b359a24 100644 --- a/packages/react-native-boost/src/plugin/types/index.ts +++ b/packages/react-native-boost/src/plugin/types/index.ts @@ -53,40 +53,37 @@ export interface PluginIntegrationOptions { export type LogLevel = 'silent' | 'warn' | 'info' | 'debug'; -export interface PluginOptions { - /** - * Configures individual optimizations. Omitted entries use their documented defaults. - * @default {} - */ +export interface BoostOptions { + /** Configures individual optimizations. */ optimizations?: PluginOptimizationOptions; - /** - * Declares project-wide facts that let Boost apply optimizations it cannot prove safe by static analysis. - * @default {} - */ + /** Declares project-wide facts that enable additional optimizations. */ assumptions?: PluginAssumptions; - /** - * Configures behavior for supported third-party libraries. - * @default {} - */ + /** Configures supported third-party libraries. */ integrations?: PluginIntegrationOptions; - /** - * Paths to ignore from optimization. - * - * Patterns are resolved from Babel's current working directory. - * In nested monorepo apps, parent segments may be needed, for example `../../node_modules/**`. - * @default [] - */ + /** Paths to ignore from optimization. */ ignores?: string[]; - /** - * Controls plugin logging. - * - * `warn` logs warnings and forced optimizations. `info` also logs successful optimizations. `debug` - * also logs skipped optimizations and their reasons. `silent` disables all logs. - * @default 'info' - */ + /** Controls plugin logging. */ logLevel?: LogLevel; } +export type ReactNativeTargetOption = + | { packageJson: string; version?: never } + | { packageJson?: never; version: string }; + +export interface BabelPluginOptions extends BoostOptions { + /** Supplies the React Native target when automatic detection is unsuitable. */ + target?: { + reactNative?: ReactNativeTargetOption; + }; +} + +export interface MetroPluginOptions extends BoostOptions { + /** Supplies the React Native package used by a custom Metro resolver. */ + target?: { + reactNative?: { packageJson: string }; + }; +} + export type OptimizableComponent = 'Text' | 'View' | 'Image' | 'ActivityIndicator'; export type TargetPlatform = 'ios' | 'android' | 'web'; @@ -116,7 +113,7 @@ export interface PluginLogger { export type Optimizer = ( path: NodePath, logger: PluginLogger, - options?: PluginOptions, + options?: BoostOptions, /** Target platform from Babel's caller (e.g. Metro sets `'ios'`/`'android'`). Lets optimizers resolve platform-specific defaults at build time. */ platform?: TargetPlatform, /** diff --git a/packages/react-native-boost/src/plugin/utils/__tests__/options.test.ts b/packages/react-native-boost/src/plugin/utils/__tests__/options.test.ts index ec316f00..6b1b1e31 100644 --- a/packages/react-native-boost/src/plugin/utils/__tests__/options.test.ts +++ b/packages/react-native-boost/src/plugin/utils/__tests__/options.test.ts @@ -1,7 +1,7 @@ -import { transformSync } from '@babel/core'; -import { describe, expect, it } from 'vitest'; +import { transformSync, type TransformCaller } from '@babel/core'; +import { describe, expect, it, vi } from 'vitest'; import boostPlugin from '../../index'; -import { validatePluginOptions } from '../options'; +import { validateBabelOptions, validateMetroOptions } from '../options'; describe('plugin options', () => { it('accepts the current configuration', () => { @@ -11,9 +11,48 @@ describe('plugin options', () => { integrations: { unistyles: 'on' as const }, ignores: ['node_modules/**'], logLevel: 'info' as const, + target: { reactNative: { version: '0.87.1' } }, }; - expect(validatePluginOptions(options)).toEqual(options); + expect(validateBabelOptions(options)).toEqual(options); + }); + + it('ignores an unmigrated Metro plugin and asks the user to move its old options', () => { + const log = vi.spyOn(console, 'log').mockImplementation(() => undefined); + const output = transformSync(`import { Text } from 'react-native'; Hello;`, { + configFile: false, + babelrc: false, + caller: { name: 'metro', bundler: 'metro', platform: 'ios' } as TransformCaller, + plugins: ['@babel/plugin-syntax-jsx', [boostPlugin, { verbose: true, optimizations: { text: false } }]], + })!.code!; + + expect(output).not.toContain('NativeText'); + expect(log).toHaveBeenCalledWith(expect.stringContaining('Move your options to withBoostConfig')); + log.mockRestore(); + }); + + it('runs only the Metro-injected plugin when a manual copy is also configured', () => { + const output = transformSync(`import { Text } from 'react-native'; Hello;`, { + configFile: false, + babelrc: false, + caller: { name: 'metro', bundler: 'metro', platform: 'ios' } as TransformCaller, + plugins: [ + '@babel/plugin-syntax-jsx', + [boostPlugin, {}, 'manual'], + [boostPlugin, { logLevel: 'silent', __reactNativeBoost: 'injected' }, 'injected'], + ], + })!.code!; + + expect(output).toContain('NativeText'); + }); + + it('keeps Metro-only options separate', () => { + expect(validateMetroOptions({ target: { reactNative: { packageJson: '/react-native/package.json' } } })).toEqual({ + target: { reactNative: { packageJson: '/react-native/package.json' } }, + }); + expect(() => validateMetroOptions({ target: { reactNative: { version: '0.87.1' } } })).toThrow( + 'Unknown `target.reactNative` option `version`' + ); }); it('disables an optimization with its public name', () => { @@ -39,7 +78,7 @@ describe('plugin options', () => { ], [{ optimizations: { text: false } }, 'Use `native-text` instead.'], ])('rejects removed configuration %#', (options, message) => { - expect(() => validatePluginOptions(options)).toThrow(message); + expect(() => validateBabelOptions(options)).toThrow(message); }); it.each([ @@ -50,7 +89,13 @@ describe('plugin options', () => { [{ logLevel: 'verbose' }, '`logLevel` must be one of'], [{ optimizations: { 'native-text': true } }, 'must be `on` or `off`'], [{ integrations: { unistyles: true } }, 'must be `auto`, `on`, or `off`'], + [{ target: { reactNative: {} } }, 'must contain either `packageJson` or `version`'], + [{ target: { reactNative: { version: '0.87' } } }, 'must be a full React Native version'], + [ + { target: { reactNative: { packageJson: 'package.json', version: '0.87.1' } } }, + 'must contain either `packageJson` or `version`', + ], ])('rejects invalid configuration %#', (options, message) => { - expect(() => validatePluginOptions(options)).toThrow(message); + expect(() => validateBabelOptions(options)).toThrow(message); }); }); diff --git a/packages/react-native-boost/src/plugin/utils/__tests__/react-native-target.test.ts b/packages/react-native-boost/src/plugin/utils/__tests__/react-native-target.test.ts new file mode 100644 index 00000000..01723da9 --- /dev/null +++ b/packages/react-native-boost/src/plugin/utils/__tests__/react-native-target.test.ts @@ -0,0 +1,52 @@ +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import { afterEach, describe, expect, it } from 'vitest'; +import { getReactNativeMinor, resolveReactNativeTarget } from '../react-native-target'; + +const temporaryDirectories: string[] = []; + +afterEach(() => { + for (const directory of temporaryDirectories.splice(0)) fs.rmSync(directory, { recursive: true, force: true }); +}); + +describe('React Native target resolution', () => { + it('uses the version resolved from the requiring project', () => { + const project = createProject('0.87.1'); + const resolution = resolveReactNativeTarget(undefined, [path.join(project, 'package.json')]); + + expect(resolution.target?.version).toBe('0.87.1'); + expect(resolution.target?.packageJson).toBe( + fs.realpathSync(path.join(project, 'node_modules/react-native/package.json')) + ); + expect(getReactNativeMinor(resolution.target?.version)).toBe(87); + }); + + it('uses the most common version when candidates disagree', () => { + const first = createProject('0.86.0'); + const second = createProject('0.87.1'); + const third = createProject('0.87.1'); + const resolution = resolveReactNativeTarget(undefined, [ + path.join(first, 'package.json'), + path.join(second, 'package.json'), + path.join(third, 'package.json'), + ]); + + expect(resolution.target?.version).toBe('0.87.1'); + expect(resolution.versions).toEqual(['0.86.0', '0.87.1']); + }); + + it('accepts an explicit version when no package can be resolved', () => { + expect(resolveReactNativeTarget({ version: '0.85.2' }, []).target?.version).toBe('0.85.2'); + }); +}); + +function createProject(version: string): string { + const project = fs.mkdtempSync(path.join(os.tmpdir(), 'react-native-boost-target-')); + temporaryDirectories.push(project); + const packageDirectory = path.join(project, 'node_modules/react-native'); + fs.mkdirSync(packageDirectory, { recursive: true }); + fs.writeFileSync(path.join(project, 'package.json'), '{}'); + fs.writeFileSync(path.join(packageDirectory, 'package.json'), JSON.stringify({ name: 'react-native', version })); + return project; +} diff --git a/packages/react-native-boost/src/plugin/utils/generate-test-plugin.ts b/packages/react-native-boost/src/plugin/utils/generate-test-plugin.ts index 49edfd59..f8386ea9 100644 --- a/packages/react-native-boost/src/plugin/utils/generate-test-plugin.ts +++ b/packages/react-native-boost/src/plugin/utils/generate-test-plugin.ts @@ -1,8 +1,8 @@ import { declare } from '@babel/helper-plugin-utils'; -import { Optimizer, PluginOptions, TargetPlatform } from '../types'; +import { BoostOptions, Optimizer, TargetPlatform } from '../types'; import { createLogger } from './logger'; -export const generateTestPlugin = (optimizer: Optimizer, options: PluginOptions = {}, platform?: TargetPlatform) => { +export const generateTestPlugin = (optimizer: Optimizer, options: BoostOptions = {}, platform?: TargetPlatform) => { const logger = createLogger('silent'); return declare((api) => { diff --git a/packages/react-native-boost/src/plugin/utils/options.ts b/packages/react-native-boost/src/plugin/utils/options.ts index e52c96f0..a0307a08 100644 --- a/packages/react-native-boost/src/plugin/utils/options.ts +++ b/packages/react-native-boost/src/plugin/utils/options.ts @@ -1,7 +1,9 @@ -import type { IntegrationState, LogLevel, OptimizationState, PluginOptions } from '../types'; +import type { BabelPluginOptions, IntegrationState, LogLevel, MetroPluginOptions, OptimizationState } from '../types'; import PluginError from './plugin-error'; -const pluginOptionKeys = ['optimizations', 'assumptions', 'integrations', 'ignores', 'logLevel']; +const sharedOptionKeys = ['optimizations', 'assumptions', 'integrations', 'ignores', 'logLevel']; +const babelOptionKeys = [...sharedOptionKeys, 'target']; +const metroOptionKeys = [...sharedOptionKeys, 'target']; const optimizationKeys = ['native-text', 'native-view', 'native-image', 'native-activity-indicator']; const assumptionKeys = ['unknownAncestorsDoNotRenderText']; const integrationKeys = ['unistyles']; @@ -27,9 +29,21 @@ const legacyOptimizations: Record = { activityIndicator: 'Use `native-activity-indicator` instead.', }; -export function validatePluginOptions(rawOptions: unknown): PluginOptions { +export function validateBabelOptions(rawOptions: unknown): BabelPluginOptions { + const options = validateOptions(rawOptions, babelOptionKeys); + if (options.target !== undefined) validateTarget(options.target, true); + return options as BabelPluginOptions; +} + +export function validateMetroOptions(rawOptions: unknown): MetroPluginOptions { + const options = validateOptions(rawOptions, metroOptionKeys); + if (options.target !== undefined) validateTarget(options.target, false); + return options as MetroPluginOptions; +} + +function validateOptions(rawOptions: unknown, keys: string[]): Record { const options = readObject(rawOptions, 'Plugin options'); - validateKeys(options, pluginOptionKeys, 'plugin option', legacyPluginOptions); + validateKeys(options, keys, 'plugin option', legacyPluginOptions); if (options.logLevel !== undefined && !logLevels.some((level) => level === options.logLevel)) { throw new PluginError('`logLevel` must be one of `silent`, `warn`, `info`, or `debug`.'); @@ -45,7 +59,6 @@ export function validatePluginOptions(rawOptions: unknown): PluginOptions { if (options.optimizations !== undefined) { const optimizations = readObject(options.optimizations, '`optimizations`'); validateKeys(optimizations, optimizationKeys, 'optimization', legacyOptimizations); - for (const [name, state] of Object.entries(optimizations)) { if (state !== undefined && !optimizationStates.some((candidate) => candidate === state)) { throw new PluginError(`Optimization \`${name}\` must be \`on\` or \`off\`.`); @@ -56,7 +69,6 @@ export function validatePluginOptions(rawOptions: unknown): PluginOptions { if (options.assumptions !== undefined) { const assumptions = readObject(options.assumptions, '`assumptions`'); validateKeys(assumptions, assumptionKeys, 'assumption'); - if ( assumptions.unknownAncestorsDoNotRenderText !== undefined && typeof assumptions.unknownAncestorsDoNotRenderText !== 'boolean' @@ -68,20 +80,35 @@ export function validatePluginOptions(rawOptions: unknown): PluginOptions { if (options.integrations !== undefined) { const integrations = readObject(options.integrations, '`integrations`'); validateKeys(integrations, integrationKeys, 'integration'); - if (integrations.unistyles !== undefined && !integrationStates.some((state) => state === integrations.unistyles)) { throw new PluginError('`integrations.unistyles` must be `auto`, `on`, or `off`.'); } } - return options as PluginOptions; + return options; +} + +function validateTarget(value: unknown, allowVersion: boolean): void { + const target = readObject(value, '`target`'); + validateKeys(target, ['reactNative'], 'target'); + if (target.reactNative === undefined) return; + + const reactNative = readObject(target.reactNative, '`target.reactNative`'); + validateKeys(reactNative, allowVersion ? ['packageJson', 'version'] : ['packageJson'], '`target.reactNative` option'); + const hasPackageJson = typeof reactNative.packageJson === 'string'; + const hasVersion = typeof reactNative.version === 'string'; + if (hasPackageJson === hasVersion) { + throw new PluginError('`target.reactNative` must contain either `packageJson` or `version`.'); + } + if (hasVersion && !/^\d+\.\d+\.\d+(?:-|$)/.test(reactNative.version as string)) { + throw new PluginError('`target.reactNative.version` must be a full React Native version.'); + } } function readObject(value: unknown, name: string): Record { if (typeof value !== 'object' || value === null || Array.isArray(value)) { throw new PluginError(`${name} must be an object.`); } - return value as Record; } @@ -93,12 +120,8 @@ function validateKeys( ): void { for (const key of Object.keys(value)) { if (allowedKeys.includes(key)) continue; - const replacement = replacements[key]; - if (replacement) { - throw new PluginError(`The \`${key}\` ${label} was removed. ${replacement}`); - } - + if (replacement) throw new PluginError(`The \`${key}\` ${label} was removed. ${replacement}`); throw new PluginError(`Unknown ${label} \`${key}\`.`); } } diff --git a/packages/react-native-boost/src/plugin/utils/plugin-error.ts b/packages/react-native-boost/src/plugin/utils/plugin-error.ts index 0c2695d8..1230de59 100644 --- a/packages/react-native-boost/src/plugin/utils/plugin-error.ts +++ b/packages/react-native-boost/src/plugin/utils/plugin-error.ts @@ -1,6 +1,6 @@ export default class PluginError extends Error { constructor(message: string) { - super(`[react-native-boost] Babel plugin exception: ${message}`); + super(`[react-native-boost] ${message}`); this.name = 'PluginError'; } } diff --git a/packages/react-native-boost/src/plugin/utils/react-native-target.ts b/packages/react-native-boost/src/plugin/utils/react-native-target.ts new file mode 100644 index 00000000..98816688 --- /dev/null +++ b/packages/react-native-boost/src/plugin/utils/react-native-target.ts @@ -0,0 +1,99 @@ +import { createHash } from 'node:crypto'; +import fs from 'node:fs'; +import { createRequire } from 'node:module'; +import path from 'node:path'; +import type { ReactNativeTargetOption } from '../types'; + +export interface ResolvedReactNativeTarget { + version: string; + packageJson?: string; + fingerprint: string; +} + +export interface ReactNativeTargetResolution { + target?: ResolvedReactNativeTarget; + versions: string[]; +} + +export function resolveReactNativeTarget( + configuredTarget: ReactNativeTargetOption | undefined, + locations: Array +): ReactNativeTargetResolution { + if (configuredTarget?.version) { + if (!isReactNativeVersion(configuredTarget.version)) return { versions: [] }; + return { + target: { + version: configuredTarget.version, + fingerprint: hash(configuredTarget.version), + }, + versions: [configuredTarget.version], + }; + } + + if (configuredTarget?.packageJson) { + const target = readReactNativeTarget(resolvePath(configuredTarget.packageJson, locations)); + return { target, versions: target ? [target.version] : [] }; + } + + const packageJsonPaths = new Set(); + const targets: ResolvedReactNativeTarget[] = []; + for (const location of locations) { + const packageJson = resolveReactNativePackageJson(location); + if (!packageJson || packageJsonPaths.has(packageJson)) continue; + packageJsonPaths.add(packageJson); + const target = readReactNativeTarget(packageJson); + if (target) targets.push(target); + } + + if (targets.length === 0) return { versions: [] }; + + const counts = new Map(); + for (const target of targets) counts.set(target.version, (counts.get(target.version) ?? 0) + 1); + let selected = targets[0]!; + for (const target of targets.slice(1)) { + if ((counts.get(target.version) ?? 0) > (counts.get(selected.version) ?? 0)) selected = target; + } + + return { target: selected, versions: [...new Set(targets.map((target) => target.version))] }; +} + +export function getReactNativeMinor(version: string | undefined): number | undefined { + const match = version ? /^(\d+)\.(\d+)\./.exec(version) : null; + if (!match) return undefined; + return Number(match[1]) === 0 ? Number(match[2]) : Number.MAX_SAFE_INTEGER; +} + +function resolvePath(packageJson: string, locations: Array): string { + if (path.isAbsolute(packageJson)) return packageJson; + const origin = locations.find(Boolean); + return path.resolve(origin ? path.dirname(origin) : process.cwd(), packageJson); +} + +function resolveReactNativePackageJson(origin: string | undefined): string | undefined { + if (!origin) return undefined; + + try { + return fs.realpathSync(createRequire(path.resolve(origin)).resolve('react-native/package.json')); + } catch { + return undefined; + } +} + +function readReactNativeTarget(packageJson: string): ResolvedReactNativeTarget | undefined { + try { + const contents = fs.readFileSync(packageJson, 'utf8'); + const { version } = JSON.parse(contents) as { version?: unknown }; + if (typeof version !== 'string' || !isReactNativeVersion(version)) return undefined; + return { version, packageJson: fs.realpathSync(packageJson), fingerprint: hash(contents) }; + } catch { + return undefined; + } +} + +function isReactNativeVersion(version: string): boolean { + return /^\d+\.\d+\.\d+(?:-|$)/.test(version); +} + +function hash(value: string): string { + return createHash('sha256').update(value).digest('hex'); +} From 980b36f11d25c25b67f37f62e5204b2a41fbb93b Mon Sep 17 00:00:00 2001 From: Maximilian Krause Date: Thu, 3 Sep 2026 16:27:23 +0200 Subject: [PATCH 09/56] perf(plugin): resolve version-dependent behavior at build time --- .../react-native-boost/src/plugin/index.ts | 2 +- .../optimizers/image/__tests__/index.test.ts | 107 ++++++++++-------- .../src/plugin/optimizers/image/index.ts | 62 +++++----- .../optimizers/text/__tests__/index.test.ts | 52 +++++++++ .../src/plugin/optimizers/text/index.ts | 46 +++++--- .../src/runtime/__tests__/index.test.ts | 9 ++ .../react-native-boost/src/runtime/index.ts | 47 ++++---- .../src/runtime/index.web.ts | 5 +- 8 files changed, 215 insertions(+), 115 deletions(-) diff --git a/packages/react-native-boost/src/plugin/index.ts b/packages/react-native-boost/src/plugin/index.ts index 2f762e0e..a32fcbaf 100644 --- a/packages/react-native-boost/src/plugin/index.ts +++ b/packages/react-native-boost/src/plugin/index.ts @@ -112,7 +112,7 @@ export default declare((api, rawOptions, dirname?: string) => { const file = (path.hub as unknown as { file: HubFile }).file; const reactNativeMinor = resolveReactNativeMinor(file); if (isOptimizationEnabled(options, 'native-text')) - textOptimizer(path, logger, options, platform, unistylesEnabled); + textOptimizer(path, logger, options, platform, unistylesEnabled, reactNativeMinor); if (isOptimizationEnabled(options, 'native-view')) viewOptimizer(path, logger, options, platform, unistylesEnabled); if (isOptimizationEnabled(options, 'native-image')) diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts index 87d067a9..42f82468 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts +++ b/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts @@ -216,7 +216,13 @@ describe('image android output', () => { expect(getStringPropertyValue(headers as t.ObjectExpression, 'Referrer-Policy')).toBe('origin'); }); - it('routes object-source headers through the RN version gate and lifts array-source headers directly', async () => { + it.each([ + [84, true], + [85, false], + [86, false], + [87, true], + [88, true], + ])('resolves object-source header lifting for RN 0.%i at build time', async (reactNativeMinor, liftsHeaders) => { const output = await transformImage( ` import { Image } from 'react-native'; @@ -228,46 +234,41 @@ describe('image android output', () => { ]} />; `, - 'android' + 'android', + { reactNativeMinor } ); + expect(output).not.toContain('processImageObjectSourceHeaders'); const images = getNativeImageAttributes(output); - expect(images).toHaveLength(2); - const objectSourceImage = images[0]!; - const arraySourceImage = images[1]!; - const arrayHeaders = getAttributeExpression(arraySourceImage, 'headers'); - - // Only some RN versions lift a plain OBJECT source's inline headers onto the top-level prop, so - // the value is resolved by the runtime gate instead of being baked in either way. - const gatedHeaders = unwrapRuntimeGate( - getAttributeExpression(objectSourceImage, 'headers'), - 'processImageObjectSourceHeaders' - ); - expect(t.isObjectExpression(gatedHeaders)).toBe(true); - expect(getStringPropertyValue(gatedHeaders as t.ObjectExpression, 'Authorization')).toBe('Bearer object'); + const objectHeaders = getAttributeExpression(images[0]!, 'headers'); + if (liftsHeaders) { + expect(t.isObjectExpression(objectHeaders)).toBe(true); + expect(getStringPropertyValue(objectHeaders as t.ObjectExpression, 'Authorization')).toBe('Bearer object'); + } else { + expect(objectHeaders).toBeUndefined(); + } - // Every supported version lifts an ARRAY source's `source[0].headers`, so that stays static. + const arrayHeaders = getAttributeExpression(images[1]!, 'headers'); expect(t.isObjectExpression(arrayHeaders)).toBe(true); expect(getStringPropertyValue(arrayHeaders as t.ObjectExpression, 'Authorization')).toBe('Bearer first'); + }); - const [objectSource, arraySource] = getHoistedImageSources(output); - expect(objectSource).toBeDefined(); - expect(arraySource).toBeDefined(); - - const objectSourceEntry = objectSource!.elements[0]; - const arraySourceEntry = arraySource!.elements[0]; - expect(t.isObjectExpression(objectSourceEntry)).toBe(true); - expect(t.isObjectExpression(arraySourceEntry)).toBe(true); + it('keeps the object-source header runtime gate when the RN version is unknown', async () => { + const output = await transformImage( + `import { Image } from 'react-native'; + ;`, + 'android', + { reactNativeMinor: null } + ); + const headers = unwrapRuntimeGate( + getAttributeExpression(getNativeImageAttributes(output)[0]!, 'headers'), + 'processImageObjectSourceHeaders' + ); - const objectSourceHeaders = getObjectExpressionProperty(objectSourceEntry as t.ObjectExpression, 'headers'); - const arraySourceHeaders = getObjectExpressionProperty(arraySourceEntry as t.ObjectExpression, 'headers'); - expect(t.isObjectExpression(objectSourceHeaders)).toBe(true); - expect(t.isObjectExpression(arraySourceHeaders)).toBe(true); - expect(getStringPropertyValue(objectSourceHeaders as t.ObjectExpression, 'Authorization')).toBe('Bearer object'); - expect(getStringPropertyValue(arraySourceHeaders as t.ObjectExpression, 'Authorization')).toBe('Bearer first'); + expect(t.isObjectExpression(headers)).toBe(true); }); - it('emits single-entry array source dimensions through the RN version gate on Android only', async () => { + it('resolves single-entry array source dimensions at build time on Android only', async () => { const source = ` import { Image } from 'react-native'; ; @@ -275,31 +276,42 @@ describe('image android output', () => { ; `; - const getStyleDimensionEntries = (image: t.JSXAttribute[], gated: boolean): t.ObjectExpression => { + const getStyleDimensionEntries = (image: t.JSXAttribute[]): t.ObjectExpression => { const style = getAttributeExpression(image, 'style'); expect(t.isArrayExpression(style)).toBe(true); - const first = (style as t.ArrayExpression).elements[0] as t.Expression; - const dimensions = gated ? unwrapRuntimeGate(first, 'processImageArraySourceDimensions') : first; + const dimensions = (style as t.ArrayExpression).elements[0]; expect(t.isObjectExpression(dimensions)).toBe(true); return dimensions as t.ObjectExpression; }; - const androidImages = getNativeImageAttributes(await transformImage(source, 'android')); - expect(androidImages).toHaveLength(3); - for (const image of androidImages.slice(0, 2)) { - const dimensions = getStyleDimensionEntries(image, true); + const legacyOutput = await transformImage(source, 'android', { reactNativeMinor: 84 }); + expect(legacyOutput).not.toContain('processImageArraySourceDimensions'); + const legacyImages = getNativeImageAttributes(legacyOutput); + for (const image of legacyImages) { + expect(getStyleDimensionEntries(image).properties).toHaveLength(0); + } + + const modernOutput = await transformImage(source, 'android', { reactNativeMinor: 85 }); + expect(modernOutput).not.toContain('processImageArraySourceDimensions'); + const modernImages = getNativeImageAttributes(modernOutput); + for (const image of modernImages.slice(0, 2)) { + const dimensions = getStyleDimensionEntries(image); expect(getObjectExpressionProperty(dimensions, 'width')).toMatchObject({ value: 16 }); expect(getObjectExpressionProperty(dimensions, 'height')).toMatchObject({ value: 8 }); } - // Multi-entry array: no dimension propagation on any version, mirroring the wrapper's - // `source_.length === 1` gate โ€” so there is nothing to resolve at runtime either. - expect(getStyleDimensionEntries(androidImages[2]!, false).properties).toHaveLength(0); + expect(getStyleDimensionEntries(modernImages[2]!).properties).toHaveLength(0); + + const unknownOutput = await transformImage(source, 'android', { reactNativeMinor: null }); + const unknownStyle = getAttributeExpression(getNativeImageAttributes(unknownOutput)[0]!, 'style'); + const unknownDimensions = unwrapRuntimeGate( + (unknownStyle as t.ArrayExpression).elements[0] as t.Expression, + 'processImageArraySourceDimensions' + ); + expect(t.isObjectExpression(unknownDimensions)).toBe(true); - // iOS never propagates array-source dimensions into style, on any version. const iosImages = getNativeImageAttributes(await transformImage(source, 'ios')); - expect(iosImages).toHaveLength(3); for (const image of iosImages) { - expect(getStyleDimensionEntries(image, false).properties).toHaveLength(0); + expect(getStyleDimensionEntries(image).properties).toHaveLength(0); } }); @@ -496,10 +508,11 @@ describe('image srcSet output', () => { expect(getObjectExpressionProperty(entry, 'width')).toMatchObject({ value: 24 }); expect(getObjectExpressionProperty(entry, 'height')).toMatchObject({ value: 12 }); + expect(output).not.toContain('processImageArraySourceDimensions'); const style = getAttributeExpression(image, 'style') as t.ArrayExpression; - const dimensions = unwrapRuntimeGate(style.elements[0] as t.Expression, 'processImageArraySourceDimensions'); - expect(getObjectExpressionProperty(dimensions as t.ObjectExpression, 'width')).toMatchObject({ value: 24 }); - expect(getObjectExpressionProperty(dimensions as t.ObjectExpression, 'height')).toMatchObject({ value: 12 }); + const dimensions = style.elements[0] as t.ObjectExpression; + expect(getObjectExpressionProperty(dimensions, 'width')).toMatchObject({ value: 24 }); + expect(getObjectExpressionProperty(dimensions, 'height')).toMatchObject({ value: 12 }); }); it.each([ diff --git a/packages/react-native-boost/src/plugin/optimizers/image/index.ts b/packages/react-native-boost/src/plugin/optimizers/image/index.ts index be9a5657..680d0fe5 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/index.ts +++ b/packages/react-native-boost/src/plugin/optimizers/image/index.ts @@ -182,7 +182,7 @@ export const imageOptimizer: Optimizer = (path, logger, options, platform, unist logger.optimized({ component: 'Image', path }); if (nativeSource && styleInfo !== null) { - processImageProps(path, file, nativeSource, styleInfo, platform); + processImageProps(path, file, nativeSource, styleInfo, platform, reactNativeMinor); } else { processRuntimeImageProps(path, file, platform); } @@ -197,17 +197,9 @@ type NativeSource = { androidHeaders?: t.Expression; width?: t.Expression; height?: t.Expression; - /** - * `width`/`height` came from an ARRAY source's single entry, which only the wrapper of some RN - * versions propagates into the layout style โ€” so they are emitted through the runtime gate - * `processImageArraySourceDimensions` instead of inline. - */ + /** `width`/`height` came from an ARRAY source whose dimension propagation varies by RN version. */ arraySourceDimensions?: boolean; - /** - * `androidHeaders` came from a plain OBJECT source's inline `headers`, which only the wrapper of - * some RN versions lifts to the top-level prop โ€” so they are emitted through the runtime gate - * `processImageObjectSourceHeaders` instead of inline. - */ + /** `androidHeaders` came from a plain OBJECT source whose header lift varies by RN version. */ objectSourceHeaders?: boolean; }; @@ -234,7 +226,8 @@ function processImageProps( file: HubFile, nativeSource: NativeSource, styleInfo: StyleInfo, - platform?: string + platform?: string, + reactNativeMinor?: number ) { const accessibilityInfo = buildImageAccessibilityInfo(path, file, platform); const consumed = new Set([ @@ -257,29 +250,33 @@ function processImageProps( const tintColor = buildTintColor(explicitTintColor, styleInfo?.tintColor, platform); const emitsAndroidProps = platform === 'android'; - // Both gates are Android-only and are wired up only when there is something to gate, so an Image - // that hits neither case keeps a fully static prop bag. - const gatesArrayDimensions = - emitsAndroidProps && + const hasArrayDimensions = nativeSource.arraySourceDimensions === true && (nativeSource.width !== undefined || nativeSource.height !== undefined); - const arrayDimensionsGate = gatesArrayDimensions + const resolvesArrayDimensionsAtRuntime = emitsAndroidProps && hasArrayDimensions && reactNativeMinor === undefined; + const includesDimensions = + nativeSource.arraySourceDimensions !== true || reactNativeMinor === undefined || reactNativeMinor >= 85; + const arrayDimensionsGate = resolvesArrayDimensionsAtRuntime ? addRuntimeHelper(path, file, 'processImageArraySourceDimensions') : undefined; - const androidHeaders = - emitsAndroidProps && nativeSource.androidHeaders - ? nativeSource.objectSourceHeaders - ? t.callExpression(addRuntimeHelper(path, file, 'processImageObjectSourceHeaders'), [ - t.cloneNode(nativeSource.androidHeaders, true), - ]) - : t.cloneNode(nativeSource.androidHeaders, true) - : undefined; + let androidHeaders: t.Expression | undefined; + if (emitsAndroidProps && nativeSource.androidHeaders) { + if (!nativeSource.objectSourceHeaders) { + androidHeaders = t.cloneNode(nativeSource.androidHeaders, true); + } else if (reactNativeMinor === undefined) { + androidHeaders = t.callExpression(addRuntimeHelper(path, file, 'processImageObjectSourceHeaders'), [ + t.cloneNode(nativeSource.androidHeaders, true), + ]); + } else if (reactNativeMinor <= 84 || reactNativeMinor >= 87) { + androidHeaders = t.cloneNode(nativeSource.androidHeaders, true); + } + } path.node.attributes = [ ...remaining, accessibilityInfo?.spreadAttribute, - makeAttribute('style', buildStyle(nativeSource, styleInfo, arrayDimensionsGate)), + makeAttribute('style', buildStyle(nativeSource, styleInfo, includesDimensions, arrayDimensionsGate)), makeAttribute('source', hoistStaticImageSource(path, file, nativeSource.sourceArray)), androidHeaders ? makeAttribute('headers', androidHeaders) : undefined, makeAttribute('resizeMode', buildResizeMode(explicitResizeMode, styleInfo)), @@ -549,9 +546,7 @@ function buildStaticNativeSource( // Two Android-only wrapper behaviors vary across the supported RN range: propagating a single-entry // ARRAY source's intrinsic dimensions into the layout style, and lifting a plain OBJECT source's - // inline headers to the top-level `headers` prop. iOS does neither on any version. Both are emitted - // through runtime gates (see the `arraySourceDimensions` / `objectSourceHeaders` flags) so the - // build-time output tracks the installed RN exactly instead of picking one version's semantics. + // inline headers to the top-level `headers` prop. The runtime gates remain only as an unknown-target fallback. const emitsAndroidProps = platform === 'android'; const src = findAttribute(attributes, 'src'); @@ -693,11 +688,16 @@ function buildSourceObject(sourceObject: t.ObjectExpression, requestHeaders: Req function buildStyle( nativeSource: NativeSource, styleInfo: StyleInfo, + includesDimensions: boolean, arrayDimensionsGate?: t.Identifier ): t.ArrayExpression { const dimensions = t.objectExpression([ - ...(nativeSource.width ? [t.objectProperty(t.identifier('width'), t.cloneNode(nativeSource.width, true))] : []), - ...(nativeSource.height ? [t.objectProperty(t.identifier('height'), t.cloneNode(nativeSource.height, true))] : []), + ...(includesDimensions && nativeSource.width + ? [t.objectProperty(t.identifier('width'), t.cloneNode(nativeSource.width, true))] + : []), + ...(includesDimensions && nativeSource.height + ? [t.objectProperty(t.identifier('height'), t.cloneNode(nativeSource.height, true))] + : []), ]); return t.arrayExpression([ diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/index.test.ts b/packages/react-native-boost/src/plugin/optimizers/text/__tests__/index.test.ts index cc3f0ba9..01d129ad 100644 --- a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/index.test.ts +++ b/packages/react-native-boost/src/plugin/optimizers/text/__tests__/index.test.ts @@ -1,7 +1,10 @@ import path from 'node:path'; +import { transformSync, type TransformCaller } from '@babel/core'; import { pluginTester } from 'babel-plugin-tester'; +import { describe, expect, it } from 'vitest'; import { generateTestPlugin } from '../../../utils/generate-test-plugin'; import { formatTestResult } from '../../../utils/format-test-result'; +import boostPlugin from '../../../index'; import { textOptimizer } from '..'; pluginTester({ @@ -60,3 +63,52 @@ pluginTester({ }, formatResult: formatTestResult, }); + +const transformText = async (reactNativeMinor: number, platform?: 'ios'): Promise => + formatTestResult( + transformSync( + ` + import { Text } from 'react-native'; + plain; + static; + dynamic; + `, + { + configFile: false, + babelrc: false, + caller: { name: 'test', platform } as TransformCaller, + plugins: [ + '@babel/plugin-syntax-jsx', + [boostPlugin, { logLevel: 'silent', target: { reactNative: { version: `0.${reactNativeMinor}.0` } } }], + ], + } + )!.code! + ); + +describe('text version defaults', () => { + it('omits the default overflow style before RN 0.85', async () => { + const output = await transformText(84, 'ios'); + + expect(output).not.toContain('getDefaultTextStyle'); + expect(output).not.toContain('textDefaultOverflowStyle'); + expect(output).not.toContain("overflow: 'hidden'"); + expect(output).toContain('processTextStyle(dynamicStyle, false)'); + }); + + it('uses the default overflow style from RN 0.85', async () => { + const output = await transformText(85, 'ios'); + + expect(output).not.toContain('getDefaultTextStyle'); + expect(output).toContain('textDefaultOverflowStyle as _textDefaultOverflowStyle'); + expect(output).toContain('style={_textDefaultOverflowStyle}'); + expect(output).toContain('processTextStyle(dynamicStyle, true)'); + }); + + it('keeps the runtime fallback when the platform is unknown', async () => { + const output = await transformText(85); + + expect(output).toContain('getDefaultTextStyle'); + expect(output).not.toContain('textDefaultOverflowStyle'); + expect(output).toContain('processTextStyle(dynamicStyle)'); + }); +}); diff --git a/packages/react-native-boost/src/plugin/optimizers/text/index.ts b/packages/react-native-boost/src/plugin/optimizers/text/index.ts index 810ba152..1768e368 100644 --- a/packages/react-native-boost/src/plugin/optimizers/text/index.ts +++ b/packages/react-native-boost/src/plugin/optimizers/text/index.ts @@ -83,7 +83,7 @@ const TEXT_SPREAD_GUARD_KEYS = new Set([ const isNormalizedProperty = (attribute: t.JSXAttribute | t.JSXSpreadAttribute): attribute is t.JSXAttribute => t.isJSXAttribute(attribute) && t.isJSXIdentifier(attribute.name) && NORMALIZED_PROPERTIES.has(attribute.name.name); -export const textOptimizer: Optimizer = (path, logger, options, platform, unistylesEnabled) => { +export const textOptimizer: Optimizer = (path, logger, options, platform, unistylesEnabled, reactNativeMinor) => { if (!isReactNativeComponent(path, 'Text')) return; const parent = path.parent as t.JSXElement; @@ -163,7 +163,7 @@ export const textOptimizer: Optimizer = (path, logger, options, platform, unisty renameIdToNativeID(path); addDefaultProperty(path, 'allowFontScaling', t.booleanLiteral(true)); addDefaultProperty(path, 'ellipsizeMode', t.stringLiteral('tail')); - processProps(path, file, platform, routeToUnistyles); + processProps(path, file, platform, routeToUnistyles, reactNativeMinor); // A Unistyles-styled Text routes to Unistyles' lean host (a registering wrapper around `RCTText`); its // `style` is passed by identity (see `processProps`) so the Unistyles native-state โ€” and therefore the @@ -277,7 +277,8 @@ function processProps( path: NodePath, file: HubFile, platform?: string, - passStyleByIdentity = false + passStyleByIdentity = false, + reactNativeMinor?: number ) { // Grab the up-to-date list of attributes const currentAttributes = [...path.node.attributes]; @@ -326,10 +327,24 @@ function processProps( let staticStyleAttribute: t.JSXAttribute | undefined; let styleSpread: t.JSXSpreadAttribute | undefined; - // RN prepends `{ overflow: 'hidden' }` from 0.85. The runtime returns this release default or - // `undefined`, so user styles still win. Web and Unistyles skip it; dynamic styles use `processTextStyle`. + // RN prepends `{ overflow: 'hidden' }` from 0.85. Use the build target when both its version and + // native platform are known. The runtime fallback preserves unknown-platform and Babel-only builds. const emitsDefaultStyle = !passStyleByIdentity && platform !== 'web'; - const buildDefaultTextStyleExpression = (): t.Expression => { + const resolvesDefaultStyleAtBuildTime = + emitsDefaultStyle && reactNativeMinor !== undefined && (platform === 'ios' || platform === 'android'); + const buildDefaultTextStyleExpression = (): t.Expression | undefined => { + if (resolvesDefaultStyleAtBuildTime) { + if (reactNativeMinor < 85) return undefined; + const defaultStyleIdentifier = addFileImportHint({ + file, + nameHint: 'textDefaultOverflowStyle', + path, + importName: 'textDefaultOverflowStyle', + moduleName: RUNTIME_MODULE_NAME, + }); + return t.identifier(defaultStyleIdentifier.name); + } + const defaultStyleIdentifier = addFileImportHint({ file, nameHint: 'getDefaultTextStyle', @@ -361,11 +376,10 @@ function processProps( // helper, where the WeakMap reference cache and `StyleSheet.flatten` are the actual win. const staticStyle = tryBuildStaticTextStyle(styleExpr); if (staticStyle) { + const defaultStyle = emitsDefaultStyle ? buildDefaultTextStyleExpression() : undefined; staticStyleAttribute = t.jsxAttribute( t.jsxIdentifier('style'), - t.jsxExpressionContainer( - emitsDefaultStyle ? t.arrayExpression([buildDefaultTextStyleExpression(), staticStyle]) : staticStyle - ) + t.jsxExpressionContainer(defaultStyle ? t.arrayExpression([defaultStyle, staticStyle]) : staticStyle) ); } else { const flattenIdentifier = addFileImportHint({ @@ -375,17 +389,21 @@ function processProps( importName: 'processTextStyle', moduleName: RUNTIME_MODULE_NAME, }); - const flattenedStyleExpr = t.callExpression(t.identifier(flattenIdentifier.name), [styleExpr]); + const helperArguments = [styleExpr]; + if (resolvesDefaultStyleAtBuildTime) { + helperArguments.push(t.booleanLiteral(reactNativeMinor >= 85)); + } + const flattenedStyleExpr = t.callExpression(t.identifier(flattenIdentifier.name), helperArguments); styleSpread = t.jsxSpreadAttribute(flattenedStyleExpr); } } else if (!styleAttribute && emitsDefaultStyle) { // No style at all still gets the wrapper's default. A style attribute without an extractable // expression (e.g. `style=""`) is left verbatim instead โ€” emitting a second `style` would have the // later attribute silently discard one of the two. - staticStyleAttribute = t.jsxAttribute( - t.jsxIdentifier('style'), - t.jsxExpressionContainer(buildDefaultTextStyleExpression()) - ); + const defaultStyle = buildDefaultTextStyleExpression(); + if (defaultStyle) { + staticStyleAttribute = t.jsxAttribute(t.jsxIdentifier('style'), t.jsxExpressionContainer(defaultStyle)); + } } // --- selectionColor --- diff --git a/packages/react-native-boost/src/runtime/__tests__/index.test.ts b/packages/react-native-boost/src/runtime/__tests__/index.test.ts index 2df0b6d4..f2d8e5db 100644 --- a/packages/react-native-boost/src/runtime/__tests__/index.test.ts +++ b/packages/react-native-boost/src/runtime/__tests__/index.test.ts @@ -233,6 +233,15 @@ describe('getDefaultTextStyle follows the installed RN version', () => { expect(runtime.processTextStyle(null)).toEqual({ style: { overflow: 'hidden' } }); }); + it('uses a build-time default when provided', async () => { + const runtime = await loadRuntime(86); + const style = { color: 'red' } as const; + expect(runtime.processTextStyle(style, false)).toEqual({ style }); + expect(runtime.processTextStyle(style, true)).toEqual({ + style: [{ overflow: 'hidden' }, style], + }); + }); + it('uses the current default when the version cannot be read', async () => { const runtime = await loadRuntime(undefined); expect(runtime.getDefaultTextStyle()).toEqual({ overflow: 'hidden' }); diff --git a/packages/react-native-boost/src/runtime/index.ts b/packages/react-native-boost/src/runtime/index.ts index 54558002..98498510 100644 --- a/packages/react-native-boost/src/runtime/index.ts +++ b/packages/react-native-boost/src/runtime/index.ts @@ -10,9 +10,10 @@ import type { ActivityIndicatorProps, ColorValue, ProcessedColorValue } from 're import { GenericStyleProp } from './types'; import { userSelectToSelectableMap, verticalAlignToTextAlignVerticalMap } from './utils/constants'; -const propsCache = new WeakMap(); +const propsWithDefaultTextStyleCache = new WeakMap(); +const propsWithoutDefaultTextStyleCache = new WeakMap(); const imageBaseStyle = { overflow: 'hidden' } as const; -const textDefaultOverflowStyle = { overflow: 'hidden' } as const; +export const textDefaultOverflowStyle = { overflow: 'hidden' } as const; const emptyImageSource = { uri: undefined, width: undefined, height: undefined }; export const activityIndicatorStyles = { container: { alignItems: 'center', justifyContent: 'center' }, @@ -48,8 +49,8 @@ let cachedReactNativeMinor: number | null | undefined; * Callers treat `null` as "the current wrapper behavior". * * @remarks - * `Platform.constants` is a synchronous native-constants read, so it happens lazily on first use and - * is memoized rather than run at module load. + * This fallback is used only when the Babel plugin cannot resolve the build target. The synchronous + * native-constants read happens lazily on first use and is memoized. * * Boost intentionally mirrors release defaults by version. Do not import RN's private feature flags: * their paths are unstable, and apps that override private flags must patch Boost or skip optimization. @@ -73,8 +74,7 @@ let cachedDefaultTextStyle: TextStyle | false | undefined; /** * The default style `Text` prepends to every element's `style` โ€” `{ overflow: 'hidden' }` on RN โ‰ฅ - * 0.85, and `undefined` otherwise. The plugin prepends this as the first `style` array entry of every - * optimized `Text`, so the user's own `overflow` still wins. + * 0.85, and `undefined` otherwise. The plugin uses this fallback when the build target is unknown. */ export function getDefaultTextStyle(): TextStyle | undefined { const minor = getReactNativeMinor(); @@ -110,19 +110,17 @@ function propagatesArraySourceDimensions(): boolean { } /** - * Gates a plain OBJECT source's inline `headers` for the top-level Android `headers` prop. The - * plugin wraps the statically-extracted headers in this call so build-time output tracks the - * installed RN exactly. See {@link liftsObjectSourceHeaders}. + * Gates a plain OBJECT source's inline `headers` for the top-level Android `headers` prop when the + * build target is unknown. See {@link liftsObjectSourceHeaders}. */ export function processImageObjectSourceHeaders(headers: T): T | undefined { return liftsObjectSourceHeaders() ? headers : undefined; } /** - * Gates the layout style entry synthesized from a single-entry ARRAY source's intrinsic dimensions. - * The plugin emits this as the first `style` array entry so build-time output tracks the installed - * RN exactly; an `undefined` entry is ignored by style flattening, exactly like the wrapper's - * `false`. See {@link propagatesArraySourceDimensions}. + * Gates a single-entry ARRAY source's intrinsic dimensions when the build target is unknown. An + * `undefined` entry is ignored by style flattening, exactly like the wrapper's `false`. + * See {@link propagatesArraySourceDimensions}. */ export function processImageArraySourceDimensions(dimensions: T): T | undefined { return propagatesArraySourceDimensions() ? dimensions : undefined; @@ -132,25 +130,32 @@ export function processImageArraySourceDimensions(dimensions: T): T | undefin * Normalizes `Text` style values for `NativeText`. * * @param style - Style prop passed to a text-like component. + * @param includesDefaultStyle - Build-time release default. Omit it to detect the runtime version. * @returns Native-friendly text props. Returns an empty object when `style` is falsy or cannot be normalized. * @remarks * - Flattens style arrays via `StyleSheet.flatten` * - Converts numeric `fontWeight` values to string values * - Maps `userSelect` and `verticalAlign` to native-compatible props - * - Prepends {@link getDefaultTextStyle} so the versioned `overflow: 'hidden'` default applies to - * dynamically-styled (and falsy-styled) `Text` exactly as the wrapper applies it + * - Applies the build-time default-style setting, or uses {@link getDefaultTextStyle} as a fallback */ -export function processTextStyle(style: GenericStyleProp): Partial { - const defaultTextStyle = getDefaultTextStyle(); - +export function processTextStyle( + style: GenericStyleProp, + includesDefaultStyle?: boolean +): Partial { + const defaultTextStyle = + includesDefaultStyle === undefined + ? getDefaultTextStyle() + : includesDefaultStyle + ? textDefaultOverflowStyle + : undefined; if (!style) return defaultTextStyle ? { style: defaultTextStyle } : {}; - // Cache the computed props - let props = propsCache.get(style); + const cache = defaultTextStyle ? propsWithDefaultTextStyleCache : propsWithoutDefaultTextStyleCache; + let props = cache.get(style); if (props) return props; props = {}; - propsCache.set(style, props); + cache.set(style, props); const flattenedStyle = StyleSheet.flatten(style) as TextStyle; diff --git a/packages/react-native-boost/src/runtime/index.web.ts b/packages/react-native-boost/src/runtime/index.web.ts index 4780d71f..a1bc02b9 100644 --- a/packages/react-native-boost/src/runtime/index.web.ts +++ b/packages/react-native-boost/src/runtime/index.web.ts @@ -4,7 +4,10 @@ import { ActivityIndicator as NativeActivityIndicator } from 'react-native'; import type { ActivityIndicatorProps, TextProps, TextStyle } from 'react-native'; import { GenericStyleProp } from './types'; -export const processTextStyle = (style: GenericStyleProp) => ({ style }) as Partial; +export const textDefaultOverflowStyle = { overflow: 'hidden' } as const; + +export const processTextStyle = (style: GenericStyleProp, _includesDefaultStyle?: boolean) => + ({ style }) as Partial; // react-native-web's `Text` accepts `selectionColor` and resolves colors itself, so there is no native // int to pack โ€” pass the value through untouched (mirroring the other web shims). Keeping the From ac5f1303ebc810efd0c81f15f79637281465ece8 Mon Sep 17 00:00:00 2001 From: Maximilian Krause Date: Thu, 3 Sep 2026 17:21:52 +0200 Subject: [PATCH 10/56] refactor: cleanup --- .github/workflows/{test.yml => ci.yml} | 5 +- .gitignore | 3 - .oxfmtrc.json | 8 +- .oxlintrc.json | 19 +- .zed/settings.json | 237 ------------------ README.md | 2 +- .../native-attribute-conformance.test.ts | 28 ++- .../react-native-boost/src/plugin/index.ts | 16 +- .../__tests__/index.test.ts | 7 +- .../index.ts | 2 +- .../fixtures/accessibility-props/code.js | 0 .../fixtures/accessibility-props/output.js | 0 .../accessibility-spread-bails/code.js | 0 .../accessibility-spread-bails/output.js | 0 .../__tests__/fixtures/basic/code.js | 0 .../__tests__/fixtures/basic/output.js | 0 .../dynamic-request-headers-runtime/code.js | 0 .../dynamic-request-headers-runtime/output.js | 0 .../fixtures/dynamic-source-runtime/code.js | 0 .../fixtures/dynamic-source-runtime/output.js | 0 .../__tests__/fixtures/event-bails/code.js | 0 .../__tests__/fixtures/event-bails/output.js | 0 .../fixtures/fallback-semantics/code.js | 0 .../fixtures/fallback-semantics/output.js | 0 .../fixtures/force-dynamic-runtime/code.js | 0 .../fixtures/force-dynamic-runtime/output.js | 0 .../fixtures/force-text-ancestor/code.js | 0 .../fixtures/force-text-ancestor/output.js | 0 .../__tests__/fixtures/native-props/code.js | 0 .../__tests__/fixtures/native-props/output.js | 0 .../fixtures/request-headers/code.js | 0 .../fixtures/request-headers/output.js | 0 .../__tests__/fixtures/require-source/code.js | 0 .../fixtures/require-source/output.js | 0 .../__tests__/fixtures/source-array/code.js | 0 .../__tests__/fixtures/source-array/output.js | 0 .../spread-wrapper-props-bails/code.js | 0 .../spread-wrapper-props-bails/output.js | 0 .../__tests__/fixtures/src-precedence/code.js | 0 .../fixtures/src-precedence/output.js | 0 .../__tests__/fixtures/src-prop/code.js | 0 .../__tests__/fixtures/src-prop/output.js | 0 .../static-style-derived-props/code.js | 0 .../static-style-derived-props/output.js | 0 .../fixtures/text-ancestor-bails/code.js | 0 .../fixtures/text-ancestor-bails/output.js | 0 .../unknown-imported-ancestor/code.js | 0 .../dangerous-output.js | 0 .../unknown-imported-ancestor/output.js | 0 .../__tests__/fixtures/view-props/code.js | 0 .../__tests__/fixtures/view-props/output.js | 0 .../__tests__/index.test.ts | 10 +- .../{image => native-image}/index.ts | 9 +- .../unistyles-cast-style/code.tsx | 0 .../unistyles-cast-style/output.tsx | 0 .../unistyles-aliased-style/code.js | 0 .../unistyles-aliased-style/output.js | 0 .../unistyles-imported-style-bails/code.js | 0 .../unistyles-imported-style-bails/output.js | 0 .../unistyles-literal-style/code.js | 0 .../unistyles-literal-style/output.js | 0 .../unistyles-no-style/code.js | 0 .../unistyles-no-style/output.js | 0 .../unistyles-optional-member-style/code.js | 0 .../unistyles-optional-member-style/output.js | 0 .../unistyles-plain-rn-style/code.js | 0 .../unistyles-plain-rn-style/output.js | 0 .../unistyles-style-array/code.js | 0 .../unistyles-style-array/output.js | 0 .../unistyles-style/code.js | 0 .../unistyles-style/output.js | 0 .../unistyles-unknown-style-bails/code.js | 0 .../unistyles-unknown-style-bails/output.js | 0 .../fixtures/ambiguous-id-bails/code.js | 0 .../fixtures/ambiguous-id-bails/output.js | 0 .../__tests__/fixtures/aria-hidden/code.js | 0 .../__tests__/fixtures/aria-hidden/output.js | 0 .../__tests__/fixtures/basic/code.js | 0 .../__tests__/fixtures/basic/output.js | 0 .../fixtures/call-expression-child/code.js | 0 .../fixtures/call-expression-child/output.js | 0 .../fixtures/circular-const-child/code.js | 0 .../fixtures/circular-const-child/output.js | 0 .../fixtures/complex-example/code.js | 0 .../fixtures/complex-example/output.js | 0 .../fixtures/const-number-child/code.js | 0 .../fixtures/const-number-child/output.js | 0 .../__tests__/fixtures/default-props/code.js | 0 .../fixtures/default-props/output.js | 0 .../fixtures/dynamic-identifier-child/code.js | 0 .../dynamic-identifier-child/output.js | 0 .../dynamic-number-of-lines-clamped/code.js | 0 .../dynamic-number-of-lines-clamped/output.js | 0 .../dynamic-style-keeps-helper/code.js | 0 .../dynamic-style-keeps-helper/output.js | 0 .../dynamic-style-selectable-order/code.js | 0 .../dynamic-style-selectable-order/output.js | 0 .../fixtures/element-in-ternary-child/code.js | 0 .../element-in-ternary-child/output.js | 0 .../expo-router-link-alias-as-child/code.js | 0 .../dangerous-output.js | 0 .../expo-router-link-alias-as-child/output.js | 0 .../code.js | 0 .../dangerous-output.js | 0 .../output.js | 0 .../code.js | 0 .../dangerous-output.js | 0 .../output.js | 0 .../expo-router-link-as-child/code.js | 0 .../dangerous-output.js | 0 .../expo-router-link-as-child/output.js | 0 .../code.js | 0 .../dangerous-output.js | 0 .../output.js | 0 .../__tests__/fixtures/force-comment/code.js | 0 .../fixtures/force-comment/output.js | 0 .../id-in-resolvable-spread-bails/code.js | 0 .../id-in-resolvable-spread-bails/output.js | 0 .../fixtures/id-to-native-id/code.js | 0 .../fixtures/id-to-native-id/output.js | 0 .../fixtures/id-wins-over-native-id/code.js | 0 .../fixtures/id-wins-over-native-id/output.js | 0 .../__tests__/fixtures/ignore-comment/code.js | 0 .../fixtures/ignore-comment/output.js | 0 .../fixtures/logical-primitive-child/code.js | 0 .../logical-primitive-child/output.js | 0 .../fixtures/mixed-children-types/code.js | 0 .../fixtures/mixed-children-types/output.js | 0 .../fixtures/native-id-passthrough/code.js | 0 .../fixtures/native-id-passthrough/output.js | 0 .../code.js | 0 .../output.js | 0 .../nested-text-force-comment/code.js | 0 .../nested-text-force-comment/output.js | 0 .../fixtures/nested-text-same-file/code.js | 0 .../fixtures/nested-text-same-file/output.js | 0 .../fixtures/non-react-native-import/code.js | 0 .../non-react-native-import/output.js | 0 .../code.js | 0 .../output.js | 0 .../normalize-accessibility-props/code.js | 0 .../normalize-accessibility-props/output.js | 0 .../normalized-props-in-spread-bails/code.js | 0 .../output.js | 0 .../fixtures/number-of-lines/code.js | 0 .../fixtures/number-of-lines/output.js | 0 .../__tests__/fixtures/numeric-child/code.js | 0 .../fixtures/numeric-child/output.js | 0 .../fixtures/numeric-concat-child/code.js | 0 .../fixtures/numeric-concat-child/output.js | 0 .../__tests__/fixtures/pressables/code.js | 0 .../__tests__/fixtures/pressables/output.js | 0 .../fixtures/resolvable-spread-props/code.js | 0 .../resolvable-spread-props/output.js | 0 .../fixtures/selection-color-bare/code.js | 0 .../fixtures/selection-color-bare/output.js | 0 .../fixtures/selection-color-dynamic/code.js | 0 .../selection-color-dynamic/output.js | 0 .../selection-color-in-spread/code.js | 0 .../selection-color-in-spread/output.js | 0 .../fixtures/selection-color/code.js | 0 .../fixtures/selection-color/output.js | 0 .../static-style-array-merged/code.js | 0 .../static-style-array-merged/output.js | 0 .../static-style-array-override/code.js | 0 .../static-style-array-override/output.js | 0 .../fixtures/static-style-font-weight/code.js | 0 .../static-style-font-weight/output.js | 0 .../fixtures/static-style-nested/code.js | 0 .../fixtures/static-style-nested/output.js | 0 .../static-style-null-element/code.js | 0 .../static-style-null-element/output.js | 0 .../fixtures/static-style-object/code.js | 0 .../fixtures/static-style-object/output.js | 0 .../code.js | 0 .../output.js | 0 .../fixtures/static-style-user-select/code.js | 0 .../static-style-user-select/output.js | 0 .../code.js | 0 .../output.js | 0 .../static-style-vertical-align/code.js | 0 .../static-style-vertical-align/output.js | 0 .../fixtures/string-concat-child/code.js | 0 .../fixtures/string-concat-child/output.js | 0 .../fixtures/template-literal-child/code.js | 0 .../fixtures/template-literal-child/output.js | 0 .../fixtures/ternary-primitive-child/code.js | 0 .../ternary-primitive-child/output.js | 0 .../code.js | 0 .../output.js | 0 .../__tests__/fixtures/text-content/code.js | 0 .../__tests__/fixtures/text-content/output.js | 0 .../code.js | 0 .../output.js | 0 .../fixtures/text-under-safe-ancestor/code.js | 0 .../text-under-safe-ancestor/output.js | 0 .../text-under-unknown-ancestor/code.js | 0 .../dangerous-output.js | 0 .../text-under-unknown-ancestor/output.js | 0 .../__tests__/fixtures/two-components/code.js | 0 .../fixtures/two-components/output.js | 0 .../unresolvable-spread-props/code.js | 0 .../unresolvable-spread-props/output.js | 0 .../fixtures/variable-child-no-string/code.js | 0 .../variable-child-no-string/output.js | 0 .../__tests__/index.test.ts | 10 +- .../optimizers/{text => native-text}/index.ts | 2 +- .../unistyles-imported-style-bails/code.js | 0 .../unistyles-imported-style-bails/output.js | 0 .../unistyles-no-style/code.js | 0 .../unistyles-no-style/output.js | 0 .../unistyles-plain-rn-style/code.js | 0 .../unistyles-plain-rn-style/output.js | 0 .../code.js | 0 .../output.js | 0 .../unistyles-style/code.js | 0 .../unistyles-style/output.js | 0 .../unistyles-unknown-style-bails/code.js | 0 .../unistyles-unknown-style-bails/output.js | 0 .../fixtures/accessibility-label/code.js | 0 .../fixtures/accessibility-label/output.js | 0 .../fixtures/accessibility-state/code.js | 0 .../fixtures/accessibility-state/output.js | 0 .../__tests__/fixtures/accessible/code.js | 0 .../__tests__/fixtures/accessible/output.js | 0 .../fixtures/ambiguous-id-bails/code.js | 0 .../fixtures/ambiguous-id-bails/output.js | 0 .../__tests__/fixtures/aria-busy/code.js | 0 .../__tests__/fixtures/aria-busy/output.js | 0 .../__tests__/fixtures/aria-hidden/code.js | 0 .../__tests__/fixtures/aria-hidden/output.js | 0 .../aria-in-resolvable-spread-bails/code.js | 0 .../aria-in-resolvable-spread-bails/output.js | 0 .../fixtures/aria-label-collision/code.js | 0 .../fixtures/aria-label-collision/output.js | 0 .../fixtures/aria-label-dynamic/code.js | 0 .../fixtures/aria-label-dynamic/output.js | 0 .../fixtures/aria-labelledby/code.js | 0 .../fixtures/aria-labelledby/output.js | 0 .../__tests__/fixtures/aria-live/code.js | 0 .../__tests__/fixtures/aria-live/output.js | 0 .../fixtures/aria-value-aggregation/code.js | 0 .../fixtures/aria-value-aggregation/output.js | 0 .../__tests__/fixtures/basic/code.js | 0 .../__tests__/fixtures/basic/output.js | 0 .../fixtures/force-aria-translation/code.js | 0 .../fixtures/force-aria-translation/output.js | 0 .../__tests__/fixtures/force-comment/code.js | 0 .../fixtures/force-comment/output.js | 0 .../id-in-resolvable-spread-bails/code.js | 0 .../id-in-resolvable-spread-bails/output.js | 0 .../fixtures/id-to-native-id/code.js | 0 .../fixtures/id-to-native-id/output.js | 0 .../fixtures/id-wins-over-native-id/code.js | 0 .../fixtures/id-wins-over-native-id/output.js | 0 .../id-wins-over-spread-native-id/code.js | 0 .../id-wins-over-spread-native-id/output.js | 0 .../__tests__/fixtures/ignore-comment/code.js | 0 .../fixtures/ignore-comment/output.js | 0 .../fixtures/indirect-text-ancestor/code.js | 0 .../fixtures/indirect-text-ancestor/output.js | 0 .../__tests__/fixtures/native-id/code.js | 0 .../__tests__/fixtures/native-id/output.js | 0 .../code.js | 0 .../output.js | 0 .../fixtures/same-file-safe-ancestor/code.js | 0 .../same-file-safe-ancestor/output.js | 0 .../same-file-unknown-ancestor/code.js | 0 .../same-file-unknown-ancestor/output.js | 0 .../fixtures/style-passthrough/code.js | 0 .../fixtures/style-passthrough/output.js | 0 .../__tests__/fixtures/style/code.js | 0 .../__tests__/fixtures/style/output.js | 0 .../fixtures/tab-index-dynamic/code.js | 0 .../fixtures/tab-index-dynamic/output.js | 0 .../__tests__/fixtures/tab-index/code.js | 0 .../__tests__/fixtures/tab-index/output.js | 0 .../__tests__/fixtures/text-ancestor/code.js | 0 .../fixtures/text-ancestor/output.js | 0 .../unknown-imported-ancestor/code.js | 0 .../dangerous-output.js | 0 .../unknown-imported-ancestor/output.js | 0 .../unresolvable-spread-props/code.js | 0 .../unresolvable-spread-props/output.js | 0 .../__tests__/index.test.ts | 8 +- .../optimizers/{view => native-view}/index.ts | 2 +- .../components/native-activity-indicator.ts | 4 +- .../{native-image.tsx => native-image.ts} | 7 +- .../{native-text.tsx => native-text.ts} | 5 - .../{native-view.tsx => native-view.ts} | 5 - .../react-native-boost/src/runtime/index.ts | 3 +- .../src/runtime/utils/constants.ts | 3 +- packages/react-native-boost/vitest.config.ts | 3 - .../react-native-time-to-render/src/index.tsx | 4 +- ...meToRender.ts => native-time-to-render.ts} | 0 ....ts => time-to-render-native-component.ts} | 0 296 files changed, 69 insertions(+), 333 deletions(-) rename .github/workflows/{test.yml => ci.yml} (97%) delete mode 100644 .zed/settings.json rename packages/react-native-boost/src/plugin/optimizers/{activity-indicator => native-activity-indicator}/__tests__/index.test.ts (96%) rename packages/react-native-boost/src/plugin/optimizers/{activity-indicator => native-activity-indicator}/index.ts (98%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/accessibility-props/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/accessibility-props/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/accessibility-spread-bails/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/accessibility-spread-bails/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/basic/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/basic/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/dynamic-request-headers-runtime/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/dynamic-request-headers-runtime/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/dynamic-source-runtime/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/dynamic-source-runtime/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/event-bails/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/event-bails/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/fallback-semantics/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/fallback-semantics/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/force-dynamic-runtime/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/force-dynamic-runtime/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/force-text-ancestor/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/force-text-ancestor/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/native-props/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/native-props/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/request-headers/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/request-headers/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/require-source/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/require-source/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/source-array/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/source-array/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/spread-wrapper-props-bails/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/spread-wrapper-props-bails/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/src-precedence/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/src-precedence/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/src-prop/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/src-prop/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/static-style-derived-props/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/static-style-derived-props/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/text-ancestor-bails/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/text-ancestor-bails/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/unknown-imported-ancestor/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/unknown-imported-ancestor/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/view-props/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/fixtures/view-props/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/__tests__/index.test.ts (98%) rename packages/react-native-boost/src/plugin/optimizers/{image => native-image}/index.ts (99%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures-unistyles-ts/unistyles-cast-style/code.tsx (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures-unistyles-ts/unistyles-cast-style/output.tsx (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures-unistyles/unistyles-aliased-style/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures-unistyles/unistyles-aliased-style/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures-unistyles/unistyles-imported-style-bails/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures-unistyles/unistyles-imported-style-bails/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures-unistyles/unistyles-literal-style/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures-unistyles/unistyles-literal-style/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures-unistyles/unistyles-no-style/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures-unistyles/unistyles-no-style/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures-unistyles/unistyles-optional-member-style/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures-unistyles/unistyles-optional-member-style/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures-unistyles/unistyles-plain-rn-style/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures-unistyles/unistyles-plain-rn-style/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures-unistyles/unistyles-style-array/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures-unistyles/unistyles-style-array/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures-unistyles/unistyles-style/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures-unistyles/unistyles-style/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures-unistyles/unistyles-unknown-style-bails/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures-unistyles/unistyles-unknown-style-bails/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/ambiguous-id-bails/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/ambiguous-id-bails/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/aria-hidden/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/aria-hidden/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/basic/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/basic/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/call-expression-child/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/call-expression-child/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/circular-const-child/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/circular-const-child/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/complex-example/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/complex-example/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/const-number-child/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/const-number-child/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/default-props/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/default-props/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/dynamic-identifier-child/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/dynamic-identifier-child/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/dynamic-number-of-lines-clamped/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/dynamic-number-of-lines-clamped/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/dynamic-style-keeps-helper/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/dynamic-style-keeps-helper/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/dynamic-style-selectable-order/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/dynamic-style-selectable-order/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/element-in-ternary-child/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/element-in-ternary-child/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/expo-router-link-alias-as-child/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/expo-router-link-alias-as-child/dangerous-output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/expo-router-link-alias-as-child/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/expo-router-link-as-child-false-static/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/expo-router-link-as-child-false-static/dangerous-output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/expo-router-link-as-child-false-static/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/expo-router-link-as-child-nested-view/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/expo-router-link-as-child-nested-view/dangerous-output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/expo-router-link-as-child-nested-view/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/expo-router-link-as-child/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/expo-router-link-as-child/dangerous-output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/expo-router-link-as-child/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/expo-router-link-namespace-as-child/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/expo-router-link-namespace-as-child/dangerous-output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/expo-router-link-namespace-as-child/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/force-comment/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/force-comment/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/id-in-resolvable-spread-bails/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/id-in-resolvable-spread-bails/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/id-to-native-id/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/id-to-native-id/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/id-wins-over-native-id/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/id-wins-over-native-id/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/ignore-comment/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/ignore-comment/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/logical-primitive-child/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/logical-primitive-child/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/mixed-children-types/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/mixed-children-types/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/native-id-passthrough/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/native-id-passthrough/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/nested-in-object-with-ignore-comment/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/nested-in-object-with-ignore-comment/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/nested-text-force-comment/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/nested-text-force-comment/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/nested-text-same-file/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/nested-text-same-file/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/non-react-native-import/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/non-react-native-import/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/normalize-accessibility-props-and-flatten-styles/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/normalize-accessibility-props-and-flatten-styles/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/normalize-accessibility-props/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/normalize-accessibility-props/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/normalized-props-in-spread-bails/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/normalized-props-in-spread-bails/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/number-of-lines/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/number-of-lines/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/numeric-child/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/numeric-child/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/numeric-concat-child/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/numeric-concat-child/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/pressables/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/pressables/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/resolvable-spread-props/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/resolvable-spread-props/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/selection-color-bare/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/selection-color-bare/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/selection-color-dynamic/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/selection-color-dynamic/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/selection-color-in-spread/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/selection-color-in-spread/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/selection-color/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/selection-color/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/static-style-array-merged/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/static-style-array-merged/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/static-style-array-override/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/static-style-array-override/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/static-style-font-weight/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/static-style-font-weight/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/static-style-nested/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/static-style-nested/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/static-style-null-element/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/static-style-null-element/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/static-style-object/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/static-style-object/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/static-style-user-select-overrides-selectable/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/static-style-user-select-overrides-selectable/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/static-style-user-select/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/static-style-user-select/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/static-style-vertical-align-unknown/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/static-style-vertical-align-unknown/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/static-style-vertical-align/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/static-style-vertical-align/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/string-concat-child/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/string-concat-child/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/template-literal-child/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/template-literal-child/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/ternary-primitive-child/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/ternary-primitive-child/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/text-content-as-explicit-child-prop/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/text-content-as-explicit-child-prop/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/text-content/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/text-content/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/text-under-namespace-text-ancestor/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/text-under-namespace-text-ancestor/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/text-under-safe-ancestor/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/text-under-safe-ancestor/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/text-under-unknown-ancestor/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/text-under-unknown-ancestor/dangerous-output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/text-under-unknown-ancestor/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/two-components/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/two-components/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/unresolvable-spread-props/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/unresolvable-spread-props/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/variable-child-no-string/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/variable-child-no-string/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/index.test.ts (92%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/index.ts (99%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures-unistyles/unistyles-imported-style-bails/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures-unistyles/unistyles-imported-style-bails/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures-unistyles/unistyles-no-style/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures-unistyles/unistyles-no-style/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures-unistyles/unistyles-plain-rn-style/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures-unistyles/unistyles-plain-rn-style/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures-unistyles/unistyles-style-in-resolvable-spread-bails/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures-unistyles/unistyles-style-in-resolvable-spread-bails/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures-unistyles/unistyles-style/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures-unistyles/unistyles-style/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures-unistyles/unistyles-unknown-style-bails/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures-unistyles/unistyles-unknown-style-bails/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/accessibility-label/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/accessibility-label/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/accessibility-state/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/accessibility-state/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/accessible/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/accessible/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/ambiguous-id-bails/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/ambiguous-id-bails/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/aria-busy/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/aria-busy/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/aria-hidden/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/aria-hidden/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/aria-in-resolvable-spread-bails/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/aria-in-resolvable-spread-bails/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/aria-label-collision/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/aria-label-collision/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/aria-label-dynamic/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/aria-label-dynamic/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/aria-labelledby/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/aria-labelledby/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/aria-live/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/aria-live/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/aria-value-aggregation/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/aria-value-aggregation/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/basic/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/basic/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/force-aria-translation/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/force-aria-translation/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/force-comment/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/force-comment/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/id-in-resolvable-spread-bails/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/id-in-resolvable-spread-bails/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/id-to-native-id/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/id-to-native-id/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/id-wins-over-native-id/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/id-wins-over-native-id/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/id-wins-over-spread-native-id/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/id-wins-over-spread-native-id/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/ignore-comment/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/ignore-comment/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/indirect-text-ancestor/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/indirect-text-ancestor/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/native-id/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/native-id/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/react-native-namespace-text-ancestor/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/react-native-namespace-text-ancestor/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/same-file-safe-ancestor/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/same-file-safe-ancestor/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/same-file-unknown-ancestor/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/same-file-unknown-ancestor/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/style-passthrough/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/style-passthrough/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/style/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/style/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/tab-index-dynamic/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/tab-index-dynamic/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/tab-index/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/tab-index/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/text-ancestor/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/text-ancestor/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/unknown-imported-ancestor/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/unknown-imported-ancestor/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/unresolvable-spread-props/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/fixtures/unresolvable-spread-props/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/__tests__/index.test.ts (83%) rename packages/react-native-boost/src/plugin/optimizers/{view => native-view}/index.ts (99%) rename packages/react-native-boost/src/runtime/components/{native-image.tsx => native-image.ts} (51%) rename packages/react-native-boost/src/runtime/components/{native-text.tsx => native-text.ts} (67%) rename packages/react-native-boost/src/runtime/components/{native-view.tsx => native-view.ts} (67%) rename packages/react-native-time-to-render/src/{NativeTimeToRender.ts => native-time-to-render.ts} (100%) rename packages/react-native-time-to-render/src/{TimeToRenderNativeComponent.ts => time-to-render-native-component.ts} (100%) diff --git a/.github/workflows/test.yml b/.github/workflows/ci.yml similarity index 97% rename from .github/workflows/test.yml rename to .github/workflows/ci.yml index 852b03c4..bb874582 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: Test & build +name: CI on: push: branches: @@ -9,6 +9,7 @@ on: jobs: lint: + name: Lint runs-on: ubuntu-latest steps: - name: Checkout @@ -30,6 +31,7 @@ jobs: run: pnpm typecheck test: + name: Test runs-on: ubuntu-latest steps: - name: Checkout @@ -42,6 +44,7 @@ jobs: run: pnpm test build: + name: Build runs-on: ubuntu-latest steps: - name: Checkout diff --git a/.gitignore b/.gitignore index c2ddf466..e1c36ccc 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,3 @@ yarn-error.log # pnpm .pnpm-store/ - -# Turborepo -.turbo/ diff --git a/.oxfmtrc.json b/.oxfmtrc.json index d6026497..dd3cca68 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -13,11 +13,5 @@ "arrowParens": "always", "endOfLine": "lf", "sortPackageJson": false, - "ignorePatterns": [ - "CHANGELOG.md", - "apps/docs/**/*.md", - "apps/docs/**/*.mdx", - "apps/docs/.docusaurus/**", - "benchmarks/**" - ] + "ignorePatterns": ["CHANGELOG.md", "apps/docs/**/*.md", "apps/docs/**/*.mdx", "benchmarks/**"] } diff --git a/.oxlintrc.json b/.oxlintrc.json index fe510454..d26cee9c 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -7,14 +7,7 @@ "env": { "node": true }, - "ignorePatterns": [ - "**/fixtures", - "**/*.config.{js,mjs,cjs}", - "**/scripts", - "**/plugins", - "**/__tests__", - "apps/docs/.docusaurus/**" - ], + "ignorePatterns": ["**/fixtures", "**/*.config.{js,mjs,cjs}", "**/scripts", "**/plugins", "**/__tests__"], "rules": { "no-unused-vars": [ "error", @@ -128,13 +121,5 @@ "unicorn/switch-case-braces": "error", "unicorn/text-encoding-identifier-case": "error", "unicorn/throw-new-error": "error" - }, - "overrides": [ - { - "files": ["packages/react-native-time-to-render/src/*.ts"], - "rules": { - "unicorn/filename-case": "off" - } - } - ] + } } diff --git a/.zed/settings.json b/.zed/settings.json deleted file mode 100644 index f9aab007..00000000 --- a/.zed/settings.json +++ /dev/null @@ -1,237 +0,0 @@ -{ - "lsp": { - "oxlint": { - "initialization_options": { - "settings": { - "configPath": null, - "run": "onType", - "disableNestedConfig": false, - "fixKind": "safe_fix", - "typeAware": true, - "unusedDisableDirectives": "deny" - } - } - }, - "oxfmt": { - "initialization_options": { - "settings": { - "fmt.configPath": null, - "run": "onSave" - } - } - } - }, - "languages": { - "CSS": { - "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] - }, - "GraphQL": { - "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] - }, - "Handlebars": { - "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] - }, - "HTML": { - "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] - }, - "JavaScript": { - "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - }, - { - "code_action": "source.fixAll.oxc" - } - ] - }, - "JSON": { - "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] - }, - "JSON5": { - "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] - }, - "JSONC": { - "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] - }, - "Less": { - "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] - }, - "Markdown": { - "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] - }, - "MDX": { - "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] - }, - "SCSS": { - "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] - }, - "TypeScript": { - "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] - }, - "TSX": { - "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] - }, - "Vue.js": { - "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] - }, - "YAML": { - "format_on_save": "on", - "prettier": { - "allowed": false - }, - "formatter": [ - { - "language_server": { - "name": "oxfmt" - } - } - ] - } - } -} diff --git a/README.md b/README.md index 71b5c416..e12f05d0 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ # react-native-boost [![npm version](https://img.shields.io/npm/v/react-native-boost.svg)](https://www.npmjs.com/package/react-native-boost) -[![CI](https://github.com/kuatsu/react-native-boost/actions/workflows/test.yml/badge.svg)](https://github.com/kuatsu/react-native-boost/actions/workflows/test.yml) +[![CI](https://github.com/kuatsu/react-native-boost/actions/workflows/ci.yml/badge.svg)](https://github.com/kuatsu/react-native-boost/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/license-MIT-black.svg)](LICENSE) **The React Native performance compiler.** diff --git a/packages/react-native-boost/src/plugin/__tests__/native-attribute-conformance.test.ts b/packages/react-native-boost/src/plugin/__tests__/native-attribute-conformance.test.ts index dbfb97f5..762312d6 100644 --- a/packages/react-native-boost/src/plugin/__tests__/native-attribute-conformance.test.ts +++ b/packages/react-native-boost/src/plugin/__tests__/native-attribute-conformance.test.ts @@ -1,9 +1,9 @@ import { describe, it, expect } from 'vitest'; import { transformSync, types as t, type PluginObj } from '@babel/core'; import { generateTestPlugin } from '../utils/generate-test-plugin'; -import { imageOptimizer } from '../optimizers/image'; -import { textOptimizer } from '../optimizers/text'; -import { viewOptimizer } from '../optimizers/view'; +import { nativeImageOptimizer } from '../optimizers/native-image'; +import { nativeTextOptimizer } from '../optimizers/native-text'; +import { nativeViewOptimizer } from '../optimizers/native-view'; import { Optimizer, TargetPlatform } from '../types'; import { NATIVE_IMAGE_ATTRIBUTES, NATIVE_TEXT_ATTRIBUTES, NATIVE_VIEW_ATTRIBUTES } from './native-valid-attributes'; @@ -178,17 +178,19 @@ describe('native attribute conformance', () => { }); it('exercises the optimized path (otherwise conformance would pass vacuously)', () => { - expect(optimizeAndInspect(viewSource('testID="element"'), viewOptimizer, 'View')?.optimized).toBe(true); - expect(optimizeAndInspect(textSource('numberOfLines={1}'), textOptimizer, 'Text')?.optimized).toBe(true); - expect(optimizeAndInspect(imageSource(IMAGE_BASE_SOURCE), imageOptimizer, 'Image', 'ios')?.optimized).toBe(true); + expect(optimizeAndInspect(viewSource('testID="element"'), nativeViewOptimizer, 'View')?.optimized).toBe(true); + expect(optimizeAndInspect(textSource('numberOfLines={1}'), nativeTextOptimizer, 'Text')?.optimized).toBe(true); + expect(optimizeAndInspect(imageSource(IMAGE_BASE_SOURCE), nativeImageOptimizer, 'Image', 'ios')?.optimized).toBe( + true + ); }); describe('View', () => { it.each([...VIEW_WRAPPER_ONLY_PROPS, ...VIEW_PASSTHROUGH_PROPS])( 'leaves only native attributes on the host for ', (attributes) => { - const result = optimizeAndInspect(viewSource(attributes), viewOptimizer, 'View'); - if (!result?.optimized) return; // bailed out: nothing reaches the native component + const result = optimizeAndInspect(viewSource(attributes), nativeViewOptimizer, 'View'); + if (!result?.optimized) return; const leaked = result.attributes.filter((attribute) => !NATIVE_VIEW_ATTRIBUTES.has(attribute)); expect(leaked, `optimized leaks non-native attribute(s): ${leaked.join(', ')}`).toEqual( [] @@ -201,8 +203,8 @@ describe('native attribute conformance', () => { it.each([...TEXT_WRAPPER_ONLY_PROPS, ...TEXT_PASSTHROUGH_PROPS])( 'leaves only native attributes on the host for ', (attributes) => { - const result = optimizeAndInspect(textSource(attributes), textOptimizer, 'Text'); - if (!result?.optimized) return; // bailed out: nothing reaches the native component + const result = optimizeAndInspect(textSource(attributes), nativeTextOptimizer, 'Text'); + if (!result?.optimized) return; const leaked = result.attributes.filter((attribute) => !NATIVE_TEXT_ATTRIBUTES.has(attribute)); expect(leaked, `optimized leaks non-native attribute(s): ${leaked.join(', ')}`).toEqual( [] @@ -215,8 +217,8 @@ describe('native attribute conformance', () => { it.each(IMAGE_WRAPPER_ONLY_PROPS)( 'leaves only native attributes on the host for when optimized', (attributes) => { - const result = optimizeAndInspect(imageSource(attributes), imageOptimizer, 'Image', 'ios'); - if (!result?.optimized) return; // bailed out: nothing reaches the native component + const result = optimizeAndInspect(imageSource(attributes), nativeImageOptimizer, 'Image', 'ios'); + if (!result?.optimized) return; const leaked = result.attributes.filter((attribute) => !NATIVE_IMAGE_ATTRIBUTES.has(attribute)); expect(leaked, `optimized leaks non-native attribute(s): ${leaked.join(', ')}`).toEqual( [] @@ -227,7 +229,7 @@ describe('native attribute conformance', () => { it.each(IMAGE_PASSTHROUGH_PROPS)( 'optimizes and leaves only native attributes on the host for ', (attributes) => { - const result = optimizeAndInspect(imageSource(attributes), imageOptimizer, 'Image', 'ios'); + const result = optimizeAndInspect(imageSource(attributes), nativeImageOptimizer, 'Image', 'ios'); expect(result?.optimized).toBe(true); const leaked = result?.attributes.filter((attribute) => !NATIVE_IMAGE_ATTRIBUTES.has(attribute)); expect( diff --git a/packages/react-native-boost/src/plugin/index.ts b/packages/react-native-boost/src/plugin/index.ts index a32fcbaf..f074d6bc 100644 --- a/packages/react-native-boost/src/plugin/index.ts +++ b/packages/react-native-boost/src/plugin/index.ts @@ -1,13 +1,13 @@ import path from 'node:path'; import { declare } from '@babel/helper-plugin-utils'; -import { textOptimizer } from './optimizers/text'; -import { imageOptimizer } from './optimizers/image'; +import { nativeTextOptimizer } from './optimizers/native-text'; +import { nativeImageOptimizer } from './optimizers/native-image'; import type { BabelPluginOptions, HubFile, TargetPlatform } from './types'; import { createLogger } from './utils/logger'; -import { viewOptimizer } from './optimizers/view'; +import { nativeViewOptimizer } from './optimizers/native-view'; import { isIgnoredFile } from './utils/common'; import { isUnistylesInstalled } from './utils/unistyles'; -import { activityIndicatorOptimizer } from './optimizers/activity-indicator'; +import { nativeActivityIndicatorOptimizer } from './optimizers/native-activity-indicator'; import { validateBabelOptions } from './utils/options'; import PluginError from './utils/plugin-error'; import { @@ -112,13 +112,13 @@ export default declare((api, rawOptions, dirname?: string) => { const file = (path.hub as unknown as { file: HubFile }).file; const reactNativeMinor = resolveReactNativeMinor(file); if (isOptimizationEnabled(options, 'native-text')) - textOptimizer(path, logger, options, platform, unistylesEnabled, reactNativeMinor); + nativeTextOptimizer(path, logger, options, platform, unistylesEnabled, reactNativeMinor); if (isOptimizationEnabled(options, 'native-view')) - viewOptimizer(path, logger, options, platform, unistylesEnabled); + nativeViewOptimizer(path, logger, options, platform, unistylesEnabled); if (isOptimizationEnabled(options, 'native-image')) - imageOptimizer(path, logger, options, platform, unistylesEnabled, reactNativeMinor); + nativeImageOptimizer(path, logger, options, platform, unistylesEnabled, reactNativeMinor); if (isOptimizationEnabled(options, 'native-activity-indicator')) - activityIndicatorOptimizer(path, logger, options, platform, unistylesEnabled); + nativeActivityIndicatorOptimizer(path, logger, options, platform, unistylesEnabled); }, }, }; diff --git a/packages/react-native-boost/src/plugin/optimizers/activity-indicator/__tests__/index.test.ts b/packages/react-native-boost/src/plugin/optimizers/native-activity-indicator/__tests__/index.test.ts similarity index 96% rename from packages/react-native-boost/src/plugin/optimizers/activity-indicator/__tests__/index.test.ts rename to packages/react-native-boost/src/plugin/optimizers/native-activity-indicator/__tests__/index.test.ts index e97d6550..b3d59c49 100644 --- a/packages/react-native-boost/src/plugin/optimizers/activity-indicator/__tests__/index.test.ts +++ b/packages/react-native-boost/src/plugin/optimizers/native-activity-indicator/__tests__/index.test.ts @@ -1,6 +1,6 @@ import { transformSync } from '@babel/core'; import { describe, expect, it } from 'vitest'; -import { activityIndicatorOptimizer } from '..'; +import { nativeActivityIndicatorOptimizer } from '..'; import type { BoostOptions, TargetPlatform } from '../../../types'; import { generateTestPlugin } from '../../../utils/generate-test-plugin'; @@ -16,7 +16,10 @@ const transformActivityIndicator = ( return transformSync(source, { configFile: false, babelrc: false, - plugins: ['@babel/plugin-syntax-jsx', generateTestPlugin(activityIndicatorOptimizer, pluginOptions, platform)], + plugins: [ + '@babel/plugin-syntax-jsx', + generateTestPlugin(nativeActivityIndicatorOptimizer, pluginOptions, platform), + ], })!.code!; }; diff --git a/packages/react-native-boost/src/plugin/optimizers/activity-indicator/index.ts b/packages/react-native-boost/src/plugin/optimizers/native-activity-indicator/index.ts similarity index 98% rename from packages/react-native-boost/src/plugin/optimizers/activity-indicator/index.ts rename to packages/react-native-boost/src/plugin/optimizers/native-activity-indicator/index.ts index 937ee6ef..e4b3a309 100644 --- a/packages/react-native-boost/src/plugin/optimizers/activity-indicator/index.ts +++ b/packages/react-native-boost/src/plugin/optimizers/native-activity-indicator/index.ts @@ -26,7 +26,7 @@ const CONSUMED_PROPS = new Set([ 'style', ]); -export const activityIndicatorOptimizer: Optimizer = (path, logger, options, platform, unistylesEnabled) => { +export const nativeActivityIndicatorOptimizer: Optimizer = (path, logger, options, platform, unistylesEnabled) => { if (platform === 'web') return; if (!isReactNativeComponent(path, 'ActivityIndicator')) return; diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/accessibility-props/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/accessibility-props/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/accessibility-props/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/accessibility-props/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/accessibility-props/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/accessibility-props/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/accessibility-props/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/accessibility-props/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/accessibility-spread-bails/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/accessibility-spread-bails/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/accessibility-spread-bails/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/accessibility-spread-bails/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/accessibility-spread-bails/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/accessibility-spread-bails/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/accessibility-spread-bails/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/accessibility-spread-bails/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/basic/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/basic/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/basic/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/basic/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/basic/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/basic/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/basic/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/basic/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/dynamic-request-headers-runtime/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/dynamic-request-headers-runtime/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/dynamic-request-headers-runtime/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/dynamic-request-headers-runtime/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/dynamic-request-headers-runtime/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/dynamic-request-headers-runtime/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/dynamic-request-headers-runtime/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/dynamic-request-headers-runtime/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/dynamic-source-runtime/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/dynamic-source-runtime/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/dynamic-source-runtime/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/dynamic-source-runtime/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/dynamic-source-runtime/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/dynamic-source-runtime/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/dynamic-source-runtime/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/dynamic-source-runtime/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/event-bails/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/event-bails/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/event-bails/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/event-bails/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/event-bails/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/event-bails/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/event-bails/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/event-bails/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/fallback-semantics/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/fallback-semantics/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/fallback-semantics/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/fallback-semantics/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/fallback-semantics/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/fallback-semantics/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/fallback-semantics/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/fallback-semantics/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/force-dynamic-runtime/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/force-dynamic-runtime/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/force-dynamic-runtime/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/force-dynamic-runtime/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/force-dynamic-runtime/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/force-dynamic-runtime/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/force-dynamic-runtime/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/force-dynamic-runtime/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/force-text-ancestor/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/force-text-ancestor/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/force-text-ancestor/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/force-text-ancestor/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/force-text-ancestor/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/force-text-ancestor/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/force-text-ancestor/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/force-text-ancestor/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/native-props/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/native-props/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/native-props/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/native-props/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/native-props/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/native-props/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/native-props/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/native-props/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/request-headers/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/request-headers/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/request-headers/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/request-headers/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/request-headers/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/request-headers/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/request-headers/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/request-headers/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/require-source/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/require-source/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/require-source/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/require-source/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/require-source/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/require-source/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/require-source/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/require-source/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/source-array/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/source-array/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/source-array/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/source-array/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/source-array/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/source-array/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/source-array/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/source-array/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/spread-wrapper-props-bails/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/spread-wrapper-props-bails/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/spread-wrapper-props-bails/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/spread-wrapper-props-bails/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/spread-wrapper-props-bails/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/spread-wrapper-props-bails/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/spread-wrapper-props-bails/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/spread-wrapper-props-bails/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/src-precedence/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/src-precedence/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/src-precedence/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/src-precedence/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/src-precedence/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/src-precedence/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/src-precedence/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/src-precedence/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/src-prop/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/src-prop/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/src-prop/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/src-prop/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/src-prop/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/src-prop/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/src-prop/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/src-prop/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/static-style-derived-props/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/static-style-derived-props/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/static-style-derived-props/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/static-style-derived-props/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/static-style-derived-props/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/static-style-derived-props/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/static-style-derived-props/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/static-style-derived-props/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/text-ancestor-bails/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/text-ancestor-bails/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/text-ancestor-bails/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/text-ancestor-bails/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/text-ancestor-bails/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/text-ancestor-bails/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/text-ancestor-bails/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/text-ancestor-bails/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/unknown-imported-ancestor/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/unknown-imported-ancestor/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/unknown-imported-ancestor/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/unknown-imported-ancestor/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/unknown-imported-ancestor/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/unknown-imported-ancestor/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/unknown-imported-ancestor/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/unknown-imported-ancestor/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/view-props/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/view-props/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/view-props/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/view-props/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/view-props/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/view-props/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/fixtures/view-props/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/view-props/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/index.test.ts similarity index 98% rename from packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts rename to packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/index.test.ts index 42f82468..b8987816 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/__tests__/index.test.ts +++ b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/index.test.ts @@ -8,7 +8,7 @@ import { formatTestResult } from '../../../utils/format-test-result'; import { createLogger } from '../../../utils/logger'; import type { TargetPlatform } from '../../../types'; import boostPlugin from '../../../index'; -import { imageOptimizer } from '..'; +import { nativeImageOptimizer } from '..'; const transformImage = async ( source: string, @@ -28,7 +28,7 @@ const transformImage = async ( name: `${platform}-image-optimizer-test`, visitor: { JSXOpeningElement(path) { - imageOptimizer( + nativeImageOptimizer( path, logger, { assumptions: { unknownAncestorsDoNotRenderText } }, @@ -146,7 +146,7 @@ const unwrapRuntimeGate = (expression: t.Expression | undefined, helperName: str }; pluginTester({ - plugin: generateTestPlugin(imageOptimizer, {}, 'ios'), + plugin: generateTestPlugin(nativeImageOptimizer, {}, 'ios'), title: 'image', fixtures: path.resolve(import.meta.dirname, 'fixtures'), babelOptions: { @@ -156,7 +156,7 @@ pluginTester({ }); pluginTester({ - plugin: generateTestPlugin(imageOptimizer, { assumptions: { unknownAncestorsDoNotRenderText: true } }, 'ios'), + plugin: generateTestPlugin(nativeImageOptimizer, { assumptions: { unknownAncestorsDoNotRenderText: true } }, 'ios'), title: 'image unknown ancestor assumption', babelOptions: { plugins: ['@babel/plugin-syntax-jsx'], @@ -646,7 +646,7 @@ describe('image unknown platform output', () => { name: 'unknown-platform-image-optimizer-test', visitor: { JSXOpeningElement(path) { - imageOptimizer(path, logger, {}, undefined); + nativeImageOptimizer(path, logger, {}, undefined); }, }, }); diff --git a/packages/react-native-boost/src/plugin/optimizers/image/index.ts b/packages/react-native-boost/src/plugin/optimizers/native-image/index.ts similarity index 99% rename from packages/react-native-boost/src/plugin/optimizers/image/index.ts rename to packages/react-native-boost/src/plugin/optimizers/native-image/index.ts index 680d0fe5..266ec716 100644 --- a/packages/react-native-boost/src/plugin/optimizers/image/index.ts +++ b/packages/react-native-boost/src/plugin/optimizers/native-image/index.ts @@ -82,7 +82,14 @@ const OBJECT_FIT_TO_RESIZE_MODE: Record = { 'scale-down': 'contain', }; -export const imageOptimizer: Optimizer = (path, logger, options, platform, unistylesEnabled, reactNativeMinor) => { +export const nativeImageOptimizer: Optimizer = ( + path, + logger, + options, + platform, + unistylesEnabled, + reactNativeMinor +) => { if (platform === 'web') return; if (!isReactNativeComponent(path, 'Image')) return; diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles-ts/unistyles-cast-style/code.tsx b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles-ts/unistyles-cast-style/code.tsx similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles-ts/unistyles-cast-style/code.tsx rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles-ts/unistyles-cast-style/code.tsx diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles-ts/unistyles-cast-style/output.tsx b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles-ts/unistyles-cast-style/output.tsx similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles-ts/unistyles-cast-style/output.tsx rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles-ts/unistyles-cast-style/output.tsx diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-aliased-style/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-aliased-style/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-aliased-style/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-aliased-style/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-aliased-style/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-aliased-style/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-aliased-style/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-aliased-style/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-imported-style-bails/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-imported-style-bails/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-imported-style-bails/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-imported-style-bails/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-imported-style-bails/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-imported-style-bails/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-imported-style-bails/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-imported-style-bails/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-literal-style/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-literal-style/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-literal-style/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-literal-style/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-literal-style/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-literal-style/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-literal-style/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-literal-style/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-no-style/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-no-style/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-no-style/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-no-style/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-no-style/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-no-style/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-no-style/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-no-style/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-optional-member-style/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-optional-member-style/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-optional-member-style/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-optional-member-style/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-optional-member-style/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-optional-member-style/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-optional-member-style/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-optional-member-style/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-plain-rn-style/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-plain-rn-style/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-plain-rn-style/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-plain-rn-style/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-plain-rn-style/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-plain-rn-style/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-plain-rn-style/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-plain-rn-style/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-style-array/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-style-array/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-style-array/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-style-array/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-style-array/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-style-array/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-style-array/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-style-array/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-style/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-style/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-style/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-style/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-style/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-style/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-style/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-style/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-unknown-style-bails/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-unknown-style-bails/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-unknown-style-bails/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-unknown-style-bails/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-unknown-style-bails/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-unknown-style-bails/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures-unistyles/unistyles-unknown-style-bails/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures-unistyles/unistyles-unknown-style-bails/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/ambiguous-id-bails/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/ambiguous-id-bails/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/ambiguous-id-bails/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/ambiguous-id-bails/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/ambiguous-id-bails/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/ambiguous-id-bails/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/ambiguous-id-bails/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/ambiguous-id-bails/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/aria-hidden/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/aria-hidden/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/aria-hidden/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/aria-hidden/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/aria-hidden/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/aria-hidden/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/aria-hidden/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/aria-hidden/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/basic/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/basic/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/basic/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/basic/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/basic/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/basic/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/basic/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/basic/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/call-expression-child/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/call-expression-child/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/call-expression-child/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/call-expression-child/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/call-expression-child/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/call-expression-child/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/call-expression-child/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/call-expression-child/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/circular-const-child/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/circular-const-child/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/circular-const-child/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/circular-const-child/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/circular-const-child/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/circular-const-child/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/circular-const-child/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/circular-const-child/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/complex-example/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/complex-example/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/complex-example/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/complex-example/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/complex-example/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/complex-example/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/complex-example/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/complex-example/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/const-number-child/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/const-number-child/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/const-number-child/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/const-number-child/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/const-number-child/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/const-number-child/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/const-number-child/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/const-number-child/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/default-props/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/default-props/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/default-props/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/default-props/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/default-props/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/default-props/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/default-props/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/default-props/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/dynamic-identifier-child/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/dynamic-identifier-child/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/dynamic-identifier-child/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/dynamic-identifier-child/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/dynamic-identifier-child/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/dynamic-identifier-child/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/dynamic-identifier-child/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/dynamic-identifier-child/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/dynamic-number-of-lines-clamped/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/dynamic-number-of-lines-clamped/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/dynamic-number-of-lines-clamped/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/dynamic-number-of-lines-clamped/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/dynamic-number-of-lines-clamped/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/dynamic-number-of-lines-clamped/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/dynamic-number-of-lines-clamped/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/dynamic-number-of-lines-clamped/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/dynamic-style-keeps-helper/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/dynamic-style-keeps-helper/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/dynamic-style-keeps-helper/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/dynamic-style-keeps-helper/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/dynamic-style-keeps-helper/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/dynamic-style-keeps-helper/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/dynamic-style-keeps-helper/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/dynamic-style-keeps-helper/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/dynamic-style-selectable-order/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/dynamic-style-selectable-order/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/dynamic-style-selectable-order/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/dynamic-style-selectable-order/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/dynamic-style-selectable-order/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/dynamic-style-selectable-order/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/dynamic-style-selectable-order/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/dynamic-style-selectable-order/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/element-in-ternary-child/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/element-in-ternary-child/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/element-in-ternary-child/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/element-in-ternary-child/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/element-in-ternary-child/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/element-in-ternary-child/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/element-in-ternary-child/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/element-in-ternary-child/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-alias-as-child/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-alias-as-child/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-alias-as-child/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-alias-as-child/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-alias-as-child/dangerous-output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-alias-as-child/dangerous-output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-alias-as-child/dangerous-output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-alias-as-child/dangerous-output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-alias-as-child/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-alias-as-child/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-alias-as-child/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-alias-as-child/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-as-child-false-static/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child-false-static/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-as-child-false-static/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child-false-static/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-as-child-false-static/dangerous-output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child-false-static/dangerous-output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-as-child-false-static/dangerous-output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child-false-static/dangerous-output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-as-child-false-static/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child-false-static/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-as-child-false-static/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child-false-static/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-as-child-nested-view/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child-nested-view/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-as-child-nested-view/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child-nested-view/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-as-child-nested-view/dangerous-output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child-nested-view/dangerous-output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-as-child-nested-view/dangerous-output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child-nested-view/dangerous-output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-as-child-nested-view/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child-nested-view/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-as-child-nested-view/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child-nested-view/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-as-child/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-as-child/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-as-child/dangerous-output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child/dangerous-output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-as-child/dangerous-output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child/dangerous-output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-as-child/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-as-child/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-namespace-as-child/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-namespace-as-child/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-namespace-as-child/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-namespace-as-child/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-namespace-as-child/dangerous-output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-namespace-as-child/dangerous-output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-namespace-as-child/dangerous-output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-namespace-as-child/dangerous-output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-namespace-as-child/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-namespace-as-child/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/expo-router-link-namespace-as-child/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-namespace-as-child/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/force-comment/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/force-comment/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/force-comment/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/force-comment/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/force-comment/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/force-comment/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/force-comment/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/force-comment/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/id-in-resolvable-spread-bails/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/id-in-resolvable-spread-bails/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/id-in-resolvable-spread-bails/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/id-in-resolvable-spread-bails/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/id-in-resolvable-spread-bails/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/id-in-resolvable-spread-bails/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/id-in-resolvable-spread-bails/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/id-in-resolvable-spread-bails/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/id-to-native-id/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/id-to-native-id/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/id-to-native-id/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/id-to-native-id/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/id-to-native-id/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/id-to-native-id/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/id-to-native-id/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/id-to-native-id/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/id-wins-over-native-id/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/id-wins-over-native-id/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/id-wins-over-native-id/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/id-wins-over-native-id/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/id-wins-over-native-id/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/id-wins-over-native-id/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/id-wins-over-native-id/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/id-wins-over-native-id/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/ignore-comment/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/ignore-comment/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/ignore-comment/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/ignore-comment/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/ignore-comment/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/ignore-comment/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/ignore-comment/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/ignore-comment/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/logical-primitive-child/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/logical-primitive-child/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/logical-primitive-child/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/logical-primitive-child/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/logical-primitive-child/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/logical-primitive-child/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/logical-primitive-child/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/logical-primitive-child/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/mixed-children-types/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/mixed-children-types/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/mixed-children-types/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/mixed-children-types/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/mixed-children-types/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/mixed-children-types/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/mixed-children-types/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/mixed-children-types/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/native-id-passthrough/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/native-id-passthrough/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/native-id-passthrough/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/native-id-passthrough/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/native-id-passthrough/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/native-id-passthrough/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/native-id-passthrough/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/native-id-passthrough/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/nested-in-object-with-ignore-comment/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/nested-in-object-with-ignore-comment/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/nested-in-object-with-ignore-comment/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/nested-in-object-with-ignore-comment/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/nested-in-object-with-ignore-comment/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/nested-in-object-with-ignore-comment/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/nested-in-object-with-ignore-comment/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/nested-in-object-with-ignore-comment/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/nested-text-force-comment/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/nested-text-force-comment/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/nested-text-force-comment/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/nested-text-force-comment/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/nested-text-force-comment/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/nested-text-force-comment/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/nested-text-force-comment/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/nested-text-force-comment/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/nested-text-same-file/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/nested-text-same-file/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/nested-text-same-file/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/nested-text-same-file/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/nested-text-same-file/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/nested-text-same-file/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/nested-text-same-file/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/nested-text-same-file/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/non-react-native-import/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/non-react-native-import/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/non-react-native-import/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/non-react-native-import/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/non-react-native-import/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/non-react-native-import/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/non-react-native-import/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/non-react-native-import/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/normalize-accessibility-props-and-flatten-styles/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/normalize-accessibility-props-and-flatten-styles/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/normalize-accessibility-props-and-flatten-styles/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/normalize-accessibility-props-and-flatten-styles/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/normalize-accessibility-props-and-flatten-styles/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/normalize-accessibility-props-and-flatten-styles/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/normalize-accessibility-props-and-flatten-styles/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/normalize-accessibility-props-and-flatten-styles/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/normalize-accessibility-props/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/normalize-accessibility-props/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/normalize-accessibility-props/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/normalize-accessibility-props/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/normalize-accessibility-props/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/normalize-accessibility-props/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/normalize-accessibility-props/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/normalize-accessibility-props/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/normalized-props-in-spread-bails/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/normalized-props-in-spread-bails/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/normalized-props-in-spread-bails/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/normalized-props-in-spread-bails/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/normalized-props-in-spread-bails/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/normalized-props-in-spread-bails/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/normalized-props-in-spread-bails/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/normalized-props-in-spread-bails/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/number-of-lines/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/number-of-lines/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/number-of-lines/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/number-of-lines/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/number-of-lines/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/number-of-lines/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/number-of-lines/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/number-of-lines/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/numeric-child/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/numeric-child/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/numeric-child/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/numeric-child/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/numeric-child/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/numeric-child/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/numeric-child/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/numeric-child/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/numeric-concat-child/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/numeric-concat-child/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/numeric-concat-child/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/numeric-concat-child/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/numeric-concat-child/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/numeric-concat-child/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/numeric-concat-child/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/numeric-concat-child/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/pressables/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/pressables/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/pressables/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/pressables/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/pressables/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/pressables/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/pressables/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/pressables/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/resolvable-spread-props/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/resolvable-spread-props/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/resolvable-spread-props/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/resolvable-spread-props/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/resolvable-spread-props/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/resolvable-spread-props/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/resolvable-spread-props/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/resolvable-spread-props/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/selection-color-bare/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/selection-color-bare/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/selection-color-bare/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/selection-color-bare/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/selection-color-bare/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/selection-color-bare/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/selection-color-bare/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/selection-color-bare/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/selection-color-dynamic/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/selection-color-dynamic/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/selection-color-dynamic/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/selection-color-dynamic/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/selection-color-dynamic/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/selection-color-dynamic/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/selection-color-dynamic/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/selection-color-dynamic/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/selection-color-in-spread/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/selection-color-in-spread/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/selection-color-in-spread/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/selection-color-in-spread/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/selection-color-in-spread/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/selection-color-in-spread/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/selection-color-in-spread/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/selection-color-in-spread/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/selection-color/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/selection-color/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/selection-color/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/selection-color/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/selection-color/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/selection-color/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/selection-color/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/selection-color/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-array-merged/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-array-merged/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-array-merged/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-array-merged/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-array-merged/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-array-merged/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-array-merged/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-array-merged/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-array-override/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-array-override/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-array-override/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-array-override/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-array-override/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-array-override/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-array-override/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-array-override/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-font-weight/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-font-weight/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-font-weight/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-font-weight/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-font-weight/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-font-weight/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-font-weight/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-font-weight/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-nested/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-nested/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-nested/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-nested/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-nested/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-nested/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-nested/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-nested/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-null-element/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-null-element/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-null-element/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-null-element/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-null-element/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-null-element/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-null-element/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-null-element/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-object/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-object/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-object/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-object/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-object/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-object/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-object/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-object/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-user-select-overrides-selectable/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-user-select-overrides-selectable/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-user-select-overrides-selectable/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-user-select-overrides-selectable/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-user-select-overrides-selectable/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-user-select-overrides-selectable/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-user-select-overrides-selectable/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-user-select-overrides-selectable/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-user-select/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-user-select/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-user-select/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-user-select/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-user-select/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-user-select/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-user-select/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-user-select/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-vertical-align-unknown/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-vertical-align-unknown/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-vertical-align-unknown/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-vertical-align-unknown/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-vertical-align-unknown/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-vertical-align-unknown/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-vertical-align-unknown/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-vertical-align-unknown/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-vertical-align/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-vertical-align/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-vertical-align/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-vertical-align/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-vertical-align/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-vertical-align/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/static-style-vertical-align/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/static-style-vertical-align/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/string-concat-child/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/string-concat-child/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/string-concat-child/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/string-concat-child/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/string-concat-child/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/string-concat-child/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/string-concat-child/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/string-concat-child/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/template-literal-child/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/template-literal-child/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/template-literal-child/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/template-literal-child/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/template-literal-child/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/template-literal-child/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/template-literal-child/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/template-literal-child/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/ternary-primitive-child/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/ternary-primitive-child/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/ternary-primitive-child/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/ternary-primitive-child/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/ternary-primitive-child/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/ternary-primitive-child/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/ternary-primitive-child/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/ternary-primitive-child/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-content-as-explicit-child-prop/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-content-as-explicit-child-prop/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-content-as-explicit-child-prop/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-content-as-explicit-child-prop/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-content-as-explicit-child-prop/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-content-as-explicit-child-prop/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-content-as-explicit-child-prop/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-content-as-explicit-child-prop/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-content/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-content/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-content/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-content/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-content/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-content/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-content/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-content/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-under-namespace-text-ancestor/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-under-namespace-text-ancestor/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-under-namespace-text-ancestor/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-under-namespace-text-ancestor/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-under-namespace-text-ancestor/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-under-namespace-text-ancestor/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-under-namespace-text-ancestor/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-under-namespace-text-ancestor/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-under-safe-ancestor/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-under-safe-ancestor/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-under-safe-ancestor/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-under-safe-ancestor/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-under-safe-ancestor/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-under-safe-ancestor/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-under-safe-ancestor/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-under-safe-ancestor/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-under-unknown-ancestor/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-under-unknown-ancestor/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-under-unknown-ancestor/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-under-unknown-ancestor/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-under-unknown-ancestor/dangerous-output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-under-unknown-ancestor/dangerous-output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-under-unknown-ancestor/dangerous-output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-under-unknown-ancestor/dangerous-output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-under-unknown-ancestor/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-under-unknown-ancestor/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-under-unknown-ancestor/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-under-unknown-ancestor/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/two-components/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/two-components/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/two-components/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/two-components/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/two-components/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/two-components/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/two-components/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/two-components/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/unresolvable-spread-props/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/unresolvable-spread-props/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/unresolvable-spread-props/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/unresolvable-spread-props/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/unresolvable-spread-props/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/unresolvable-spread-props/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/unresolvable-spread-props/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/unresolvable-spread-props/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/variable-child-no-string/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/variable-child-no-string/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/variable-child-no-string/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/variable-child-no-string/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/variable-child-no-string/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/variable-child-no-string/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/variable-child-no-string/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/variable-child-no-string/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/index.test.ts b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/index.test.ts similarity index 92% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/index.test.ts rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/index.test.ts index 01d129ad..8e6741c0 100644 --- a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/index.test.ts +++ b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/index.test.ts @@ -5,10 +5,10 @@ import { describe, expect, it } from 'vitest'; import { generateTestPlugin } from '../../../utils/generate-test-plugin'; import { formatTestResult } from '../../../utils/format-test-result'; import boostPlugin from '../../../index'; -import { textOptimizer } from '..'; +import { nativeTextOptimizer } from '..'; pluginTester({ - plugin: generateTestPlugin(textOptimizer), + plugin: generateTestPlugin(nativeTextOptimizer), title: 'text', fixtures: path.resolve(import.meta.dirname, 'fixtures'), babelOptions: { @@ -29,7 +29,7 @@ const unknownAncestorAssumptionFixtures = [ ]; pluginTester({ - plugin: generateTestPlugin(textOptimizer, { + plugin: generateTestPlugin(nativeTextOptimizer, { assumptions: { unknownAncestorsDoNotRenderText: true }, }), title: 'text unknown ancestor assumption', @@ -45,7 +45,7 @@ pluginTester({ }); pluginTester({ - plugin: generateTestPlugin(textOptimizer, { integrations: { unistyles: 'on' } }), + plugin: generateTestPlugin(nativeTextOptimizer, { integrations: { unistyles: 'on' } }), title: 'text unistyles', fixtures: path.resolve(import.meta.dirname, 'fixtures-unistyles'), babelOptions: { @@ -55,7 +55,7 @@ pluginTester({ }); pluginTester({ - plugin: generateTestPlugin(textOptimizer, { integrations: { unistyles: 'on' } }), + plugin: generateTestPlugin(nativeTextOptimizer, { integrations: { unistyles: 'on' } }), title: 'text unistyles typescript', fixtures: path.resolve(import.meta.dirname, 'fixtures-unistyles-ts'), babelOptions: { diff --git a/packages/react-native-boost/src/plugin/optimizers/text/index.ts b/packages/react-native-boost/src/plugin/optimizers/native-text/index.ts similarity index 99% rename from packages/react-native-boost/src/plugin/optimizers/text/index.ts rename to packages/react-native-boost/src/plugin/optimizers/native-text/index.ts index 1768e368..8d059773 100644 --- a/packages/react-native-boost/src/plugin/optimizers/text/index.ts +++ b/packages/react-native-boost/src/plugin/optimizers/native-text/index.ts @@ -83,7 +83,7 @@ const TEXT_SPREAD_GUARD_KEYS = new Set([ const isNormalizedProperty = (attribute: t.JSXAttribute | t.JSXSpreadAttribute): attribute is t.JSXAttribute => t.isJSXAttribute(attribute) && t.isJSXIdentifier(attribute.name) && NORMALIZED_PROPERTIES.has(attribute.name.name); -export const textOptimizer: Optimizer = (path, logger, options, platform, unistylesEnabled, reactNativeMinor) => { +export const nativeTextOptimizer: Optimizer = (path, logger, options, platform, unistylesEnabled, reactNativeMinor) => { if (!isReactNativeComponent(path, 'Text')) return; const parent = path.parent as t.JSXElement; diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-imported-style-bails/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-imported-style-bails/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-imported-style-bails/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-imported-style-bails/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-imported-style-bails/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-imported-style-bails/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-imported-style-bails/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-imported-style-bails/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-no-style/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-no-style/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-no-style/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-no-style/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-no-style/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-no-style/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-no-style/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-no-style/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-plain-rn-style/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-plain-rn-style/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-plain-rn-style/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-plain-rn-style/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-plain-rn-style/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-plain-rn-style/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-plain-rn-style/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-plain-rn-style/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-style-in-resolvable-spread-bails/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-style-in-resolvable-spread-bails/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-style-in-resolvable-spread-bails/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-style-in-resolvable-spread-bails/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-style-in-resolvable-spread-bails/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-style-in-resolvable-spread-bails/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-style-in-resolvable-spread-bails/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-style-in-resolvable-spread-bails/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-style/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-style/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-style/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-style/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-style/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-style/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-style/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-style/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-unknown-style-bails/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-unknown-style-bails/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-unknown-style-bails/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-unknown-style-bails/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-unknown-style-bails/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-unknown-style-bails/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures-unistyles/unistyles-unknown-style-bails/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-unknown-style-bails/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/accessibility-label/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessibility-label/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/accessibility-label/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessibility-label/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/accessibility-label/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessibility-label/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/accessibility-label/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessibility-label/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/accessibility-state/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessibility-state/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/accessibility-state/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessibility-state/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/accessibility-state/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessibility-state/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/accessibility-state/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessibility-state/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/accessible/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessible/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/accessible/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessible/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/accessible/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessible/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/accessible/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessible/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/ambiguous-id-bails/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/ambiguous-id-bails/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/ambiguous-id-bails/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/ambiguous-id-bails/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/ambiguous-id-bails/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/ambiguous-id-bails/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/ambiguous-id-bails/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/ambiguous-id-bails/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-busy/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-busy/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-busy/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-busy/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-busy/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-busy/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-busy/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-busy/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-hidden/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-hidden/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-hidden/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-hidden/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-hidden/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-hidden/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-hidden/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-hidden/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-in-resolvable-spread-bails/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-in-resolvable-spread-bails/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-in-resolvable-spread-bails/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-in-resolvable-spread-bails/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-in-resolvable-spread-bails/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-in-resolvable-spread-bails/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-in-resolvable-spread-bails/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-in-resolvable-spread-bails/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-label-collision/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-label-collision/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-label-collision/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-label-collision/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-label-collision/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-label-collision/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-label-collision/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-label-collision/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-label-dynamic/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-label-dynamic/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-label-dynamic/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-label-dynamic/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-label-dynamic/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-label-dynamic/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-label-dynamic/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-label-dynamic/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-labelledby/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-labelledby/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-labelledby/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-labelledby/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-labelledby/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-labelledby/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-labelledby/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-labelledby/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-live/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-live/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-live/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-live/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-live/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-live/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-live/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-live/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-value-aggregation/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-value-aggregation/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-value-aggregation/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-value-aggregation/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-value-aggregation/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-value-aggregation/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/aria-value-aggregation/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/aria-value-aggregation/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/basic/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/basic/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/basic/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/basic/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/basic/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/basic/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/basic/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/basic/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/force-aria-translation/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/force-aria-translation/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/force-aria-translation/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/force-aria-translation/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/force-aria-translation/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/force-aria-translation/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/force-aria-translation/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/force-aria-translation/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/force-comment/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/force-comment/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/force-comment/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/force-comment/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/force-comment/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/force-comment/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/force-comment/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/force-comment/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/id-in-resolvable-spread-bails/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/id-in-resolvable-spread-bails/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/id-in-resolvable-spread-bails/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/id-in-resolvable-spread-bails/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/id-in-resolvable-spread-bails/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/id-in-resolvable-spread-bails/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/id-in-resolvable-spread-bails/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/id-in-resolvable-spread-bails/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/id-to-native-id/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/id-to-native-id/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/id-to-native-id/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/id-to-native-id/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/id-to-native-id/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/id-to-native-id/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/id-to-native-id/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/id-to-native-id/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/id-wins-over-native-id/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/id-wins-over-native-id/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/id-wins-over-native-id/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/id-wins-over-native-id/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/id-wins-over-native-id/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/id-wins-over-native-id/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/id-wins-over-native-id/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/id-wins-over-native-id/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/id-wins-over-spread-native-id/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/id-wins-over-spread-native-id/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/id-wins-over-spread-native-id/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/id-wins-over-spread-native-id/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/id-wins-over-spread-native-id/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/id-wins-over-spread-native-id/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/id-wins-over-spread-native-id/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/id-wins-over-spread-native-id/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/ignore-comment/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/ignore-comment/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/ignore-comment/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/ignore-comment/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/ignore-comment/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/ignore-comment/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/ignore-comment/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/ignore-comment/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/indirect-text-ancestor/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/indirect-text-ancestor/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/indirect-text-ancestor/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/indirect-text-ancestor/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/indirect-text-ancestor/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/indirect-text-ancestor/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/indirect-text-ancestor/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/indirect-text-ancestor/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/native-id/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/native-id/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/native-id/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/native-id/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/native-id/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/native-id/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/native-id/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/native-id/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/react-native-namespace-text-ancestor/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/react-native-namespace-text-ancestor/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/react-native-namespace-text-ancestor/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/react-native-namespace-text-ancestor/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/react-native-namespace-text-ancestor/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/react-native-namespace-text-ancestor/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/react-native-namespace-text-ancestor/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/react-native-namespace-text-ancestor/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/same-file-safe-ancestor/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/same-file-safe-ancestor/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/same-file-safe-ancestor/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/same-file-safe-ancestor/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/same-file-safe-ancestor/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/same-file-safe-ancestor/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/same-file-safe-ancestor/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/same-file-safe-ancestor/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/same-file-unknown-ancestor/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/same-file-unknown-ancestor/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/same-file-unknown-ancestor/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/same-file-unknown-ancestor/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/same-file-unknown-ancestor/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/same-file-unknown-ancestor/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/same-file-unknown-ancestor/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/same-file-unknown-ancestor/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/style-passthrough/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style-passthrough/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/style-passthrough/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style-passthrough/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/style-passthrough/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style-passthrough/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/style-passthrough/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style-passthrough/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/style/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/style/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/style/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/style/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/tab-index-dynamic/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/tab-index-dynamic/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/tab-index-dynamic/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/tab-index-dynamic/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/tab-index-dynamic/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/tab-index-dynamic/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/tab-index-dynamic/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/tab-index-dynamic/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/tab-index/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/tab-index/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/tab-index/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/tab-index/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/tab-index/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/tab-index/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/tab-index/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/tab-index/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/text-ancestor/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/text-ancestor/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/text-ancestor/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/text-ancestor/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/text-ancestor/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/text-ancestor/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/text-ancestor/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/text-ancestor/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/unknown-imported-ancestor/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unknown-imported-ancestor/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/unknown-imported-ancestor/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unknown-imported-ancestor/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/unknown-imported-ancestor/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unknown-imported-ancestor/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/unknown-imported-ancestor/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unknown-imported-ancestor/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/unresolvable-spread-props/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unresolvable-spread-props/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/unresolvable-spread-props/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unresolvable-spread-props/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/unresolvable-spread-props/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unresolvable-spread-props/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/fixtures/unresolvable-spread-props/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unresolvable-spread-props/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/index.test.ts b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/index.test.ts similarity index 83% rename from packages/react-native-boost/src/plugin/optimizers/view/__tests__/index.test.ts rename to packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/index.test.ts index 1a3d07b0..6313cc8a 100644 --- a/packages/react-native-boost/src/plugin/optimizers/view/__tests__/index.test.ts +++ b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/index.test.ts @@ -2,10 +2,10 @@ import path from 'node:path'; import { pluginTester } from 'babel-plugin-tester'; import { generateTestPlugin } from '../../../utils/generate-test-plugin'; import { formatTestResult } from '../../../utils/format-test-result'; -import { viewOptimizer } from '..'; +import { nativeViewOptimizer } from '..'; pluginTester({ - plugin: generateTestPlugin(viewOptimizer), + plugin: generateTestPlugin(nativeViewOptimizer), title: 'view', fixtures: path.resolve(import.meta.dirname, 'fixtures'), babelOptions: { @@ -15,7 +15,7 @@ pluginTester({ }); pluginTester({ - plugin: generateTestPlugin(viewOptimizer, { + plugin: generateTestPlugin(nativeViewOptimizer, { assumptions: { unknownAncestorsDoNotRenderText: true }, }), title: 'view unknown ancestor assumption', @@ -33,7 +33,7 @@ pluginTester({ }); pluginTester({ - plugin: generateTestPlugin(viewOptimizer, { integrations: { unistyles: 'on' } }), + plugin: generateTestPlugin(nativeViewOptimizer, { integrations: { unistyles: 'on' } }), title: 'view unistyles', fixtures: path.resolve(import.meta.dirname, 'fixtures-unistyles'), babelOptions: { diff --git a/packages/react-native-boost/src/plugin/optimizers/view/index.ts b/packages/react-native-boost/src/plugin/optimizers/native-view/index.ts similarity index 99% rename from packages/react-native-boost/src/plugin/optimizers/view/index.ts rename to packages/react-native-boost/src/plugin/optimizers/native-view/index.ts index b33bb3d4..a0d61f56 100644 --- a/packages/react-native-boost/src/plugin/optimizers/view/index.ts +++ b/packages/react-native-boost/src/plugin/optimizers/native-view/index.ts @@ -56,7 +56,7 @@ const VIEW_SPREAD_GUARD_KEYS_UNISTYLES = new Set([...VIEW_SPREAD_GUARD_KEYS, 'st const ARIA_STATE_PROPERTIES = new Set(['aria-busy', 'aria-checked', 'aria-disabled', 'aria-expanded', 'aria-selected']); const ARIA_VALUE_PROPERTIES = new Set(['aria-valuemax', 'aria-valuemin', 'aria-valuenow', 'aria-valuetext']); -export const viewOptimizer: Optimizer = (path, logger, options, _platform, unistylesEnabled) => { +export const nativeViewOptimizer: Optimizer = (path, logger, options, _platform, unistylesEnabled) => { if (!isReactNativeComponent(path, 'View')) return; const forced = isForcedLine(path); diff --git a/packages/react-native-boost/src/runtime/components/native-activity-indicator.ts b/packages/react-native-boost/src/runtime/components/native-activity-indicator.ts index e135e51d..3347bf6c 100644 --- a/packages/react-native-boost/src/runtime/components/native-activity-indicator.ts +++ b/packages/react-native-boost/src/runtime/components/native-activity-indicator.ts @@ -9,9 +9,11 @@ type ReactNativeActivityIndicatorModule = { }; }; -// Accessing ActivityIndicator registers the platform host view config before its string is used. const { ActivityIndicator, Platform } = reactNativeModule as ReactNativeActivityIndicatorModule; +/** + * Native ActivityIndicator component with graceful fallback. + */ export const NativeActivityIndicator: ComponentType = Platform.OS === 'android' ? ('AndroidProgressBar' as unknown as ComponentType) diff --git a/packages/react-native-boost/src/runtime/components/native-image.tsx b/packages/react-native-boost/src/runtime/components/native-image.ts similarity index 51% rename from packages/react-native-boost/src/runtime/components/native-image.tsx rename to packages/react-native-boost/src/runtime/components/native-image.ts index 03c2db41..cafd2240 100644 --- a/packages/react-native-boost/src/runtime/components/native-image.tsx +++ b/packages/react-native-boost/src/runtime/components/native-image.ts @@ -9,15 +9,10 @@ type ReactNativeImageModule = { }; }; -// Accessing Image loads its module, which registers the RCTImageView host before the string is used. const { Image, Platform } = reactNativeModule as ReactNativeImageModule; /** - * Native Image host registered by React Native's public `Image` module. - * - * React Native's component registry returns the host name as the component value. This avoids RN's - * deprecated `Libraries` deep import and its Babel warning. Keep the public `Image` access above: - * using the string without first loading `Image` leaves the host unregistered. + * Native Image component with graceful fallback. */ export const NativeImage: ComponentType = Platform.OS === 'web' ? Image : ('RCTImageView' as unknown as ComponentType); diff --git a/packages/react-native-boost/src/runtime/components/native-text.tsx b/packages/react-native-boost/src/runtime/components/native-text.ts similarity index 67% rename from packages/react-native-boost/src/runtime/components/native-text.tsx rename to packages/react-native-boost/src/runtime/components/native-text.ts index ca8e967b..fbca8403 100644 --- a/packages/react-native-boost/src/runtime/components/native-text.tsx +++ b/packages/react-native-boost/src/runtime/components/native-text.ts @@ -9,15 +9,10 @@ const isWeb = reactNative.Platform.OS === 'web'; let nativeText = reactNative.unstable_NativeText; if (isWeb || nativeText == null) { - // Fallback to regular Text component if unstable_NativeText is not available or we're on Web nativeText = reactNative.Text; } /** * Native Text component with graceful fallback. - * - * @remarks - * Uses `unstable_NativeText` on supported native runtimes and falls back to `Text` - * on web or when the unstable export is unavailable. */ export const NativeText: ComponentType = nativeText; diff --git a/packages/react-native-boost/src/runtime/components/native-view.tsx b/packages/react-native-boost/src/runtime/components/native-view.ts similarity index 67% rename from packages/react-native-boost/src/runtime/components/native-view.tsx rename to packages/react-native-boost/src/runtime/components/native-view.ts index 6a66f277..ad0efdcc 100644 --- a/packages/react-native-boost/src/runtime/components/native-view.tsx +++ b/packages/react-native-boost/src/runtime/components/native-view.ts @@ -9,15 +9,10 @@ const isWeb = reactNative.Platform.OS === 'web'; let nativeView = reactNative.unstable_NativeView; if (isWeb || nativeView == null) { - // Fallback to regular View component if unstable_NativeView is not available or we're on Web nativeView = reactNative.View; } /** * Native View component with graceful fallback. - * - * @remarks - * Uses `unstable_NativeView` on supported native runtimes and falls back to `View` - * on web or when the unstable export is unavailable. */ export const NativeView: ComponentType = nativeView; diff --git a/packages/react-native-boost/src/runtime/index.ts b/packages/react-native-boost/src/runtime/index.ts index 98498510..8e15f639 100644 --- a/packages/react-native-boost/src/runtime/index.ts +++ b/packages/react-native-boost/src/runtime/index.ts @@ -24,8 +24,7 @@ let activityIndicatorSmallProps: { style: (typeof activityIndicatorStyles)['smal let activityIndicatorLargeProps: { style: (typeof activityIndicatorStyles)['large']; size: 'large' } | undefined; // Resolve RN's `processColor` once. The `typeof` guard degrades to a passthrough on -// a non-RN host that lacks it (see {@link processSelectionColor}); the web build never reaches this โ€” it -// uses the separate `index.web.ts` shim. +// a non-RN host that lacks it (see {@link processSelectionColor}). const processColor: ((color?: ColorValue | number) => ProcessedColorValue | null | undefined) | undefined = typeof rnProcessColor === 'function' ? rnProcessColor : undefined; const resolveImageAssetSource = diff --git a/packages/react-native-boost/src/runtime/utils/constants.ts b/packages/react-native-boost/src/runtime/utils/constants.ts index 2e2fc1bd..10471fd8 100644 --- a/packages/react-native-boost/src/runtime/utils/constants.ts +++ b/packages/react-native-boost/src/runtime/utils/constants.ts @@ -22,8 +22,7 @@ export const verticalAlignToTextAlignVerticalMap = { /** * Clamps a `numberOfLines` value exactly as `Text` does at runtime: a negative number (or `NaN`) becomes * `0`, while `null`/`undefined` pass through untouched (`!(value >= 0)` is `true` for negatives and `NaN`, - * `false` otherwise). The plugin emits this only around a non-literal `numberOfLines`; literal negatives - * are clamped at build time, so it never runs for them. + * `false` otherwise). */ export const clampNumberOfLines = (value: number | null | undefined): number | null | undefined => value != null && !(value >= 0) ? 0 : value; diff --git a/packages/react-native-boost/vitest.config.ts b/packages/react-native-boost/vitest.config.ts index 67bfb6e6..a4f6c970 100644 --- a/packages/react-native-boost/vitest.config.ts +++ b/packages/react-native-boost/vitest.config.ts @@ -9,19 +9,16 @@ export default defineConfig({ test: { projects: [ { - // Unit suite: aliases `react-native` to a lightweight mock for the whole project. resolve: { alias: [{ find: /^react-native$/, replacement: resolve(runtimeMockPath) }], }, test: { name: 'unit', - // babel-plugin-tester requires `it` and `describe` to be set globally globals: true, // The differential parity suite needs the REAL react-native and runs under its own config. exclude: [...configDefaults.exclude, '**/__tests__/parity/**'], }, }, - // Parity suite: dedicated config (real RN transform + redirects + react dedup). parityConfig, ], }, diff --git a/packages/react-native-time-to-render/src/index.tsx b/packages/react-native-time-to-render/src/index.tsx index d772ee1f..dfd8de6d 100644 --- a/packages/react-native-time-to-render/src/index.tsx +++ b/packages/react-native-time-to-render/src/index.tsx @@ -1,5 +1,5 @@ -import TimeToRender from './NativeTimeToRender'; -export { default as TimeToRenderView } from './TimeToRenderNativeComponent'; +import TimeToRender from './native-time-to-render'; +export { default as TimeToRenderView } from './time-to-render-native-component'; export type ThermalLevel = 'nominal' | 'fair' | 'serious' | 'critical' | 'unknown'; diff --git a/packages/react-native-time-to-render/src/NativeTimeToRender.ts b/packages/react-native-time-to-render/src/native-time-to-render.ts similarity index 100% rename from packages/react-native-time-to-render/src/NativeTimeToRender.ts rename to packages/react-native-time-to-render/src/native-time-to-render.ts diff --git a/packages/react-native-time-to-render/src/TimeToRenderNativeComponent.ts b/packages/react-native-time-to-render/src/time-to-render-native-component.ts similarity index 100% rename from packages/react-native-time-to-render/src/TimeToRenderNativeComponent.ts rename to packages/react-native-time-to-render/src/time-to-render-native-component.ts From 9bb513ad105c1c298dc640f55127894a13eab65d Mon Sep 17 00:00:00 2001 From: Maximilian Krause Date: Thu, 3 Sep 2026 17:25:39 +0200 Subject: [PATCH 11/56] fix(native-text): bail when runtime text context is unknown --- .../information/optimization-coverage.mdx | 8 ++++--- .../docs/information/troubleshooting.mdx | 2 +- .../build-time-accessible-default.test.ts | 8 ++++--- .../src/plugin/__tests__/parity/boost.ts | 21 +++++++++++++------ .../plugin/__tests__/parity/parity.test.ts | 3 ++- .../fixtures/text-in-render-prop/code.js | 0 .../fixtures/text-in-render-prop/output.js | 0 .../text-under-runtime-fragment/code.js | 0 .../text-under-runtime-fragment/output.js | 0 .../fixtures/text-with-runtime-parent/code.js | 0 .../dangerous-output.js | 0 .../text-with-runtime-parent/output.js | 0 .../plugin/optimizers/native-text/index.ts | 6 ++++++ .../src/plugin/types/index.ts | 2 +- 14 files changed, 35 insertions(+), 15 deletions(-) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/text-in-render-prop/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/text-in-render-prop/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/text-under-runtime-fragment/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/text-under-runtime-fragment/output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/text-with-runtime-parent/code.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/text-with-runtime-parent/dangerous-output.js (100%) rename packages/react-native-boost/src/plugin/optimizers/{text => native-text}/__tests__/fixtures/text-with-runtime-parent/output.js (100%) diff --git a/apps/docs/content/docs/information/optimization-coverage.mdx b/apps/docs/content/docs/information/optimization-coverage.mdx index 233b140e..a17875b1 100644 --- a/apps/docs/content/docs/information/optimization-coverage.mdx +++ b/apps/docs/content/docs/information/optimization-coverage.mdx @@ -9,7 +9,7 @@ React Native Boost is conservative by design. If it cannot prove an optimization | Component | Optimized when... | Common bailout reasons | | --- | --- | --- | -| `Text` | Imported from `react-native`, no blacklisted props, primitive children, safe ancestor chain | `contains blacklisted props`, `has Text ancestor`, `has unresolved ancestor that may render Text`, `contains non-primitive children`, `is a direct child of expo-router Link with asChild` | +| `Text` | Imported from `react-native`, no blacklisted props, primitive children, safe ancestor chain | `contains blacklisted props`, `has Text ancestor`, `has unresolved ancestor that may render Text`, `has unresolved runtime parent that may render Text`, `contains non-primitive children`, `is a direct child of expo-router Link with asChild` | | `View` | Imported from `react-native`, safe ancestor chain, no spread that may carry a translated prop | `has a spread that may carry a translated prop`, `has both a dynamic id and a nativeID (ambiguous precedence)`, `has Text ancestor`, `has unresolved ancestor that may render Text` | | `Image` | Imported from `react-native`, native platform known, supported source/style props, safe ancestor chain | `target platform is unknown`, `has a Unistyles style and there is no lean Image host to route to`, `has an unresolved style source that may be a Unistyles style`, `contains unsupported Image props`, `has a spread that may carry Image wrapper props`, `has Text ancestor`, `has unresolved ancestor that may render Text` | | `ActivityIndicator` | Imported from `react-native`, native platform known, direct props only, no children, safe ancestor chain | `target platform is unknown`, `has spread props`, `contains children`, `contains an impure prop expression that cannot be safely reordered`, `has Text ancestor`, `has unresolved ancestor that may render Text` | @@ -30,7 +30,7 @@ These skip optimization before component-specific checks: Use `@boost-force` to force optimization on a component that would otherwise be skipped. This bypasses all bailout checks except the `react-native` import check. See the [Decorators](/docs/configuration/boost-decorator#boost-force) page for details. -Set `assumptions.unknownAncestorsDoNotRenderText` to `true` to optimize components under unknown ancestors across the project. This can produce the wrong native host if an unknown ancestor renders a `Text` around its children. +Set `assumptions.unknownAncestorsDoNotRenderText` to `true` to optimize components under unknown ancestors or runtime parents across the project. This can produce the wrong native host if one provides a `Text` context. ## Text Coverage @@ -58,7 +58,9 @@ Like `View`, `Text` optimization depends on ancestor classification: - `text`: skip (`has Text ancestor`) โ€” a `Text` nested in another `Text` renders as the inline `NativeVirtualText` host (`RCTVirtualText`), not `NativeText` (`RCTText`), so optimizing it would emit the wrong host. - `unknown`: skip by default -The project-wide unknown ancestor assumption can optimize this case. A false assumption can introduce regressions. For example, `expo-router`'s `Link` wraps its children in a `Text` by default. A `Text` under that `Link` must render as `NativeVirtualText`. +A root `Text` returned by a component or renderer also skips as `has unresolved runtime parent that may render Text`. Its caller can mount it inside another `Text`, which requires `NativeVirtualText` instead of `NativeText`. + +The project-wide unknown ancestor assumption can optimize these cases. A false assumption can introduce regressions. For example, `expo-router`'s `Link` wraps its children in a `Text` by default. A `Text` under that `Link` must render as `NativeVirtualText`. A `Text` used as a direct child of `expo-router` `Link` with `asChild` is **always** skipped (`is a direct child of expo-router Link with asChild`), even when the assumption is enabled, because `Link` makes that child diff --git a/apps/docs/content/docs/information/troubleshooting.mdx b/apps/docs/content/docs/information/troubleshooting.mdx index d5e7abc2..07440b56 100644 --- a/apps/docs/content/docs/information/troubleshooting.mdx +++ b/apps/docs/content/docs/information/troubleshooting.mdx @@ -66,7 +66,7 @@ Options: A root `Text` returned by a component or renderer can be mounted inside another `Text`. Boost keeps the wrapper because only that wrapper can select `NativeText` or `NativeVirtualText` from the runtime context. -Use `@boost-force` only when every use of that component has a non-text parent. The `dangerouslyOptimizeTextWithUnknownAncestors` option also overrides this check. +Use `@boost-force` only when every use of that component has a non-text parent. The project-wide unknown ancestor assumption also overrides this check. ### Ignores do not work as expected in monorepos diff --git a/packages/react-native-boost/src/plugin/__tests__/build-time-accessible-default.test.ts b/packages/react-native-boost/src/plugin/__tests__/build-time-accessible-default.test.ts index 23be2e5b..f99caee7 100644 --- a/packages/react-native-boost/src/plugin/__tests__/build-time-accessible-default.test.ts +++ b/packages/react-native-boost/src/plugin/__tests__/build-time-accessible-default.test.ts @@ -2,15 +2,17 @@ import { describe, it, expect } from 'vitest'; import { transformSync, type TransformCaller } from '@babel/core'; import boostPlugin from '../index'; -// Compile a bare `` (common path: no accessibility props) with the given Babel caller platform, -// mirroring how Metro invokes the plugin per platform bundle. +// Compile a bare `` with the given Metro platform. The assumption marks this isolated test root as safe. const compile = (platform?: string): string => transformSync(`import { Text } from 'react-native';\nexport default () => hi;`, { configFile: false, babelrc: false, filename: 'case.jsx', caller: (platform ? { name: 'metro', platform } : { name: 'test' }) as TransformCaller, - plugins: ['@babel/plugin-syntax-jsx', [boostPlugin, { logLevel: 'silent' }]], + plugins: [ + '@babel/plugin-syntax-jsx', + [boostPlugin, { logLevel: 'silent', assumptions: { unknownAncestorsDoNotRenderText: true } }], + ], })!.code!; describe('build-time `accessible` default', () => { diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/boost.ts b/packages/react-native-boost/src/plugin/__tests__/parity/boost.ts index a6b3bf6b..37cbed22 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/boost.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/boost.ts @@ -18,10 +18,10 @@ interface BoostOptimized { /** * Transform a JSX body with the full Boost plugin under the given platform (mirroring how Metro builds - * per platform, so the plugin inlines build-time defaults exactly as in production). Returns the - * generated code. + * per platform, so the plugin inlines build-time defaults exactly as in production). The generated + * component is rendered at the test root, so that runtime parent is safe unless a test says otherwise. */ -function transformBoostCase(os: PlatformOS, jsxBody: string, preamble = ''): string { +function transformBoostCase(os: PlatformOS, jsxBody: string, preamble = '', runtimeParentIsSafe = true): string { setPlatformOS(os); const source = `import { ActivityIndicator, Image, Text, View } from 'react-native';\n${preamble}\n` + @@ -32,7 +32,15 @@ function transformBoostCase(os: PlatformOS, jsxBody: string, preamble = ''): str filename: 'boost-case.jsx', caller: { name: 'metro', platform: os } as TransformCaller, presets: [['@babel/preset-react', { runtime: 'automatic' }]], - plugins: [[boostPlugin, { logLevel: 'silent' }]], + plugins: [ + [ + boostPlugin, + { + logLevel: 'silent', + assumptions: { unknownAncestorsDoNotRenderText: runtimeParentIsSafe }, + }, + ], + ], }); return out!.code!; } @@ -66,9 +74,10 @@ export async function captureBoost( export async function captureBoostHosts( os: PlatformOS, jsxBody: string, - preamble = '' + preamble = '', + runtimeParentIsSafe = true ): Promise { - const code = transformBoostCase(os, jsxBody, preamble); + const code = transformBoostCase(os, jsxBody, preamble, runtimeParentIsSafe); if (!code.includes(RUNTIME_MODULE_NAME)) return { optimized: false }; const mod = await writeAndImportFresh('boost', code); diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts b/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts index 5f9249aa..7a02e09f 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts @@ -403,7 +403,8 @@ describe('differential parity', () => { const hosts = await captureWrapperHosts(os, jsx, preamble); expect(hosts.map((host) => host.which)).toEqual(['NativeText', 'NativeVirtualText']); - expect(boostOptimizes(os, jsx, preamble, false)).toBe(false); + const boost = await captureBoostHosts(os, jsx, preamble, false); + expect(boost.optimized).toBe(false); }); }); }); diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-in-render-prop/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-in-render-prop/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-in-render-prop/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-in-render-prop/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-in-render-prop/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-in-render-prop/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-in-render-prop/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-in-render-prop/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-under-runtime-fragment/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-under-runtime-fragment/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-under-runtime-fragment/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-under-runtime-fragment/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-under-runtime-fragment/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-under-runtime-fragment/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-under-runtime-fragment/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-under-runtime-fragment/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-with-runtime-parent/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-with-runtime-parent/code.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-with-runtime-parent/code.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-with-runtime-parent/code.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-with-runtime-parent/dangerous-output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-with-runtime-parent/dangerous-output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-with-runtime-parent/dangerous-output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-with-runtime-parent/dangerous-output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-with-runtime-parent/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-with-runtime-parent/output.js similarity index 100% rename from packages/react-native-boost/src/plugin/optimizers/text/__tests__/fixtures/text-with-runtime-parent/output.js rename to packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/text-with-runtime-parent/output.js diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/index.ts b/packages/react-native-boost/src/plugin/optimizers/native-text/index.ts index 8d059773..0dbd5463 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/index.ts +++ b/packages/react-native-boost/src/plugin/optimizers/native-text/index.ts @@ -22,6 +22,7 @@ import { extractSelectableAndUpdateStyle, tryBuildStaticTextStyle, ancestorBailoutChecks, + inheritsTextContextFromRuntimeParent, createStyleOriginResolver, UNISTYLES_TEXT_HOST, } from '../../utils/common'; @@ -120,6 +121,11 @@ export const nativeTextOptimizer: Optimizer = (path, logger, options, platform, reason: 'contains non-primitive children', shouldBail: () => hasInvalidChildren(path, parent), }, + { + reason: 'has unresolved runtime parent that may render Text', + shouldBail: () => + options?.assumptions?.unknownAncestorsDoNotRenderText !== true && inheritsTextContextFromRuntimeParent(path), + }, ...ancestorBailoutChecks(path, options?.assumptions?.unknownAncestorsDoNotRenderText === true), ]; diff --git a/packages/react-native-boost/src/plugin/types/index.ts b/packages/react-native-boost/src/plugin/types/index.ts index 8b359a24..f670ae24 100644 --- a/packages/react-native-boost/src/plugin/types/index.ts +++ b/packages/react-native-boost/src/plugin/types/index.ts @@ -29,7 +29,7 @@ export interface PluginOptimizationOptions { export interface PluginAssumptions { /** - * Assume unresolved ancestor components do not render a React Native `Text` around their children. + * Assume unresolved ancestors and runtime parents do not provide a React Native `Text` context. * * This increases optimization coverage, but can emit the wrong native host when the assumption is false. * Enable it only after you verify this behavior across the project. From d1dfa8b47cb09b81f3700a7c4fb45377de5bbfcd Mon Sep 17 00:00:00 2001 From: Maximilian Krause Date: Thu, 3 Sep 2026 17:42:52 +0200 Subject: [PATCH 12/56] test: cleanup tests --- .../src/metro/__tests__/index.test.ts | 3 + .../src/metro/__tests__/transformer.test.ts | 12 ++-- .../text-in-text-stays-bailed/code.js | 7 --- .../text-in-text-stays-bailed/output.js | 7 --- .../native-attribute-conformance.test.ts | 60 +++++++++---------- .../plugin/__tests__/parity/fuzz/fuzz.test.ts | 11 ++-- .../plugin/__tests__/parity/parity.test.ts | 6 +- .../accessibility-spread-bails/code.js | 5 -- .../accessibility-spread-bails/output.js | 12 ---- .../fixtures/dynamic-style-runtime/code.js | 3 + .../fixtures/dynamic-style-runtime/output.js | 15 +++++ .../fixtures/force-dynamic-runtime/code.js | 8 --- .../fixtures/force-dynamic-runtime/output.js | 24 -------- .../fixtures/text-ancestor-bails/code.js | 5 -- .../fixtures/text-ancestor-bails/output.js | 10 ---- .../unknown-imported-ancestor/code.js | 9 +-- .../dangerous-output.js | 38 +++--------- .../unknown-imported-ancestor/output.js | 39 +++--------- .../native-image/__tests__/index.test.ts | 60 +++---------------- .../fixtures/complex-example/code.js | 18 ------ .../fixtures/complex-example/output.js | 25 -------- .../__tests__/fixtures/default-props/code.js | 4 -- .../fixtures/default-props/output.js | 3 - .../expo-router-link-alias-as-child/code.js | 1 - .../dangerous-output.js | 7 --- .../expo-router-link-alias-as-child/output.js | 12 ---- .../expo-router-link-as-child/code.js | 4 -- .../dangerous-output.js | 10 ---- .../expo-router-link-as-child/output.js | 15 ----- .../fixtures/mixed-children-types/code.js | 6 -- .../fixtures/mixed-children-types/output.js | 17 ------ .../fixtures/numeric-concat-child/code.js | 2 - .../fixtures/numeric-concat-child/output.js | 13 ---- .../__tests__/fixtures/pressables/code.js | 8 --- .../__tests__/fixtures/pressables/output.js | 19 ------ .../__tests__/fixtures/two-components/code.js | 3 - .../fixtures/two-components/output.js | 17 ------ .../fixtures/variable-child-no-string/code.js | 5 +- .../variable-child-no-string/output.js | 16 +---- .../unistyles-no-style/code.js | 2 - .../unistyles-no-style/output.js | 3 - .../fixtures/accessibility-label/code.js | 2 - .../fixtures/accessibility-label/output.js | 3 - .../__tests__/fixtures/accessible/code.js | 2 - .../__tests__/fixtures/accessible/output.js | 3 - .../__tests__/fixtures/native-id/code.js | 2 - .../__tests__/fixtures/native-id/output.js | 3 - .../fixtures/style-passthrough/code.js | 9 ++- .../fixtures/style-passthrough/output.js | 3 + .../__tests__/fixtures/style/code.js | 2 - .../__tests__/fixtures/style/output.js | 7 --- .../unknown-imported-ancestor/code.js | 12 ++-- .../dangerous-output.js | 11 +--- .../unknown-imported-ancestor/output.js | 16 ++--- .../unresolvable-spread-props/code.js | 8 --- .../unresolvable-spread-props/output.js | 8 --- .../src/plugin/utils/__tests__/logger.test.ts | 5 +- .../utils/common/__tests__/attributes.test.ts | 11 ---- .../src/runtime/__tests__/index.test.ts | 56 +++++++---------- .../src/report/__tests__/analysis.test.ts | 14 ++--- 60 files changed, 150 insertions(+), 571 deletions(-) delete mode 100644 packages/react-native-boost/src/plugin/__tests__/fixtures-nesting/text-in-text-stays-bailed/code.js delete mode 100644 packages/react-native-boost/src/plugin/__tests__/fixtures-nesting/text-in-text-stays-bailed/output.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/accessibility-spread-bails/code.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/accessibility-spread-bails/output.js create mode 100644 packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/dynamic-style-runtime/code.js create mode 100644 packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/dynamic-style-runtime/output.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/force-dynamic-runtime/code.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/force-dynamic-runtime/output.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/text-ancestor-bails/code.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/text-ancestor-bails/output.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/complex-example/code.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/complex-example/output.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/mixed-children-types/code.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/mixed-children-types/output.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/numeric-concat-child/code.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/numeric-concat-child/output.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/pressables/code.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/pressables/output.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/two-components/code.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/two-components/output.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-no-style/code.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-no-style/output.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessibility-label/code.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessibility-label/output.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessible/code.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessible/output.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/native-id/code.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/native-id/output.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style/code.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style/output.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unresolvable-spread-props/code.js delete mode 100644 packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unresolvable-spread-props/output.js diff --git a/packages/react-native-boost/src/metro/__tests__/index.test.ts b/packages/react-native-boost/src/metro/__tests__/index.test.ts index e03d3715..c2f3a428 100644 --- a/packages/react-native-boost/src/metro/__tests__/index.test.ts +++ b/packages/react-native-boost/src/metro/__tests__/index.test.ts @@ -91,6 +91,8 @@ describe('Metro integration', () => { }); expect(first.transformer.babelTransformerPath).not.toBe(second.transformer.babelTransformerPath); + expect(fs.readFileSync(first.transformer.babelTransformerPath, 'utf8')).toContain('"version":"0.86.0"'); + expect(fs.readFileSync(second.transformer.babelTransformerPath, 'utf8')).toContain('"version":"0.87.1"'); }); it('warns when React Native cannot be resolved', () => { @@ -105,6 +107,7 @@ describe('Metro integration', () => { }); expect(warn).toHaveBeenCalledOnce(); + expect(warn).toHaveBeenCalledWith(expect.stringContaining('React Native could not be detected')); }); }); diff --git a/packages/react-native-boost/src/metro/__tests__/transformer.test.ts b/packages/react-native-boost/src/metro/__tests__/transformer.test.ts index 186d693f..da947045 100644 --- a/packages/react-native-boost/src/metro/__tests__/transformer.test.ts +++ b/packages/react-native-boost/src/metro/__tests__/transformer.test.ts @@ -22,16 +22,20 @@ describe('Metro transformer', () => { ); fs.writeFileSync(pluginPath, 'module.exports = () => ({ visitor: {} });\n'); const injectionId = 'test-injection'; - const transformer = createTransformer({ + const manifest = { babelTransformerPath: delegatePath, pluginPath, - pluginOptions: { logLevel: 'silent' }, + pluginOptions: { logLevel: 'silent' as const }, injectionId, - }); + }; + const transformer = createTransformer(manifest); const result = await transformer.transform({ filename: 'case.js', src: '', options: {}, plugins: [] }); expect(result.metadata?.reactNativeBoost).toEqual({ injectionId }); - expect(transformer.getCacheKey()).toHaveLength(64); + expect(transformer.getCacheKey()).toBe(transformer.getCacheKey()); + expect(transformer.getCacheKey()).not.toBe( + createTransformer({ ...manifest, injectionId: 'different-injection' }).getCacheKey() + ); }); }); diff --git a/packages/react-native-boost/src/plugin/__tests__/fixtures-nesting/text-in-text-stays-bailed/code.js b/packages/react-native-boost/src/plugin/__tests__/fixtures-nesting/text-in-text-stays-bailed/code.js deleted file mode 100644 index 55fdea2c..00000000 --- a/packages/react-native-boost/src/plugin/__tests__/fixtures-nesting/text-in-text-stays-bailed/code.js +++ /dev/null @@ -1,7 +0,0 @@ -import { Text } from 'react-native'; -const C = () => ( - - outer - inner - -); diff --git a/packages/react-native-boost/src/plugin/__tests__/fixtures-nesting/text-in-text-stays-bailed/output.js b/packages/react-native-boost/src/plugin/__tests__/fixtures-nesting/text-in-text-stays-bailed/output.js deleted file mode 100644 index 55fdea2c..00000000 --- a/packages/react-native-boost/src/plugin/__tests__/fixtures-nesting/text-in-text-stays-bailed/output.js +++ /dev/null @@ -1,7 +0,0 @@ -import { Text } from 'react-native'; -const C = () => ( - - outer - inner - -); diff --git a/packages/react-native-boost/src/plugin/__tests__/native-attribute-conformance.test.ts b/packages/react-native-boost/src/plugin/__tests__/native-attribute-conformance.test.ts index 762312d6..05f89c38 100644 --- a/packages/react-native-boost/src/plugin/__tests__/native-attribute-conformance.test.ts +++ b/packages/react-native-boost/src/plugin/__tests__/native-attribute-conformance.test.ts @@ -177,40 +177,40 @@ describe('native attribute conformance', () => { } }); - it('exercises the optimized path (otherwise conformance would pass vacuously)', () => { - expect(optimizeAndInspect(viewSource('testID="element"'), nativeViewOptimizer, 'View')?.optimized).toBe(true); - expect(optimizeAndInspect(textSource('numberOfLines={1}'), nativeTextOptimizer, 'Text')?.optimized).toBe(true); - expect(optimizeAndInspect(imageSource(IMAGE_BASE_SOURCE), nativeImageOptimizer, 'Image', 'ios')?.optimized).toBe( - true - ); - }); - describe('View', () => { - it.each([...VIEW_WRAPPER_ONLY_PROPS, ...VIEW_PASSTHROUGH_PROPS])( - 'leaves only native attributes on the host for ', - (attributes) => { - const result = optimizeAndInspect(viewSource(attributes), nativeViewOptimizer, 'View'); - if (!result?.optimized) return; - const leaked = result.attributes.filter((attribute) => !NATIVE_VIEW_ATTRIBUTES.has(attribute)); - expect(leaked, `optimized leaks non-native attribute(s): ${leaked.join(', ')}`).toEqual( - [] - ); - } - ); + it.each(VIEW_WRAPPER_ONLY_PROPS)('leaves only native attributes on the host for ', (attributes) => { + const result = optimizeAndInspect(viewSource(attributes), nativeViewOptimizer, 'View'); + if (!result?.optimized) return; + const leaked = result.attributes.filter((attribute) => !NATIVE_VIEW_ATTRIBUTES.has(attribute)); + expect(leaked, `optimized leaks non-native attribute(s): ${leaked.join(', ')}`).toEqual( + [] + ); + }); + + it.each(VIEW_PASSTHROUGH_PROPS)('optimizes and leaves only native attributes on ', (attributes) => { + const result = optimizeAndInspect(viewSource(attributes), nativeViewOptimizer, 'View'); + expect(result?.optimized).toBe(true); + const leaked = result?.attributes.filter((attribute) => !NATIVE_VIEW_ATTRIBUTES.has(attribute)); + expect(leaked, `optimized leaks non-native attribute(s): ${leaked?.join(', ')}`).toEqual( + [] + ); + }); }); describe('Text', () => { - it.each([...TEXT_WRAPPER_ONLY_PROPS, ...TEXT_PASSTHROUGH_PROPS])( - 'leaves only native attributes on the host for ', - (attributes) => { - const result = optimizeAndInspect(textSource(attributes), nativeTextOptimizer, 'Text'); - if (!result?.optimized) return; - const leaked = result.attributes.filter((attribute) => !NATIVE_TEXT_ATTRIBUTES.has(attribute)); - expect(leaked, `optimized leaks non-native attribute(s): ${leaked.join(', ')}`).toEqual( - [] - ); - } - ); + it.each(TEXT_WRAPPER_ONLY_PROPS)('leaves only native attributes on the host for ', (attributes) => { + const result = optimizeAndInspect(textSource(attributes), nativeTextOptimizer, 'Text'); + if (!result?.optimized) return; + const leaked = result.attributes.filter((attribute) => !NATIVE_TEXT_ATTRIBUTES.has(attribute)); + expect(leaked, `optimized leaks non-native attribute(s): ${leaked.join(', ')}`).toEqual([]); + }); + + it.each(TEXT_PASSTHROUGH_PROPS)('optimizes and leaves only native attributes on ', (attributes) => { + const result = optimizeAndInspect(textSource(attributes), nativeTextOptimizer, 'Text'); + expect(result?.optimized).toBe(true); + const leaked = result?.attributes.filter((attribute) => !NATIVE_TEXT_ATTRIBUTES.has(attribute)); + expect(leaked, `optimized leaks non-native attribute(s): ${leaked?.join(', ')}`).toEqual([]); + }); }); describe('Image', () => { diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/fuzz/fuzz.test.ts b/packages/react-native-boost/src/plugin/__tests__/parity/fuzz/fuzz.test.ts index bf77f601..e41f228d 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/fuzz/fuzz.test.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/fuzz/fuzz.test.ts @@ -57,8 +57,7 @@ async function runCase(os: PlatformOS, jsxBody: string, preamble: string): Promi const wrapper = await captureWrapperHosts(os, jsxBody, preamble); const normalizeHost = (host: (typeof boost.hosts)[number]) => ({ which: host.which, - props: - host.which === 'NativeImage' ? normalizeImage(host.props, reactNativeVersion.minor) : normalize(host.props), + props: host.which === 'NativeImage' ? normalizeImage(host.props, reactNativeVersion.minor) : normalize(host.props), }); const boostProps = { hosts: boost.hosts.map(normalizeHost) }; const wrapperProps = { hosts: wrapper.map(normalizeHost) }; @@ -133,12 +132,9 @@ describe.skipIf(DISCOVER)('parity fuzzing', () => { // Anti-vacuous-green guard: a generator drifting into all-bail would pass trivially. expect(rate).toBeGreaterThan(0.5); + for (const counts of Object.values(byTag)) expect(counts.optimized).toBeGreaterThan(0); const imageTotal = byTag.Image.optimized + byTag.Image.skipped; - const imageRate = byTag.Image.optimized / imageTotal; - expect(imageTotal).toBeGreaterThan(0); - expect(imageRate).toBeGreaterThan(0.2); - const activityTotal = byTag.ActivityIndicator.optimized + byTag.ActivityIndicator.skipped; - expect(activityTotal).toBeGreaterThan(0); + expect(byTag.Image.optimized / imageTotal).toBeGreaterThan(0.2); }, Math.max(30_000, NUM_RUNS * 80) ); @@ -165,6 +161,7 @@ describe.skipIf(DISCOVER).each(['ios', 'android'] as const)('disabled reconcilia const jsx = buildDisabledCase(combo); const result = await runCase(os, jsx, ''); if (result.status === 'divergence') throw new Error(formatDivergence(os, jsx, '', result)); + expect(result.status).toBe('match'); }); }); diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts b/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts index 7a02e09f..c0340276 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts @@ -110,6 +110,8 @@ const VIEW_CASES = [ '', '', '', + '', + '', ]; // View cases Boost is expected to bail on. Asserting the bail explicitly stops an unexpected bailout โ€” @@ -332,7 +334,6 @@ describe('differential parity', () => { it.each(DYNAMIC_IMAGE_CASES)('Image dynamic: %s', async (jsx, preamble) => { const boost = await captureBoost(os, jsx, preamble); - expect(boost.optimized).toBe(true); if (!boost.optimized) throw new Error('expected Image dynamic case to optimize'); const wrapper = await captureWrapper(os, jsx, preamble); expect(boost.which).toEqual(wrapper.which); @@ -346,7 +347,6 @@ describe('differential parity', () => { const jsx = 'hello'; const preamble = 'const dynamicStyle = { userSelect: "none" };'; const boost = await captureBoost(os, jsx, preamble); - expect(boost.optimized).toBe(true); if (!boost.optimized) throw new Error('expected Text mixed style case to optimize'); const wrapper = await captureWrapper(os, jsx, preamble); expect(boost.which).toEqual(wrapper.which); @@ -357,7 +357,6 @@ describe('differential parity', () => { const jsx = 'hello'; const preamble = 'const undefined = true;'; const boost = await captureBoost(os, jsx, preamble); - expect(boost.optimized).toBe(true); if (!boost.optimized) throw new Error('expected Text shadowed undefined case to optimize'); const wrapper = await captureWrapper(os, jsx, preamble); expect(boost.which).toEqual(wrapper.which); @@ -369,7 +368,6 @@ describe('differential parity', () => { 'hello'; const preamble = 'const _b0 = false;\nconst _s0 = { selectable: true };'; const boost = await captureBoost(os, jsx, preamble); - expect(boost.optimized).toBe(true); if (!boost.optimized) throw new Error('expected Text static userSelect spread case to optimize'); const wrapper = await captureWrapper(os, jsx, preamble); expect(boost.which).toEqual(wrapper.which); diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/accessibility-spread-bails/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/accessibility-spread-bails/code.js deleted file mode 100644 index 99785991..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/accessibility-spread-bails/code.js +++ /dev/null @@ -1,5 +0,0 @@ -import { Image } from 'react-native'; - -const props = { 'aria-label': 'Logo' }; - -; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/accessibility-spread-bails/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/accessibility-spread-bails/output.js deleted file mode 100644 index e15bac3c..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/accessibility-spread-bails/output.js +++ /dev/null @@ -1,12 +0,0 @@ -import { Image } from 'react-native'; -const props = { - 'aria-label': 'Logo', -}; -; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/dynamic-style-runtime/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/dynamic-style-runtime/code.js new file mode 100644 index 00000000..bc2c4077 --- /dev/null +++ b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/dynamic-style-runtime/code.js @@ -0,0 +1,3 @@ +import { Image } from 'react-native'; + +; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/dynamic-style-runtime/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/dynamic-style-runtime/output.js new file mode 100644 index 00000000..f1b79124 --- /dev/null +++ b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/dynamic-style-runtime/output.js @@ -0,0 +1,15 @@ +import { + processImageSourceProps as _processImageSourceProps, + NativeImage as _NativeImage, +} from 'react-native-boost/runtime'; +import { Image } from 'react-native'; +<_NativeImage + {..._processImageSourceProps({ + source: { + uri: 'logo.png', + width: 16, + height: 16, + }, + style: style, + })} +/>; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/force-dynamic-runtime/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/force-dynamic-runtime/code.js deleted file mode 100644 index 4ed42b35..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/force-dynamic-runtime/code.js +++ /dev/null @@ -1,8 +0,0 @@ -import { Image } from 'react-native'; - -<> - {/* @boost-force */} - - {/* @boost-force */} - -; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/force-dynamic-runtime/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/force-dynamic-runtime/output.js deleted file mode 100644 index 7a6a02ca..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/force-dynamic-runtime/output.js +++ /dev/null @@ -1,24 +0,0 @@ -import { - processImageSourceProps as _processImageSourceProps, - NativeImage as _NativeImage, -} from 'react-native-boost/runtime'; -import { Image } from 'react-native'; -<> - {/* @boost-force */} - <_NativeImage - {..._processImageSourceProps({ - source: source, - })} - /> - {/* @boost-force */} - <_NativeImage - {..._processImageSourceProps({ - source: { - uri: 'logo.png', - width: 16, - height: 16, - }, - style: style, - })} - /> -; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/text-ancestor-bails/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/text-ancestor-bails/code.js deleted file mode 100644 index c83c008f..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/text-ancestor-bails/code.js +++ /dev/null @@ -1,5 +0,0 @@ -import { Image, Text } from 'react-native'; - - - -; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/text-ancestor-bails/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/text-ancestor-bails/output.js deleted file mode 100644 index 43075b4d..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/text-ancestor-bails/output.js +++ /dev/null @@ -1,10 +0,0 @@ -import { Image, Text } from 'react-native'; - - -; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/unknown-imported-ancestor/code.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/unknown-imported-ancestor/code.js index 6a6241f4..7f3a368e 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/unknown-imported-ancestor/code.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/unknown-imported-ancestor/code.js @@ -1,9 +1,6 @@ import { Image } from 'react-native'; import { ExternalWrapper } from './ExternalWrapper'; -<> - - - - -; + + +; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js index 43589bd0..c1b8e82e 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js @@ -2,20 +2,13 @@ import { NativeImage as _NativeImage } from 'react-native-boost/runtime'; import { Image } from 'react-native'; import { ExternalWrapper } from './ExternalWrapper'; const _imageSource = [ - { - uri: 'safe.png', - width: 16, - height: 16, - }, - ], - _imageSource2 = [ - { - uri: 'unknown.png', - width: 16, - height: 16, - }, - ]; -<> + { + uri: 'unknown.png', + width: 16, + height: 16, + }, +]; + <_NativeImage style={[ { @@ -29,19 +22,4 @@ const _imageSource = [ source={_imageSource} resizeMode="cover" /> - - <_NativeImage - style={[ - { - width: 16, - height: 16, - }, - { - overflow: 'hidden', - }, - ]} - source={_imageSource2} - resizeMode="cover" - /> - -; +; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/unknown-imported-ancestor/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/unknown-imported-ancestor/output.js index 529c6ac6..c4d609d3 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/unknown-imported-ancestor/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/unknown-imported-ancestor/output.js @@ -1,34 +1,11 @@ -import { NativeImage as _NativeImage } from 'react-native-boost/runtime'; import { Image } from 'react-native'; import { ExternalWrapper } from './ExternalWrapper'; -const _imageSource = [ - { - uri: 'safe.png', - width: 16, - height: 16, - }, -]; -<> - <_NativeImage - style={[ - { - width: 16, - height: 16, - }, - { - overflow: 'hidden', - }, - ]} - source={_imageSource} - resizeMode="cover" + + - - - -; +; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/index.test.ts b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/index.test.ts index b8987816..b74540e1 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/index.test.ts +++ b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/index.test.ts @@ -12,7 +12,7 @@ import { nativeImageOptimizer } from '..'; const transformImage = async ( source: string, - platform: TargetPlatform, + platform?: TargetPlatform, { unknownAncestorsDoNotRenderText = false, unistylesEnabled = false, @@ -25,7 +25,7 @@ const transformImage = async ( ): Promise => { const logger = createLogger('silent'); const plugin = (): PluginObj => ({ - name: `${platform}-image-optimizer-test`, + name: `${platform ?? 'unknown'}-image-optimizer-test`, visitor: { JSXOpeningElement(path) { nativeImageOptimizer( @@ -219,9 +219,7 @@ describe('image android output', () => { it.each([ [84, true], [85, false], - [86, false], [87, true], - [88, true], ])('resolves object-source header lifting for RN 0.%i at build time', async (reactNativeMinor, liftsHeaders) => { const output = await transformImage( ` @@ -598,32 +596,6 @@ describe('image unistyles', () => { expect(output).toContain('NativeImage'); }); - it('optimizes an Image without a style in Unistyles mode', async () => { - const output = await transformImage( - ` - import { Image } from 'react-native'; - ; - `, - 'ios', - { unistylesEnabled: true } - ); - - expect(output).toContain('NativeImage'); - }); - - it('optimizes an Image with a plain literal style in Unistyles mode', async () => { - const output = await transformImage( - ` - import { Image } from 'react-native'; - ; - `, - 'ios', - { unistylesEnabled: true } - ); - - expect(output).toContain('NativeImage'); - }); - it('optimizes an Image with a React Native StyleSheet style in Unistyles mode', async () => { const output = await transformImage( ` @@ -641,28 +613,12 @@ describe('image unistyles', () => { describe('image unknown platform output', () => { it('bails because the native Image host prop contract is platform-specific', async () => { - const logger = createLogger('silent'); - const plugin = (): PluginObj => ({ - name: 'unknown-platform-image-optimizer-test', - visitor: { - JSXOpeningElement(path) { - nativeImageOptimizer(path, logger, {}, undefined); - }, - }, - }); - - const output = await formatTestResult( - transformSync( - ` - import { Image } from 'react-native'; - ; - `, - { - configFile: false, - babelrc: false, - plugins: ['@babel/plugin-syntax-jsx', plugin], - } - )!.code! + const output = await transformImage( + ` + import { Image } from 'react-native'; + ; + `, + undefined ); expect(output).not.toContain('NativeImage'); diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/complex-example/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/complex-example/code.js deleted file mode 100644 index 634dec68..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/complex-example/code.js +++ /dev/null @@ -1,18 +0,0 @@ -import { Text } from 'react-native'; - -export default function TextBenchmark(props) { - const optimizedViews = Array.from({ length: props.count }, (_, index) => Nice text); - const unoptimizedViews = Array.from({ length: props.count }, (_, index) => ( - // @boost-ignore - Nice text - )); - - if (props.status === 'pending') return Pending...; - - return ( - - {optimizedViews} - {unoptimizedViews} - - ); -} diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/complex-example/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/complex-example/output.js deleted file mode 100644 index b9b0316f..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/complex-example/output.js +++ /dev/null @@ -1,25 +0,0 @@ -import { Text } from 'react-native'; -export default function TextBenchmark(props) { - const optimizedViews = Array.from( - { - length: props.count, - }, - (_, index) => Nice text - ); - const unoptimizedViews = Array.from( - { - length: props.count, - }, - (_, index) => ( - // @boost-ignore - Nice text - ) - ); - if (props.status === 'pending') return Pending...; - return ( - - {optimizedViews} - {unoptimizedViews} - - ); -} diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/default-props/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/default-props/code.js index 5023b35b..0305d072 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/default-props/code.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/default-props/code.js @@ -1,10 +1,6 @@ import { Text } from 'react-native'; -const someFunction = () => ({}); - Hello; No Scaling; -const unknownProps = someFunction(); -Unknown; const partialProps = { color: 'blue', ellipsizeMode: 'clip' }; Partial props; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/default-props/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/default-props/output.js index 0d0d18f7..a496f6d2 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/default-props/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/default-props/output.js @@ -4,7 +4,6 @@ import { NativeText as _NativeText, } from 'react-native-boost/runtime'; import { Text } from 'react-native'; -const someFunction = () => ({}); <_NativeText style={_getDefaultTextStyle()} allowFontScaling={true} @@ -19,8 +18,6 @@ const someFunction = () => ({}); accessible={_getDefaultTextAccessible()}> No Scaling ; -const unknownProps = someFunction(); -Unknown; const partialProps = { color: 'blue', ellipsizeMode: 'clip', diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-alias-as-child/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-alias-as-child/code.js index e0162d08..41d6d7d7 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-alias-as-child/code.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-alias-as-child/code.js @@ -2,7 +2,6 @@ import { Text } from 'react-native'; import { Link as RouterLink } from 'expo-router'; <> - This should be optimized This should NOT be optimized due to aliased Link asChild diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-alias-as-child/dangerous-output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-alias-as-child/dangerous-output.js index 07ce5026..7c052597 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-alias-as-child/dangerous-output.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-alias-as-child/dangerous-output.js @@ -6,13 +6,6 @@ import { import { Text } from 'react-native'; import { Link as RouterLink } from 'expo-router'; <> - <_NativeText - style={_getDefaultTextStyle()} - allowFontScaling={true} - ellipsizeMode={'tail'} - accessible={_getDefaultTextAccessible()}> - This should be optimized - This should NOT be optimized due to aliased Link asChild diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-alias-as-child/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-alias-as-child/output.js index 942a04d0..783f77bb 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-alias-as-child/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-alias-as-child/output.js @@ -1,18 +1,6 @@ -import { - getDefaultTextStyle as _getDefaultTextStyle, - getDefaultTextAccessible as _getDefaultTextAccessible, - NativeText as _NativeText, -} from 'react-native-boost/runtime'; import { Text } from 'react-native'; import { Link as RouterLink } from 'expo-router'; <> - <_NativeText - style={_getDefaultTextStyle()} - allowFontScaling={true} - ellipsizeMode={'tail'} - accessible={_getDefaultTextAccessible()}> - This should be optimized - This should NOT be optimized due to aliased Link asChild diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child/code.js index 142e7b36..e1afd160 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child/code.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child/code.js @@ -2,14 +2,10 @@ import { Text } from 'react-native'; import { Link } from 'expo-router'; <> - This should be optimized This should NOT be optimized due to Link asChild Direct child of Link without asChild - - This should NOT be optimized (Link with href and asChild) - ; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child/dangerous-output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child/dangerous-output.js index 783ca1cb..d282ad4b 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child/dangerous-output.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child/dangerous-output.js @@ -6,13 +6,6 @@ import { import { Text } from 'react-native'; import { Link } from 'expo-router'; <> - <_NativeText - style={_getDefaultTextStyle()} - allowFontScaling={true} - ellipsizeMode={'tail'} - accessible={_getDefaultTextAccessible()}> - This should be optimized - This should NOT be optimized due to Link asChild @@ -25,7 +18,4 @@ import { Link } from 'expo-router'; Direct child of Link without asChild - - This should NOT be optimized (Link with href and asChild) - ; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child/output.js index 803d7a4e..b3b3ec7f 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/expo-router-link-as-child/output.js @@ -1,25 +1,10 @@ -import { - getDefaultTextStyle as _getDefaultTextStyle, - getDefaultTextAccessible as _getDefaultTextAccessible, - NativeText as _NativeText, -} from 'react-native-boost/runtime'; import { Text } from 'react-native'; import { Link } from 'expo-router'; <> - <_NativeText - style={_getDefaultTextStyle()} - allowFontScaling={true} - ellipsizeMode={'tail'} - accessible={_getDefaultTextAccessible()}> - This should be optimized - This should NOT be optimized due to Link asChild Direct child of Link without asChild - - This should NOT be optimized (Link with href and asChild) - ; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/mixed-children-types/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/mixed-children-types/code.js deleted file mode 100644 index 446fd0ac..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/mixed-children-types/code.js +++ /dev/null @@ -1,6 +0,0 @@ -import { Text } from 'react-native'; -const name = 'John'; -Hello {name}!; - - Click here: -; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/mixed-children-types/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/mixed-children-types/output.js deleted file mode 100644 index f7c455ff..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/mixed-children-types/output.js +++ /dev/null @@ -1,17 +0,0 @@ -import { - getDefaultTextStyle as _getDefaultTextStyle, - getDefaultTextAccessible as _getDefaultTextAccessible, - NativeText as _NativeText, -} from 'react-native-boost/runtime'; -import { Text } from 'react-native'; -const name = 'John'; -<_NativeText - style={_getDefaultTextStyle()} - allowFontScaling={true} - ellipsizeMode={'tail'} - accessible={_getDefaultTextAccessible()}> - Hello {name}! -; - - Click here: -; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/numeric-concat-child/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/numeric-concat-child/code.js deleted file mode 100644 index 47a357d5..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/numeric-concat-child/code.js +++ /dev/null @@ -1,2 +0,0 @@ -import { Text } from 'react-native'; -{1 + 2}; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/numeric-concat-child/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/numeric-concat-child/output.js deleted file mode 100644 index 59815ea0..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/numeric-concat-child/output.js +++ /dev/null @@ -1,13 +0,0 @@ -import { - getDefaultTextStyle as _getDefaultTextStyle, - getDefaultTextAccessible as _getDefaultTextAccessible, - NativeText as _NativeText, -} from 'react-native-boost/runtime'; -import { Text } from 'react-native'; -<_NativeText - style={_getDefaultTextStyle()} - allowFontScaling={true} - ellipsizeMode={'tail'} - accessible={_getDefaultTextAccessible()}> - {1 + 2} -; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/pressables/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/pressables/code.js deleted file mode 100644 index d2788b1d..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/pressables/code.js +++ /dev/null @@ -1,8 +0,0 @@ -import { Text } from 'react-native'; -Hello, world!; - { - console.log('pressed'); - }}> - Hello, world! -; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/pressables/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/pressables/output.js deleted file mode 100644 index d04ae156..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/pressables/output.js +++ /dev/null @@ -1,19 +0,0 @@ -import { - getDefaultTextStyle as _getDefaultTextStyle, - getDefaultTextAccessible as _getDefaultTextAccessible, - NativeText as _NativeText, -} from 'react-native-boost/runtime'; -import { Text } from 'react-native'; -<_NativeText - style={_getDefaultTextStyle()} - allowFontScaling={true} - ellipsizeMode={'tail'} - accessible={_getDefaultTextAccessible()}> - Hello, world! -; - { - console.log('pressed'); - }}> - Hello, world! -; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/two-components/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/two-components/code.js deleted file mode 100644 index 929f7ac4..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/two-components/code.js +++ /dev/null @@ -1,3 +0,0 @@ -import { Text } from 'react-native'; -; -; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/two-components/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/two-components/output.js deleted file mode 100644 index feda20e4..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/two-components/output.js +++ /dev/null @@ -1,17 +0,0 @@ -import { - getDefaultTextStyle as _getDefaultTextStyle, - getDefaultTextAccessible as _getDefaultTextAccessible, - NativeText as _NativeText, -} from 'react-native-boost/runtime'; -import { Text } from 'react-native'; -<_NativeText - style={_getDefaultTextStyle()} - allowFontScaling={true} - ellipsizeMode={'tail'} - accessible={_getDefaultTextAccessible()} -/>; -<_NativeText - style={_getDefaultTextStyle()} - allowFontScaling={true} - ellipsizeMode={'tail'} - accessible={_getDefaultTextAccessible()}>; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/variable-child-no-string/code.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/variable-child-no-string/code.js index ddadb621..45ddfda0 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/variable-child-no-string/code.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/variable-child-no-string/code.js @@ -1,4 +1,3 @@ import { Text } from 'react-native'; -Hello, world!; -const test = Test; -{test}; +const child = ; +{child}; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/variable-child-no-string/output.js b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/variable-child-no-string/output.js index 0eb169cf..45ddfda0 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/variable-child-no-string/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-text/__tests__/fixtures/variable-child-no-string/output.js @@ -1,15 +1,3 @@ -import { - getDefaultTextStyle as _getDefaultTextStyle, - getDefaultTextAccessible as _getDefaultTextAccessible, - NativeText as _NativeText, -} from 'react-native-boost/runtime'; import { Text } from 'react-native'; -<_NativeText - style={_getDefaultTextStyle()} - allowFontScaling={true} - ellipsizeMode={'tail'} - accessible={_getDefaultTextAccessible()}> - Hello, world! -; -const test = Test; -{test}; +const child = ; +{child}; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-no-style/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-no-style/code.js deleted file mode 100644 index 39f20252..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-no-style/code.js +++ /dev/null @@ -1,2 +0,0 @@ -import { View } from 'react-native'; -; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-no-style/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-no-style/output.js deleted file mode 100644 index a027ffa2..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures-unistyles/unistyles-no-style/output.js +++ /dev/null @@ -1,3 +0,0 @@ -import { NativeView as _NativeView } from 'react-native-boost/runtime'; -import { View } from 'react-native'; -<_NativeView />; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessibility-label/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessibility-label/code.js deleted file mode 100644 index 9a4496af..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessibility-label/code.js +++ /dev/null @@ -1,2 +0,0 @@ -import { View } from 'react-native'; -; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessibility-label/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessibility-label/output.js deleted file mode 100644 index 6a4c402b..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessibility-label/output.js +++ /dev/null @@ -1,3 +0,0 @@ -import { NativeView as _NativeView } from 'react-native-boost/runtime'; -import { View } from 'react-native'; -<_NativeView accessibilityLabel="x" />; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessible/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessible/code.js deleted file mode 100644 index 7a8cb132..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessible/code.js +++ /dev/null @@ -1,2 +0,0 @@ -import { View } from 'react-native'; -; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessible/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessible/output.js deleted file mode 100644 index 3b87b94c..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/accessible/output.js +++ /dev/null @@ -1,3 +0,0 @@ -import { NativeView as _NativeView } from 'react-native-boost/runtime'; -import { View } from 'react-native'; -<_NativeView accessible />; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/native-id/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/native-id/code.js deleted file mode 100644 index 3c659857..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/native-id/code.js +++ /dev/null @@ -1,2 +0,0 @@ -import { View } from 'react-native'; -; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/native-id/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/native-id/output.js deleted file mode 100644 index b2ea9b0e..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/native-id/output.js +++ /dev/null @@ -1,3 +0,0 @@ -import { NativeView as _NativeView } from 'react-native-boost/runtime'; -import { View } from 'react-native'; -<_NativeView nativeID="x" />; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style-passthrough/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style-passthrough/code.js index cb5df641..f5213c85 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style-passthrough/code.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style-passthrough/code.js @@ -1,2 +1,9 @@ import { View } from 'react-native'; -; +; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style-passthrough/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style-passthrough/output.js index f5d2750e..b3a8ffec 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style-passthrough/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style-passthrough/output.js @@ -11,4 +11,7 @@ import { View } from 'react-native'; ]} testID="v" pointerEvents="none" + accessible + accessibilityLabel="box" + nativeID="box" />; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style/code.js deleted file mode 100644 index 9e126bc4..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style/code.js +++ /dev/null @@ -1,2 +0,0 @@ -import { View } from 'react-native'; -; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style/output.js deleted file mode 100644 index 7c8c70d9..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/style/output.js +++ /dev/null @@ -1,7 +0,0 @@ -import { NativeView as _NativeView } from 'react-native-boost/runtime'; -import { View } from 'react-native'; -<_NativeView - style={{ - width: 1, - }} -/>; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unknown-imported-ancestor/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unknown-imported-ancestor/code.js index ce4c99fa..9def063a 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unknown-imported-ancestor/code.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unknown-imported-ancestor/code.js @@ -1,12 +1,8 @@ import { View } from 'react-native'; import { ExternalWrapper } from './ExternalWrapper'; -<> + + - + - - - - - -; +; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js index c8df3262..08e1e5ed 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unknown-imported-ancestor/dangerous-output.js @@ -1,13 +1,8 @@ import { NativeView as _NativeView } from 'react-native-boost/runtime'; import { View } from 'react-native'; import { ExternalWrapper } from './ExternalWrapper'; -<> + <_NativeView> - + - - <_NativeView> - - - -; +; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unknown-imported-ancestor/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unknown-imported-ancestor/output.js index 667f4a2b..99f465e1 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unknown-imported-ancestor/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unknown-imported-ancestor/output.js @@ -1,13 +1,7 @@ -import { NativeView as _NativeView } from 'react-native-boost/runtime'; import { View } from 'react-native'; import { ExternalWrapper } from './ExternalWrapper'; -<> - <_NativeView> - - - - - - - -; + + + + +; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unresolvable-spread-props/code.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unresolvable-spread-props/code.js deleted file mode 100644 index ff614bb1..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unresolvable-spread-props/code.js +++ /dev/null @@ -1,8 +0,0 @@ -import { View } from 'react-native'; -function MyComponent(props) { - return ( - - - - ); -} diff --git a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unresolvable-spread-props/output.js b/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unresolvable-spread-props/output.js deleted file mode 100644 index ff614bb1..00000000 --- a/packages/react-native-boost/src/plugin/optimizers/native-view/__tests__/fixtures/unresolvable-spread-props/output.js +++ /dev/null @@ -1,8 +0,0 @@ -import { View } from 'react-native'; -function MyComponent(props) { - return ( - - - - ); -} diff --git a/packages/react-native-boost/src/plugin/utils/__tests__/logger.test.ts b/packages/react-native-boost/src/plugin/utils/__tests__/logger.test.ts index c64960c3..2105536b 100644 --- a/packages/react-native-boost/src/plugin/utils/__tests__/logger.test.ts +++ b/packages/react-native-boost/src/plugin/utils/__tests__/logger.test.ts @@ -46,7 +46,10 @@ describe('logger', () => { logger.warning({ component: 'Text', path, message: 'numberOfLines is invalid' }); logger.forced({ component: 'View', path, reason: 'contains unsupported props' }); - expect(consoleSpy).toHaveBeenCalledTimes(2); + expect(consoleSpy.mock.calls.map(([message]) => String(message))).toEqual([ + expect.stringContaining('numberOfLines is invalid'), + expect.stringContaining('Force-optimized View'), + ]); }); it('disables all logs at the silent level', () => { diff --git a/packages/react-native-boost/src/plugin/utils/common/__tests__/attributes.test.ts b/packages/react-native-boost/src/plugin/utils/common/__tests__/attributes.test.ts index 6bbeebf0..78b62163 100644 --- a/packages/react-native-boost/src/plugin/utils/common/__tests__/attributes.test.ts +++ b/packages/react-native-boost/src/plugin/utils/common/__tests__/attributes.test.ts @@ -37,17 +37,6 @@ describe('buildPropertiesFromAttributes', () => { expect(t.isStringLiteral(property.key, { value: 'aria-label' })).toBe(true); }); - it('preserves source order of the attributes', () => { - const node = buildPropertiesFromAttributes([ - attribute('a', t.stringLiteral('1')), - attribute('b', t.stringLiteral('2')), - ]); - const keys = ((node as t.ObjectExpression).properties as t.ObjectProperty[]).map( - (property) => (property.key as t.Identifier).name - ); - expect(keys).toEqual(['a', 'b']); - }); - it('returns an Object.assign call when any attribute is a spread', () => { const node = buildPropertiesFromAttributes([ spread('props'), diff --git a/packages/react-native-boost/src/runtime/__tests__/index.test.ts b/packages/react-native-boost/src/runtime/__tests__/index.test.ts index f2d8e5db..06eb9cf3 100644 --- a/packages/react-native-boost/src/runtime/__tests__/index.test.ts +++ b/packages/react-native-boost/src/runtime/__tests__/index.test.ts @@ -8,12 +8,9 @@ import { processImageSourceProps, getDefaultTextAccessible, clampNumberOfLines, - userSelectToSelectableMap, - verticalAlignToTextAlignVerticalMap, processActivityIndicatorSize, processActivityIndicatorStyle, resolveActivityIndicatorDefault, - activityIndicatorStyles, } from '..'; import { Platform, StyleSheet, TextStyle } from 'react-native'; @@ -123,7 +120,7 @@ describe('processTextStyle', () => { const style = { userSelect: 'none', color: 'blue' } as const; const result = processTextStyle(style); const resultStyle = StyleSheet.flatten(result.style) as TextStyle; - expect(result.selectable).toBe(userSelectToSelectableMap['none']); + expect(result.selectable).toBe(false); expect(resultStyle.userSelect).toBeUndefined(); expect(resultStyle.color).toBe('blue'); }); @@ -131,7 +128,7 @@ describe('processTextStyle', () => { it('maps verticalAlign to textAlignVertical and removes verticalAlign from style', () => { const style = { verticalAlign: 'top', fontSize: 16 } as const; const result = StyleSheet.flatten(processTextStyle(style).style) as TextStyle; - expect(result.textAlignVertical).toBe(verticalAlignToTextAlignVerticalMap['top']); + expect(result.textAlignVertical).toBe('top'); expect(result.verticalAlign).toBeUndefined(); }); @@ -145,8 +142,8 @@ describe('processTextStyle', () => { const result = processTextStyle(style); const resultStyle = StyleSheet.flatten(result.style) as TextStyle; expect(resultStyle.fontWeight).toBe('700'); - expect(result.selectable).toBe(userSelectToSelectableMap['auto']); - expect(resultStyle.textAlignVertical).toBe(verticalAlignToTextAlignVerticalMap['middle']); + expect(result.selectable).toBe(true); + expect(resultStyle.textAlignVertical).toBe('center'); expect(resultStyle.margin).toBe(10); expect(resultStyle.userSelect).toBeUndefined(); expect(resultStyle.verticalAlign).toBeUndefined(); @@ -162,10 +159,12 @@ describe('ActivityIndicator helpers', () => { }); it('resolves built-in and numeric sizes', () => { - expect(processActivityIndicatorSize()).toEqual({ style: activityIndicatorStyles.small, size: 'small' }); - expect(processActivityIndicatorSize().style).toBe(activityIndicatorStyles.small); - expect(processActivityIndicatorSize('large')).toEqual({ style: activityIndicatorStyles.large, size: 'large' }); - expect(processActivityIndicatorSize('large').style).toBe(activityIndicatorStyles.large); + const small = processActivityIndicatorSize(); + const large = processActivityIndicatorSize('large'); + expect(small).toEqual({ style: { width: 20, height: 20 }, size: 'small' }); + expect(processActivityIndicatorSize()).toBe(small); + expect(large).toEqual({ style: { width: 36, height: 36 }, size: 'large' }); + expect(processActivityIndicatorSize('large')).toBe(large); expect(processActivityIndicatorSize(24)).toEqual({ style: { height: 24, width: 24 }, size: undefined }); expect(processActivityIndicatorSize(null as never)).toEqual({ style: { height: null, width: null }, @@ -185,7 +184,6 @@ describe('ActivityIndicator helpers', () => { describe('processSelectionColor', () => { it('omits the prop for null/undefined input', () => { expect(processSelectionColor(null)).toEqual({}); - expect(processSelectionColor(undefined)).toEqual({}); expect(processSelectionColor()).toEqual({}); }); @@ -217,15 +215,15 @@ describe('getDefaultTextAccessible', () => { describe('getDefaultTextStyle follows the installed RN version', () => { afterEach(restorePlatformMock); - it.each([83, 84])('returns no default on RN 0.%i', async (minor) => { - const runtime = await loadRuntime(minor); + it('returns no default before RN 0.85', async () => { + const runtime = await loadRuntime(84); expect(runtime.getDefaultTextStyle()).toBeUndefined(); expect(runtime.processTextStyle({ color: 'red' })).toEqual({ style: { color: 'red' } }); expect(runtime.processTextStyle(null)).toEqual({}); }); - it.each([85, 86, 87])('prepends overflow hidden on RN 0.%i', async (minor) => { - const runtime = await loadRuntime(minor); + it('prepends overflow hidden from RN 0.85', async () => { + const runtime = await loadRuntime(85); expect(runtime.getDefaultTextStyle()).toEqual({ overflow: 'hidden' }); expect(runtime.processTextStyle({ color: 'red' })).toEqual({ style: [{ overflow: 'hidden' }, { color: 'red' }], @@ -246,13 +244,6 @@ describe('getDefaultTextStyle follows the installed RN version', () => { const runtime = await loadRuntime(undefined); expect(runtime.getDefaultTextStyle()).toEqual({ overflow: 'hidden' }); }); - - it('keeps the user overflow value', async () => { - const runtime = await loadRuntime(86); - expect(StyleSheet.flatten([runtime.getDefaultTextStyle(), { overflow: 'visible' }])).toEqual({ - overflow: 'visible', - }); - }); }); describe('processTextAccessibilityProps', () => { @@ -690,7 +681,7 @@ describe('processImageSourceProps', () => { describe('object-source headers follow the installed RN version', () => { afterEach(restorePlatformMock); - it.each([83, 84, 87, 88])('lifts them on RN 0.%i', async (minor) => { + it.each([84, 87])('lifts them on RN 0.%i', async (minor) => { const runtime = await loadRuntime(minor); const source = { uri: 'logo.png', headers: { Authorization: 'Bearer object' } }; expect(runtime.processImageSourceProps({ source }).headers).toEqual({ Authorization: 'Bearer object' }); @@ -699,8 +690,8 @@ describe('processImageSourceProps', () => { }); }); - it.each([85, 86])('drops them on RN 0.%i, matching the wrapper of that version', async (minor) => { - const runtime = await loadRuntime(minor); + it('drops them on RN 0.85, matching the wrapper of that version', async () => { + const runtime = await loadRuntime(85); const source = { uri: 'logo.png', headers: { Authorization: 'Bearer object' } }; expect('headers' in runtime.processImageSourceProps({ source })).toBe(false); expect(runtime.processImageObjectSourceHeaders({ Authorization: 'Bearer object' })).toBeUndefined(); @@ -714,8 +705,8 @@ describe('processImageSourceProps', () => { }); // An ARRAY source's `source[0].headers` is lifted by every supported version, gate or not. - it.each([84, 86, 87])('always lifts array-source headers on RN 0.%i', async (minor) => { - const runtime = await loadRuntime(minor); + it('always lifts array-source headers', async () => { + const runtime = await loadRuntime(86); expect( runtime.processImageSourceProps({ source: [{ uri: 'logo.png', headers: { Authorization: 'Bearer first' } }] }) .headers @@ -730,14 +721,14 @@ describe('processImageSourceProps', () => { const source = [{ uri: 'logo.png', width: 16, height: 8 }]; - it.each([83, 84])('does not propagate on RN 0.%i', async (minor) => { - const runtime = await loadRuntime(minor); + it('does not propagate before RN 0.85', async () => { + const runtime = await loadRuntime(84); expect(runtime.processImageSourceProps({ source }).style).toEqual([false, { overflow: 'hidden' }, undefined]); expect(runtime.processImageArraySourceDimensions({ width: 16, height: 8 })).toBeUndefined(); }); - it.each([85, 86, 87])('propagates on RN 0.%i', async (minor) => { - const runtime = await loadRuntime(minor); + it('propagates from RN 0.85', async () => { + const runtime = await loadRuntime(85); expect(runtime.processImageSourceProps({ source }).style).toEqual([ { width: 16, height: 8 }, { overflow: 'hidden' }, @@ -762,7 +753,6 @@ describe('processImageSourceProps', () => { describe('clampNumberOfLines', () => { it('clamps negative values to 0', () => { expect(clampNumberOfLines(-1)).toBe(0); - expect(clampNumberOfLines(-10)).toBe(0); }); it('clamps NaN to 0 (RN uses !(value >= 0))', () => { diff --git a/tooling/benchmark/src/report/__tests__/analysis.test.ts b/tooling/benchmark/src/report/__tests__/analysis.test.ts index 2209edb9..b1e4f84e 100644 --- a/tooling/benchmark/src/report/__tests__/analysis.test.ts +++ b/tooling/benchmark/src/report/__tests__/analysis.test.ts @@ -7,8 +7,6 @@ import { convergencePoints, coreValidAt, fpsAt, - hasProfile, - isThermalRun, median, peakBoostGain, peakCoreGain, @@ -58,7 +56,6 @@ const twoProfile = (coreScale: number): FpsResult => describe('anchoredCore', () => { it('is undefined without both profiles (single-profile / legacy run)', () => { const legacy = result([m(100, 'default', 'off', 40), m(100, 'default', 'on', 60)]); - expect(hasProfile(legacy, 'core')).toBe(false); expect(anchoredCore(legacy)).toBeUndefined(); expect(peakCoreGain(legacy)).toBeUndefined(); expect(peakBoostGain(legacy)).toBeCloseTo(50); // (60-40)/40 @@ -145,10 +142,9 @@ describe('regime: thermal (direct) vs legacy (anchor)', () => { m(300, 'default', 'off', 30, 0, 'nominal'), m(300, 'default', 'on', 60, 0, 'nominal'), m(300, 'core', 'off', 42, 0, 'nominal'), - m(300, 'core', 'on', 60, 0, 'nominal'), // agrees with default_on โ†’ load 300 is validated + m(300, 'core', 'on', 57, 0, 'nominal'), // 5% divergence stays within validation tolerance ]); - expect(isThermalRun(r)).toBe(true); - expect(peakCoreGain(r)).toBeCloseTo(40); // (42-30)/30 direct, no anchor + expect(peakCoreGain(r)).toBeCloseTo(40); // direct; anchoring would produce about 47% }); it('legacy run (all-unknown thermal) โ†’ anchored core gain', () => { @@ -158,7 +154,6 @@ describe('regime: thermal (direct) vs legacy (anchor)', () => { m(300, 'core', 'off', 42, 0, 'unknown'), m(300, 'core', 'on', 50, 0, 'unknown'), // anchor ร—60/50=1.2 โ†’ 42 lifts to 50.4 โ†’ +68% ]); - expect(isThermalRun(r)).toBe(false); expect(peakCoreGain(r)).toBeCloseTo(68); }); }); @@ -173,11 +168,11 @@ describe('convergencePoints', () => { m(100, 'default', 'off', 40), m(100, 'default', 'on', 60), m(100, 'core', 'off', 44), - m(100, 'core', 'on', 60), + m(100, 'core', 'on', 57), ]); const points = convergencePoints(r)!; const heavy = points.find((p) => p.load === 100)!; - expect(heavy.baselineOptimized).toBeCloseTo(44); // direct median, not anchored + expect(heavy.baselineOptimized).toBeCloseTo(44); // direct; anchoring would produce about 46 expect(heavy.informative).toBe(true); expect(points.find((p) => p.load === 10)!.informative).toBe(false); // pinned at ceiling }); @@ -194,7 +189,6 @@ describe('validate (per-load)', () => { ]) ); expect(report.allValid).toBe(true); - expect(report.invalidLoads.size).toBe(0); }); it('drops a load with a capture above the floor', () => { From dad4fb522bce1b54b758046714a0b395008726f4 Mon Sep 17 00:00:00 2001 From: Maximilian Krause Date: Thu, 3 Sep 2026 17:43:40 +0200 Subject: [PATCH 13/56] refactor(plugin): use optimizer context object instead of positional args --- packages/react-native-boost/src/plugin/index.ts | 12 +++++------- .../native-activity-indicator/index.ts | 2 +- .../native-image/__tests__/index.test.ts | 9 ++++----- .../src/plugin/optimizers/native-image/index.ts | 6 +----- .../src/plugin/optimizers/native-text/index.ts | 5 ++++- .../src/plugin/optimizers/native-view/index.ts | 2 +- .../src/plugin/types/index.ts | 17 +++++++++-------- .../src/plugin/utils/generate-test-plugin.ts | 7 ++++++- 8 files changed, 31 insertions(+), 29 deletions(-) diff --git a/packages/react-native-boost/src/plugin/index.ts b/packages/react-native-boost/src/plugin/index.ts index f074d6bc..10ef4c85 100644 --- a/packages/react-native-boost/src/plugin/index.ts +++ b/packages/react-native-boost/src/plugin/index.ts @@ -111,14 +111,12 @@ export default declare((api, rawOptions, dirname?: string) => { if (isIgnoredFile(path, options.ignores ?? [])) return; const file = (path.hub as unknown as { file: HubFile }).file; const reactNativeMinor = resolveReactNativeMinor(file); - if (isOptimizationEnabled(options, 'native-text')) - nativeTextOptimizer(path, logger, options, platform, unistylesEnabled, reactNativeMinor); - if (isOptimizationEnabled(options, 'native-view')) - nativeViewOptimizer(path, logger, options, platform, unistylesEnabled); - if (isOptimizationEnabled(options, 'native-image')) - nativeImageOptimizer(path, logger, options, platform, unistylesEnabled, reactNativeMinor); + const context = { logger, options, platform, unistylesEnabled, reactNativeMinor }; + if (isOptimizationEnabled(options, 'native-text')) nativeTextOptimizer(path, context); + if (isOptimizationEnabled(options, 'native-view')) nativeViewOptimizer(path, context); + if (isOptimizationEnabled(options, 'native-image')) nativeImageOptimizer(path, context); if (isOptimizationEnabled(options, 'native-activity-indicator')) - nativeActivityIndicatorOptimizer(path, logger, options, platform, unistylesEnabled); + nativeActivityIndicatorOptimizer(path, context); }, }, }; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-activity-indicator/index.ts b/packages/react-native-boost/src/plugin/optimizers/native-activity-indicator/index.ts index e4b3a309..5ad666a9 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-activity-indicator/index.ts +++ b/packages/react-native-boost/src/plugin/optimizers/native-activity-indicator/index.ts @@ -26,7 +26,7 @@ const CONSUMED_PROPS = new Set([ 'style', ]); -export const nativeActivityIndicatorOptimizer: Optimizer = (path, logger, options, platform, unistylesEnabled) => { +export const nativeActivityIndicatorOptimizer: Optimizer = (path, { logger, options, platform, unistylesEnabled }) => { if (platform === 'web') return; if (!isReactNativeComponent(path, 'ActivityIndicator')) return; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/index.test.ts b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/index.test.ts index b74540e1..f9422750 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/index.test.ts +++ b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/index.test.ts @@ -28,14 +28,13 @@ const transformImage = async ( name: `${platform ?? 'unknown'}-image-optimizer-test`, visitor: { JSXOpeningElement(path) { - nativeImageOptimizer( - path, + nativeImageOptimizer(path, { logger, - { assumptions: { unknownAncestorsDoNotRenderText } }, + options: { assumptions: { unknownAncestorsDoNotRenderText } }, platform, unistylesEnabled, - reactNativeMinor ?? undefined - ); + reactNativeMinor: reactNativeMinor ?? undefined, + }); }, }, }); diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/index.ts b/packages/react-native-boost/src/plugin/optimizers/native-image/index.ts index 266ec716..fd3929d0 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-image/index.ts +++ b/packages/react-native-boost/src/plugin/optimizers/native-image/index.ts @@ -84,11 +84,7 @@ const OBJECT_FIT_TO_RESIZE_MODE: Record = { export const nativeImageOptimizer: Optimizer = ( path, - logger, - options, - platform, - unistylesEnabled, - reactNativeMinor + { logger, options, platform, unistylesEnabled, reactNativeMinor } ) => { if (platform === 'web') return; if (!isReactNativeComponent(path, 'Image')) return; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-text/index.ts b/packages/react-native-boost/src/plugin/optimizers/native-text/index.ts index 0dbd5463..b29c7810 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-text/index.ts +++ b/packages/react-native-boost/src/plugin/optimizers/native-text/index.ts @@ -84,7 +84,10 @@ const TEXT_SPREAD_GUARD_KEYS = new Set([ const isNormalizedProperty = (attribute: t.JSXAttribute | t.JSXSpreadAttribute): attribute is t.JSXAttribute => t.isJSXAttribute(attribute) && t.isJSXIdentifier(attribute.name) && NORMALIZED_PROPERTIES.has(attribute.name.name); -export const nativeTextOptimizer: Optimizer = (path, logger, options, platform, unistylesEnabled, reactNativeMinor) => { +export const nativeTextOptimizer: Optimizer = ( + path, + { logger, options, platform, unistylesEnabled, reactNativeMinor } +) => { if (!isReactNativeComponent(path, 'Text')) return; const parent = path.parent as t.JSXElement; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-view/index.ts b/packages/react-native-boost/src/plugin/optimizers/native-view/index.ts index a0d61f56..548262d2 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-view/index.ts +++ b/packages/react-native-boost/src/plugin/optimizers/native-view/index.ts @@ -56,7 +56,7 @@ const VIEW_SPREAD_GUARD_KEYS_UNISTYLES = new Set([...VIEW_SPREAD_GUARD_KEYS, 'st const ARIA_STATE_PROPERTIES = new Set(['aria-busy', 'aria-checked', 'aria-disabled', 'aria-expanded', 'aria-selected']); const ARIA_VALUE_PROPERTIES = new Set(['aria-valuemax', 'aria-valuemin', 'aria-valuenow', 'aria-valuetext']); -export const nativeViewOptimizer: Optimizer = (path, logger, options, _platform, unistylesEnabled) => { +export const nativeViewOptimizer: Optimizer = (path, { logger, options, unistylesEnabled }) => { if (!isReactNativeComponent(path, 'View')) return; const forced = isForcedLine(path); diff --git a/packages/react-native-boost/src/plugin/types/index.ts b/packages/react-native-boost/src/plugin/types/index.ts index f670ae24..0682092f 100644 --- a/packages/react-native-boost/src/plugin/types/index.ts +++ b/packages/react-native-boost/src/plugin/types/index.ts @@ -110,21 +110,22 @@ export interface PluginLogger { warning: (payload: WarningLogPayload) => void; } -export type Optimizer = ( - path: NodePath, - logger: PluginLogger, - options?: BoostOptions, +export interface OptimizerContext { + logger: PluginLogger; + options: BoostOptions; /** Target platform from Babel's caller (e.g. Metro sets `'ios'`/`'android'`). Lets optimizers resolve platform-specific defaults at build time. */ - platform?: TargetPlatform, + platform?: TargetPlatform; /** * Whether "Unistyles mode" is active for this build (resolved once at plugin init from the integration * setting and install auto-detection). When `true`, optimizers classify each element's `style` origin and * route Unistyles styles to Unistyles' lean host instead of Boost's raw host. */ - unistylesEnabled?: boolean, + unistylesEnabled: boolean; /** Installed React Native minor version, when it can be resolved at build time. */ - reactNativeMinor?: number -) => void; + reactNativeMinor?: number; +} + +export type Optimizer = (path: NodePath, context: OptimizerContext) => void; export type HubFile = t.File & { opts: { diff --git a/packages/react-native-boost/src/plugin/utils/generate-test-plugin.ts b/packages/react-native-boost/src/plugin/utils/generate-test-plugin.ts index f8386ea9..aff36754 100644 --- a/packages/react-native-boost/src/plugin/utils/generate-test-plugin.ts +++ b/packages/react-native-boost/src/plugin/utils/generate-test-plugin.ts @@ -13,7 +13,12 @@ export const generateTestPlugin = (optimizer: Optimizer, options: BoostOptions = visitor: { JSXOpeningElement(path) { // Auto-detection is not exercised in fixtures. - optimizer(path, logger, options, platform, options.integrations?.unistyles === 'on'); + optimizer(path, { + logger, + options, + platform, + unistylesEnabled: options.integrations?.unistyles === 'on', + }); }, }, }; From c70e9ce7b12605346ce1f959aa3c5832b16c7b3f Mon Sep 17 00:00:00 2001 From: Maximilian Krause Date: Thu, 3 Sep 2026 19:20:47 +0200 Subject: [PATCH 14/56] feat(static-animated): remove wrappers without animated values --- .../docs/configuration/boost-decorator.mdx | 7 +- apps/docs/content/docs/index.mdx | 2 +- .../content/docs/information/how-it-works.mdx | 14 +- .../information/optimization-coverage.mdx | 139 ------------ .../docs/information/troubleshooting.mdx | 6 +- apps/docs/content/docs/meta.json | 8 +- apps/docs/content/docs/optimizers/index.mdx | 45 ++++ .../optimizers/native-activity-indicator.mdx | 36 ++++ .../content/docs/optimizers/native-image.mdx | 35 +++ .../content/docs/optimizers/native-text.mdx | 47 ++++ .../content/docs/optimizers/native-view.mdx | 43 ++++ .../docs/optimizers/static-animated.mdx | 70 ++++++ apps/docs/next.config.mjs | 9 + .../src/plugin/__tests__/parity/boost.ts | 3 +- .../parity/mocks/NativeAnimatedHelper.ts | 14 ++ .../parity/mocks/ReactNativeFeatureFlags.ts | 6 + .../mocks/ReactNativePrivateInterface.ts | 1 + .../__tests__/parity/mocks/RendererProxy.ts | 1 + .../__tests__/parity/mocks/react-native.ts | 1 + .../plugin/__tests__/parity/parity.test.ts | 13 ++ .../__tests__/parity/vitest.config.parity.mts | 3 + .../src/plugin/__tests__/parity/wrapper.ts | 4 + .../react-native-boost/src/plugin/index.ts | 11 +- .../static-animated/__tests__/index.test.ts | 149 +++++++++++++ .../optimizers/static-animated/index.ts | 202 ++++++++++++++++++ .../src/plugin/types/index.ts | 12 +- .../plugin/utils/__tests__/options.test.ts | 2 +- .../src/plugin/utils/common/attributes.ts | 70 +++--- .../src/plugin/utils/common/base.ts | 14 +- .../src/plugin/utils/common/optimized-host.ts | 24 +-- .../src/plugin/utils/common/validation.ts | 10 +- .../src/plugin/utils/options.ts | 2 +- 32 files changed, 775 insertions(+), 228 deletions(-) delete mode 100644 apps/docs/content/docs/information/optimization-coverage.mdx create mode 100644 apps/docs/content/docs/optimizers/index.mdx create mode 100644 apps/docs/content/docs/optimizers/native-activity-indicator.mdx create mode 100644 apps/docs/content/docs/optimizers/native-image.mdx create mode 100644 apps/docs/content/docs/optimizers/native-text.mdx create mode 100644 apps/docs/content/docs/optimizers/native-view.mdx create mode 100644 apps/docs/content/docs/optimizers/static-animated.mdx create mode 100644 packages/react-native-boost/src/plugin/__tests__/parity/mocks/NativeAnimatedHelper.ts create mode 100644 packages/react-native-boost/src/plugin/__tests__/parity/mocks/ReactNativePrivateInterface.ts create mode 100644 packages/react-native-boost/src/plugin/__tests__/parity/mocks/RendererProxy.ts create mode 100644 packages/react-native-boost/src/plugin/optimizers/static-animated/__tests__/index.test.ts create mode 100644 packages/react-native-boost/src/plugin/optimizers/static-animated/index.ts diff --git a/apps/docs/content/docs/configuration/boost-decorator.mdx b/apps/docs/content/docs/configuration/boost-decorator.mdx index 969eb5a2..a709488a 100644 --- a/apps/docs/content/docs/configuration/boost-decorator.mdx +++ b/apps/docs/content/docs/configuration/boost-decorator.mdx @@ -17,9 +17,9 @@ If a line containing `@boost-ignore` appears immediately before a JSX opening ta ## @boost-force -Use `@boost-force` to force optimization on a specific element, even if it would normally be skipped by a bailout rule (e.g. blacklisted props, unresolvable spreads, or ancestor checks). +Use `@boost-force` to override supported bailout rules on a specific element, such as an unknown ancestor or an unresolved spread. -The only check that `@boost-force` does **not** override is the `react-native` import check โ€” the component must still be imported from `react-native`. +It does not override the `react-native` import check or hard checks that would always change behavior. ```jsx const Component = ({ props }) => { @@ -31,6 +31,5 @@ const Component = ({ props }) => { ``` - `@boost-force` bypasses safety checks that exist to prevent behavioral changes. - Only use it when you are confident that the optimization is safe for your specific use case. + `@boost-force` can bypass safety checks that prevent behavioral changes. Only use it when you have verified that the optimization is safe. diff --git a/apps/docs/content/docs/index.mdx b/apps/docs/content/docs/index.mdx index ad1a0d77..6e29d990 100644 --- a/apps/docs/content/docs/index.mdx +++ b/apps/docs/content/docs/index.mdx @@ -124,7 +124,7 @@ React Native Boost supports all platforms. Optimizations are performed on iOS an - + diff --git a/apps/docs/content/docs/information/how-it-works.mdx b/apps/docs/content/docs/information/how-it-works.mdx index 20fdc986..a0caa6eb 100644 --- a/apps/docs/content/docs/information/how-it-works.mdx +++ b/apps/docs/content/docs/information/how-it-works.mdx @@ -3,15 +3,15 @@ title: How It Works description: Why React Native Boost makes your app faster (the short version). --- -In React Native, `Text`, `View`, `Image`, and `ActivityIndicator` aren't quite what they appear to be. They look like basic building blocks, but each one runs JavaScript components **every time it renders**, wrapping lower-level native components underneath. +In React Native, `Text`, `View`, `Image`, and `ActivityIndicator` aren't quite what they appear to be. They look like basic building blocks, but each one runs JavaScript components **every time it renders**, wrapping lower-level native components underneath. `Animated` components add another JavaScript wrapper. -That wrapper is genuinely useful. It handles edge cases and powers conveniences such as accessibility props, style normalization, and Image source processing. But many elements do not need that runtime work, so the wrapper becomes pure overhead. On a busy screen with hundreds of these components, that overhead adds up and starts costing you frames. +These wrappers are genuinely useful. They handle edge cases and power conveniences such as accessibility props, style normalization, Image source processing, and animations. But many elements do not need all that runtime work, so a wrapper can become pure overhead. On a busy screen with hundreds of these components, that overhead adds up and starts costing you frames. React Native Boost removes the wrapper when it isn't needed. ## The one-sentence version -At build time, Boost rewrites `Text`, `View`, `Image`, and `ActivityIndicator` elements into the native output they were going to render anyway. The work the wrapper used to repeat on every render is either gone completely, or moved from the user's device to build-time. +At build time, Boost rewrites supported elements into the output they were going to render anyway. It can also remove an `Animated` wrapper when the element contains no animation. The work that wrappers used to repeat on every render is either gone or moved from the user's device to build time. ## A quick before and after @@ -29,7 +29,7 @@ These optimized components are imported from `react-native-boost/runtime` rather ## Only when it's safe -Boost never changes how your app looks or behaves. It rewrites a component only when it can **prove** that doing so is safe. For each supported component it checks a lot of things. For example: +By default, Boost rewrites a component only when it can **prove** that doing so is safe. For each supported component it checks a lot of things. For example: - Is this really the `react-native` component, or some other `Text` from another library? - Are its props fully compatible with the underlying native component? @@ -44,9 +44,9 @@ If any check fails, Boost leaves that component exactly as it was. The bias is s description="The wrapper tax, the full call graph, the plugin internals, and the safety proofs in detail." /> - Files skipped via `ignores` are filtered before optimizer checks, so you will not see per-component skip logs for - those files. - - -## Overriding Bailouts - -Use `@boost-force` to force optimization on a component that would otherwise be skipped. This bypasses all bailout checks except the `react-native` import check. See the [Decorators](/docs/configuration/boost-decorator#boost-force) page for details. - -Set `assumptions.unknownAncestorsDoNotRenderText` to `true` to optimize components under unknown ancestors or runtime parents across the project. This can produce the wrong native host if one provides a `Text` context. - -## Text Coverage - -`Text` is optimized when all checks pass. - -### Text blacklisted props - -If any of these are present, the `Text` node is skipped: - -- Interaction/responder props (`onPress`, `onLongPress`, `onResponder*`, `pressRetentionOffset`, `suppressHighlighting`, etc.) -- `selectionColor` -- `aria-hidden` - -`id` is renamed to `nativeID` at build time (`id` wins when both are present). `Text` bails only if `id`/`nativeID` arrive via a spread, or a dynamic `id` appears alongside a `nativeID`. - -### Text structure checks - -- Children must be provably primitive (resolve to a `string` or `number`). Anything that could be a React element (nested elements, function calls, unresolved identifiers) bails as `contains non-primitive children`. - -### Text ancestor safety checks - -Like `View`, `Text` optimization depends on ancestor classification: - -- `safe`: optimize -- `text`: skip (`has Text ancestor`) โ€” a `Text` nested in another `Text` renders as the inline `NativeVirtualText` host (`RCTVirtualText`), not `NativeText` (`RCTText`), so optimizing it would emit the wrong host. -- `unknown`: skip by default - -A root `Text` returned by a component or renderer also skips as `has unresolved runtime parent that may render Text`. Its caller can mount it inside another `Text`, which requires `NativeVirtualText` instead of `NativeText`. - -The project-wide unknown ancestor assumption can optimize these cases. A false assumption can introduce regressions. For example, `expo-router`'s `Link` wraps its children in a `Text` by default. A `Text` under that `Link` must render as `NativeVirtualText`. - -A `Text` used as a direct child of `expo-router` `Link` with `asChild` is **always** skipped -(`is a direct child of expo-router Link with asChild`), even when the assumption is enabled, because `Link` makes that child -pressable. - -```tsx -import { Link } from 'expo-router'; -import { Text } from 'react-native'; - - - Open profile -; -``` - -## View Coverage - -`View` and `Text` share the same ancestor safety checks. The `View` wrapper translates a few ergonomic props into -native equivalents; Boost reproduces each translation at build time (or via a small runtime helper for dynamic values), -so these props no longer force a bailout. - -### View translated props - -- `aria-*` โ†’ `accessibility*` (`aria-label`, `aria-labelledby`, `aria-live`, `aria-hidden`, and the state/value groups) -- `tabIndex` โ†’ `focusable` -- `id` โ†’ `nativeID` (`id` wins when both are present) - -Everything else โ€” including `accessible`, `accessibilityLabel`, and a lone `accessibilityState`/`accessibilityValue` โ€” -is passed through unchanged. - -### View prop bailouts - -- A spread that may carry one of the translated props, since Boost cannot reach inside it to translate. -- A dynamic `id` alongside a `nativeID` (their runtime precedence cannot be resolved statically). - -### Ancestor safety checks - -`View` optimization depends on ancestor classification: - -- `safe`: optimize -- `text`: skip (`has Text ancestor`) -- `unknown`: skip by default - -The project-wide unknown ancestor assumption can optimize this case. A false assumption can introduce regressions if an unresolved ancestor renders a `Text` around its children. - -## Image Coverage - -The `Image` optimizer rewrites supported `Image` elements when the target platform is known (`ios` or `android`) and the -source/style/accessibility props can be reproduced safely. - -A static `srcSet` is parsed at build time for the installed React Native version. An optional static `src` supplies the -1x fallback. Boost skips this optimization when it cannot detect React Native. Dynamic or malformed sets, sets used with `source`, spreads, dynamic dimensions, -and sets with dynamic styles stay on the React Native wrapper path. - -In Unistyles mode, an Image is skipped when its `style` is (or may be) a Unistyles style. - -## ActivityIndicator Coverage - -The `ActivityIndicator` optimizer replaces the wrapper tree with the same outer native `View` and platform spinner host. It resolves static defaults, built-in or numeric sizes, and static style composition at build time. Dynamic direct props use small runtime helpers. - -It skips elements with spreads, children, impure prop expressions, Unistyles styles, or an unsafe ancestor chain. A spread can change the wrapper's prop precedence. An impure expression could run in a different order after one component expands into two hosts. These cases stay on the React Native wrapper. - -The project-wide unknown ancestor assumption can optimize unknown ancestors. This has the same `Text`-ancestor risk as the other host-component optimizations. - -## Spread Props: Resolvable vs Unresolvable - -Unresolvable spread props are treated as unsafe and cause bailouts. - -```tsx -// Usually optimizable (resolvable object literal) -Hello - -// Usually skipped (cannot be statically resolved) -Hello -``` - -Same rule applies to `View`. diff --git a/apps/docs/content/docs/information/troubleshooting.mdx b/apps/docs/content/docs/information/troubleshooting.mdx index 07440b56..43a7edd3 100644 --- a/apps/docs/content/docs/information/troubleshooting.mdx +++ b/apps/docs/content/docs/information/troubleshooting.mdx @@ -8,7 +8,7 @@ description: Common setup and optimization issues, plus fast ways to diagnose th 1. Set `logLevel: 'debug'` in the Metro configuration. 2. Restart Metro with cache clear. 3. Check skip reasons in logs. -4. Compare with the coverage rules in [Optimization Coverage](/docs/information/optimization-coverage). +4. Compare the message with the relevant [optimizer page](/docs/optimizers). ## Common Issues @@ -34,9 +34,7 @@ npm start -- --clear ### Skip reason: `contains blacklisted props` -This is expected for unsupported prop sets, e.g. a `Text` with press/responder props, `selectionColor`, or -`aria-hidden`. (`View` translates accessibility props, `tabIndex`, and `id` instead of skipping; see -[Optimization Coverage](/docs/information/optimization-coverage#view-coverage).) +This is expected for a `Text` with press or responder props. The native text host does not provide the wrapper behavior these props need. `View` can translate its accessibility props, `tabIndex`, and `id`; see the [Native View optimizer](/docs/optimizers/native-view). Fix options: diff --git a/apps/docs/content/docs/meta.json b/apps/docs/content/docs/meta.json index 57ac39d8..9b359e9f 100644 --- a/apps/docs/content/docs/meta.json +++ b/apps/docs/content/docs/meta.json @@ -7,9 +7,15 @@ "---Information---", "information/how-it-works", "information/deep-dive", - "information/optimization-coverage", "information/troubleshooting", "information/benchmarks", + "---Optimizers---", + "optimizers/index", + "optimizers/native-text", + "optimizers/native-view", + "optimizers/native-image", + "optimizers/native-activity-indicator", + "optimizers/static-animated", "---Configuration---", "configuration/configure", "configuration/non-metro", diff --git a/apps/docs/content/docs/optimizers/index.mdx b/apps/docs/content/docs/optimizers/index.mdx new file mode 100644 index 00000000..106ee9a8 --- /dev/null +++ b/apps/docs/content/docs/optimizers/index.mdx @@ -0,0 +1,45 @@ +--- +title: Overview +description: What React Native Boost can optimize and the cases it safely skips. +--- + +React Native Boost includes different optimizers that optimize different parts of your app. Every optimizer runs at build time and leaves your code unchanged when it cannot prove that a rewrite is safe. + + + + + + + + + +## Shared component safety rules + +When optimizing a component, all optimizers first confirm that the component comes from `react-native`. A component from another package, or a local component with the same name, is not changed. + +Boost also skips a component when: + +- Its file matches an [`ignores`](/docs/configuration/configure#plugin-options-ignores) pattern. +- Its line has [`@boost-ignore`](/docs/configuration/boost-decorator#boost-ignore). +- Required information is only available at runtime. + +Set `logLevel: 'debug'` to see why a component was skipped. + +## Controlling optimizers + +Most optimizers are enabled by default. Exceptions are: + +- The [Static Animated optimizer](./static-animated) is enabled by default only for React Native 0.83 through 0.86. + +You can turn each optimizer on or off in `metro.config.js`: + +```js +module.exports = withBoostConfig(config, { + optimizations: { + 'native-image': 'off', + 'static-animated': 'on', + }, +}); +``` + +See [Configure Boost](/docs/configuration/configure#optimization-options) for all options. diff --git a/apps/docs/content/docs/optimizers/native-activity-indicator.mdx b/apps/docs/content/docs/optimizers/native-activity-indicator.mdx new file mode 100644 index 00000000..8e4ede99 --- /dev/null +++ b/apps/docs/content/docs/optimizers/native-activity-indicator.mdx @@ -0,0 +1,36 @@ +--- +title: Native Activity Indicator +description: How Boost prepares the native ActivityIndicator tree and when it keeps the wrapper. +--- + +React Native's `ActivityIndicator` component renders an outer native `View` and a platform spinner. Boost creates those same two native elements at build time, removing a fiber from the tree. + +It also applies the platform defaults for color, size, visibility, and layout. Dynamic direct values use small runtime helpers when needed. + +## When it runs + +The optimizer can usually replace an `ActivityIndicator` when: + +- It is imported from `react-native`. +- The build targets iOS or Android. +- Its props are written directly on the element. +- It has no children. +- Moving its props to the two generated native elements keeps their evaluation order safe. +- It is not inside a `Text`. + +## When it skips + +Boost keeps the wrapper when it finds: + +- An unknown or unsupported target platform. +- Spread props. +- Children. +- A prop expression with side effects, such as a function call. +- A parent or unknown ancestor that might provide a text context. +- A Unistyles style, or a style that might come from Unistyles. + +These checks prevent Boost from changing prop precedence, execution order, or style reactivity. + +## Configuration + +The optimizer is enabled by default. Set `native-activity-indicator` to `off` to disable it. diff --git a/apps/docs/content/docs/optimizers/native-image.mdx b/apps/docs/content/docs/optimizers/native-image.mdx new file mode 100644 index 00000000..f6039421 --- /dev/null +++ b/apps/docs/content/docs/optimizers/native-image.mdx @@ -0,0 +1,35 @@ +--- +title: Native Image +description: How Boost moves React Native Image wrapper work to build time and when it skips an image. +--- + +The Native Image optimizer replaces React Native's `Image` component, which is a JavaScript-based wrapper component, with its native host component. + +The wrapper normally prepares sources, dimensions, styles, request headers, and accessibility props during rendering. Boost moves this work to build time when possible. Dynamic sources use a small runtime helper when they can still be handled safely. + +## When it runs + +The optimizer can usually replace an `Image` when: + +- It is imported from `react-native`. +- The build targets iOS or Android. +- It has a supported `source`, `src`, or static `srcSet`. +- Its wrapper-level props can be safely prepared or passed through. +- It is not inside a `Text`. + +## When it skips + +Boost keeps the `Image` wrapper when it finds: + +- No image source. +- A dynamic or malformed `srcSet`. +- Load callbacks, a `ref`, children, or another prop that requires the wrapper. +- A spread that might contain Image wrapper props. +- A `srcSet` combination whose dimensions or styles cannot be resolved safely. +- A parent or unknown ancestor that might provide a text context. +- A Unistyles style, or a style that might come from Unistyles. Unistyles does not provide a lean Image host. +- An unknown or unsupported target platform. + +## Configuration + +The optimizer is enabled by default. Set `native-image` to `off` to disable it. diff --git a/apps/docs/content/docs/optimizers/native-text.mdx b/apps/docs/content/docs/optimizers/native-text.mdx new file mode 100644 index 00000000..b4397b71 --- /dev/null +++ b/apps/docs/content/docs/optimizers/native-text.mdx @@ -0,0 +1,47 @@ +--- +title: Native Text +description: How Boost removes the React Native Text wrapper and when it keeps it. +--- + +The Native Text optimizer replaces React Native's `Text` component, which is a JavaScript-based wrapper component, with its native host component. + +```tsx +// Before +Hello + +// After, simplified +Hello +``` + +Boost adds the same defaults and converts the same accessibility and style props that the wrapper would handle at runtime. + +## When it runs + +The optimizer can usually replace a `Text` when: + +- It is imported from `react-native`. +- Its children are known to be text or numbers. +- It is not inside another `Text`. +- It has no press or responder behavior that needs the wrapper. +- Boost can determine its text context. + +Direct accessibility props, `id`, `numberOfLines`, `selectionColor`, and supported text styles are normalized before the wrapper is removed. + +## When it skips + +Boost keeps the `Text` wrapper when it finds: + +- Press or responder props such as `onPress`, `onLongPress`, or `onResponderGrant`. +- Children that might be React elements instead of text. +- A parent `Text`, which requires React Native's inline text host. +- An unknown parent or runtime caller that might place it inside a `Text`. +- A spread that might contain props Boost must convert. +- A dynamic `id` together with `nativeID`, where their precedence is unclear. +- An `expo-router` `Link` with `asChild`, which makes its child pressable. +- An unknown style source while Unistyles support is active. + +If your project guarantees that unknown parents never add a text context, you can use [`unknownAncestorsDoNotRenderText`](/docs/configuration/configure#plugin-assumptions-unknownancestorsdonotrendertext) to increase optimization coverage. + +## Configuration + +The optimizer is enabled by default. Set `native-text` to `off` to disable it. diff --git a/apps/docs/content/docs/optimizers/native-view.mdx b/apps/docs/content/docs/optimizers/native-view.mdx new file mode 100644 index 00000000..c994129c --- /dev/null +++ b/apps/docs/content/docs/optimizers/native-view.mdx @@ -0,0 +1,43 @@ +--- +title: Native View +description: How Boost removes the React Native View wrapper and when it keeps it. +--- + +The Native View optimizer replaces React Native's `View` component, which is a JavaScript-based wrapper component, with its native host component. + +Before it removes the wrapper, Boost converts the convenience props that React Native normally handles during every render. This includes accessibility props, `tabIndex`, and `id`. + +```tsx +// Before + + +// After, simplified + +``` + +Static values are converted at build time. Dynamic direct values use minimal runtime helpers. + +## When it runs + +The optimizer can usually replace a `View` when: + +- It is imported from `react-native`. +- It is not inside a `Text`. +- Boost can determine its ancestor context. +- Any props that need conversion are written directly on the element. + +## When it skips + +Boost keeps the `View` wrapper when it finds: + +- A spread that might contain accessibility props, `tabIndex`, or `id`. +- A dynamic `id` together with `nativeID`, where their precedence is unclear. +- A parent `Text`. +- An unknown ancestor that might render a `Text` around its children. +- An unknown style source while Unistyles support is active. + +If your project guarantees that unknown ancestors never add a text context, you can use [`unknownAncestorsDoNotRenderText`](/docs/configuration/configure#plugin-assumptions-unknownancestorsdonotrendertext) to increase optimization coverage. + +## Configuration + +The optimizer is enabled by default. Set `native-view` to `off` to disable it. diff --git a/apps/docs/content/docs/optimizers/static-animated.mdx b/apps/docs/content/docs/optimizers/static-animated.mdx new file mode 100644 index 00000000..24bb4f4d --- /dev/null +++ b/apps/docs/content/docs/optimizers/static-animated.mdx @@ -0,0 +1,70 @@ +--- +title: Static Animated +description: How Boost removes Animated wrappers that do not contain an animation. +--- + +The Static Animated optimizer removes an `Animated` wrapper when its element contains no animated value or event. + +```tsx +// Before + + Hello + + +// After, simplified + + Hello + +``` + +The resulting `View`, `Text`, or `Image` may then additionally pass through its corresponding Boost optimizer. For example, `Animated.View` can become `View` and then [`NativeView`](./native-view) in the same build. + +Boost keeps the defaults that React Native's Animated wrapper would have added. It also flattens static style arrays at build time. + +## Supported components + +- `Animated.View` +- `Animated.Text` +- `Animated.Image` +- `Animated.ScrollView` + +## When it runs + +The optimizer can remove a wrapper when: + +- `Animated` is imported from `react-native`. +- The build targets iOS or Android. +- Its props and expression children are known not to contain animated values or events. +- Its style is absent, null, or a static object or array literal. +- Any callbacks are inline functions or local functions that Boost can identify. + +## When it skips + +Boost keeps the Animated wrapper when it finds: + +- An `Animated.Value`, interpolation, animated calculation, or `Animated.event`. +- A prop, style, or child value that cannot be resolved at build time. +- Spread props or duplicate props. +- A `ref` or Animated passthrough prop. +- A `refreshControl` on `Animated.ScrollView`. +- An unknown or unsupported target platform. + +`@boost-force` does not override these checks. Boost must prove that the wrapper contains no animation before removing it. + +## React Native version support + +This optimizer is enabled by default for React Native 0.83 through 0.86. + +It is disabled by default for React Native 0.87 and later. React Native 0.87 changed how Android flushes native Animated operations. An `Animated` wrapper that has no animations itself may still flush work queued elsewhere, so removing it is not always safe. + +You can set `static-animated` to `on` explicitly, but this may cause small behavioral changes on Android in React Native 0.87 and higher. + +## Configuration + +```js +module.exports = withBoostConfig(config, { + optimizations: { + 'static-animated': 'off', + }, +}); +``` diff --git a/apps/docs/next.config.mjs b/apps/docs/next.config.mjs index 91c6ac17..41252d91 100644 --- a/apps/docs/next.config.mjs +++ b/apps/docs/next.config.mjs @@ -5,6 +5,15 @@ const withMDX = createMDX(); /** @type {import('next').NextConfig} */ const config = { reactStrictMode: true, + async redirects() { + return [ + { + source: '/docs/information/optimization-coverage', + destination: '/docs/optimizers', + permanent: true, + }, + ]; + }, async rewrites() { return [ { diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/boost.ts b/packages/react-native-boost/src/plugin/__tests__/parity/boost.ts index 37cbed22..4472e900 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/boost.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/boost.ts @@ -24,7 +24,7 @@ interface BoostOptimized { function transformBoostCase(os: PlatformOS, jsxBody: string, preamble = '', runtimeParentIsSafe = true): string { setPlatformOS(os); const source = - `import { ActivityIndicator, Image, Text, View } from 'react-native';\n${preamble}\n` + + `import { ActivityIndicator, Animated, Image, Text, View } from 'react-native';\n${preamble}\n` + `export default function Case(){ return ${jsxBody}; }`; const out = transformSync(source, { configFile: false, @@ -38,6 +38,7 @@ function transformBoostCase(os: PlatformOS, jsxBody: string, preamble = '', runt { logLevel: 'silent', assumptions: { unknownAncestorsDoNotRenderText: runtimeParentIsSafe }, + optimizations: { 'static-animated': 'on' }, }, ], ], diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/mocks/NativeAnimatedHelper.ts b/packages/react-native-boost/src/plugin/__tests__/parity/mocks/NativeAnimatedHelper.ts new file mode 100644 index 00000000..0f429710 --- /dev/null +++ b/packages/react-native-boost/src/plugin/__tests__/parity/mocks/NativeAnimatedHelper.ts @@ -0,0 +1,14 @@ +const noop = () => undefined; + +const API = new Proxy({}, { get: () => noop }); + +export default { + API, + assertNativeAnimatedModule: noop, + generateNewAnimationId: () => 1, + generateNewNodeTag: () => 1, + nativeEventEmitter: { addListener: () => ({ remove: noop }) }, + shouldSignalBatch: false, + shouldUseNativeDriver: () => false, + transformDataType: (value: unknown) => value, +}; diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/mocks/ReactNativeFeatureFlags.ts b/packages/react-native-boost/src/plugin/__tests__/parity/mocks/ReactNativeFeatureFlags.ts index 49387fdc..a49b77ec 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/mocks/ReactNativeFeatureFlags.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/mocks/ReactNativeFeatureFlags.ts @@ -5,3 +5,9 @@ export const fixImageSrcDimensionPropagation = () => true; export const reduceDefaultPropsInImage = () => false; export const reduceDefaultPropsInText = () => false; export const shouldUseLinkRoleForPressableText = () => true; +export const animatedShouldDebounceQueueFlush = () => false; +export const animatedShouldUseSingleOp = () => false; +export const cxxNativeAnimatedEnabled = () => false; +export const shouldUseAnimatedObjectForTransform = () => false; +export const shouldUseSetNativePropsInFabric = () => false; +export const useSharedAnimatedBackend = () => false; diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/mocks/ReactNativePrivateInterface.ts b/packages/react-native-boost/src/plugin/__tests__/parity/mocks/ReactNativePrivateInterface.ts new file mode 100644 index 00000000..e86cac60 --- /dev/null +++ b/packages/react-native-boost/src/plugin/__tests__/parity/mocks/ReactNativePrivateInterface.ts @@ -0,0 +1 @@ +export const getNodeFromPublicInstance = () => null; diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/mocks/RendererProxy.ts b/packages/react-native-boost/src/plugin/__tests__/parity/mocks/RendererProxy.ts new file mode 100644 index 00000000..4fbc4eeb --- /dev/null +++ b/packages/react-native-boost/src/plugin/__tests__/parity/mocks/RendererProxy.ts @@ -0,0 +1 @@ +export const findNodeHandle = () => null; diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/mocks/react-native.ts b/packages/react-native-boost/src/plugin/__tests__/parity/mocks/react-native.ts index 10c2ca8c..fb13710f 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/mocks/react-native.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/mocks/react-native.ts @@ -20,6 +20,7 @@ export const unstable_NativeText = NativeTextCapturer; export const unstable_NativeView = NativeViewCapturer; export const Text = NativeTextCapturer; export const View = NativeViewCapturer; +export const Animated = { Text, View }; export const Image = Object.assign(NativeImageCapturer, { resolveAssetSource: (source: T): T => source, }); diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts b/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts index c0340276..b228fbef 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts @@ -75,6 +75,11 @@ const BAILED_TEXT_CASES = new Set([ 'hello', ]); +const STATIC_ANIMATED_CASES = [ + '', + 'hello', +]; + const VIEW_CASES = [ '', '', @@ -303,6 +308,14 @@ describe('differential parity', () => { expect(normalize(boost.props)).toEqual(normalize(wrapper.props)); }); + it.each(STATIC_ANIMATED_CASES)('Animated static: %s', async (jsx) => { + const boost = await captureBoost(os, jsx); + if (!boost.optimized) throw new Error('expected static Animated case to optimize'); + const wrapper = await captureWrapper(os, jsx); + expect(boost.which).toEqual(wrapper.which); + expect(normalize(boost.props)).toEqual(normalize(wrapper.props)); + }); + it.each(ACTIVITY_INDICATOR_CASES)('ActivityIndicator: %s', async (jsx, preamble = '') => { const boost = await captureBoostHosts(os, jsx, preamble); expect(boost.optimized).toBe(!BAILED_ACTIVITY_INDICATOR_CASES.has(jsx)); diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/vitest.config.parity.mts b/packages/react-native-boost/src/plugin/__tests__/parity/vitest.config.parity.mts index 97ddb10f..4ae1f3f5 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/vitest.config.parity.mts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/vitest.config.parity.mts @@ -44,6 +44,9 @@ const basenameRedirects: Array<[RegExp, string]> = [ [/(^|[./])ProgressBarAndroidNativeComponent(?:\.js)?$/, u('./mocks/ProgressBarAndroidNativeComponent.ts')], [/(^|[./])TextInlineImageNativeComponent$/, u('./mocks/TextInlineImageNativeComponent.ts')], [/(^|[./])NativeImageLoader(Android|IOS)$/, u('./mocks/NativeImageLoader.ts')], + [/(^|[./])NativeAnimatedHelper$/, u('./mocks/NativeAnimatedHelper.ts')], + [/(^|[./])RendererProxy$/, u('./mocks/RendererProxy.ts')], + [/(^|[./])ReactNativePrivateInterface$/, u('./mocks/ReactNativePrivateInterface.ts')], [/(^|[./])StyleSheet$/, u('./mocks/StyleSheet.ts')], [/(^|[./])resolveAssetSource$/, u('./mocks/resolveAssetSource.ts')], [/(^|[./])Platform$/, u('./mocks/Platform.ts')], diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/wrapper.ts b/packages/react-native-boost/src/plugin/__tests__/parity/wrapper.ts index 7900ffa5..25ff957f 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/wrapper.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/wrapper.ts @@ -21,11 +21,15 @@ async function compileWrapperCase(os: PlatformOS, jsxBody: string, preamble = '' const activityIndicatorImport = jsxBody.includes(' { const file = (path.hub as unknown as { file: HubFile }).file; const reactNativeMinor = resolveReactNativeMinor(file); const context = { logger, options, platform, unistylesEnabled, reactNativeMinor }; + // The flush is redundant through RN 0.86; RN 0.87 Android can rely on each wrapper to drain a global queue. + const staticAnimatedDefault = + reactNativeMinor !== undefined && reactNativeMinor >= 83 && reactNativeMinor <= 86 ? 'on' : 'off'; + if (isOptimizationEnabled(options, 'static-animated', staticAnimatedDefault)) + staticAnimatedOptimizer(path, context); if (isOptimizationEnabled(options, 'native-text')) nativeTextOptimizer(path, context); if (isOptimizationEnabled(options, 'native-view')) nativeViewOptimizer(path, context); if (isOptimizationEnabled(options, 'native-image')) nativeImageOptimizer(path, context); @@ -124,10 +130,11 @@ export default declare((api, rawOptions, dirname?: string) => { function isOptimizationEnabled( options: BabelPluginOptions, - name: keyof NonNullable + name: keyof NonNullable, + defaultState: 'on' | 'off' = 'on' ): boolean { const setting = options.optimizations?.[name]; - return (Array.isArray(setting) ? setting[0] : setting) !== 'off'; + return ((Array.isArray(setting) ? setting[0] : setting) ?? defaultState) === 'on'; } function normalizeTargetPlatform(platform: unknown): TargetPlatform | undefined { diff --git a/packages/react-native-boost/src/plugin/optimizers/static-animated/__tests__/index.test.ts b/packages/react-native-boost/src/plugin/optimizers/static-animated/__tests__/index.test.ts new file mode 100644 index 00000000..d537ff96 --- /dev/null +++ b/packages/react-native-boost/src/plugin/optimizers/static-animated/__tests__/index.test.ts @@ -0,0 +1,149 @@ +import { transformSync, type TransformCaller } from '@babel/core'; +import { describe, expect, it } from 'vitest'; +import boostPlugin from '../../../index'; +import { staticAnimatedOptimizer } from '..'; +import type { TargetPlatform } from '../../../types'; +import { generateTestPlugin } from '../../../utils/generate-test-plugin'; + +function transformAnimated(source: string, platform: TargetPlatform = 'ios'): string { + return transformSync(source, { + configFile: false, + babelrc: false, + plugins: ['@babel/plugin-syntax-jsx', generateTestPlugin(staticAnimatedOptimizer, {}, platform)], + })!.code!; +} + +function transformWithBoost(source: string, reactNativeMinor = 86, staticAnimated?: 'on' | 'off'): string { + return transformSync(source, { + configFile: false, + babelrc: false, + caller: { name: 'test', platform: 'ios' } as TransformCaller, + plugins: [ + '@babel/plugin-syntax-jsx', + [ + boostPlugin, + { + logLevel: 'silent', + target: { reactNative: { version: `0.${reactNativeMinor}.0` } }, + assumptions: { unknownAncestorsDoNotRenderText: true }, + optimizations: staticAnimated ? { 'static-animated': staticAnimated } : undefined, + }, + ], + ], + })!.code!; +} + +const source = (element: string) => `import { Animated } from 'react-native';\n${element};`; + +describe('static Animated optimizer', () => { + it('lowers static Animated.View and reproduces Animated style flattening', () => { + const output = transformAnimated( + source( + '' + ) + ); + + expect(output).not.toContain('

    -

    - Improve your app's performance with one line of code. -

    +

    The React Native performance compiler.

    - A Babel plugin that replaces analyzes your code and performs safe optimizations to reduce unnecessary runtime + A Metro plugin that replaces analyzes your code and performs safe optimizations to reduce unnecessary runtime overhead in React Native apps.

    @@ -33,7 +31,7 @@ export default function HomePage() { Faster renders

    - Removes runtime overhead from wrapper components to improve UI-heavy screens. + Removes runtime overhead by moving expensive work to build time.

    @@ -42,7 +40,7 @@ export default function HomePage() { Safety first

    - Conservative analysis skips uncertain optimizations to reduce behavioral risk. + Conservative by default, optimizing only what can safely be optimized.

    @@ -51,7 +49,7 @@ export default function HomePage() { Minimal setup

    - Install, add the Babel plugin, get instant improvements. No code changes required. + Install, add the Metro plugin, get instant improvements. No code changes required.

    diff --git a/apps/docs/content/docs/index.mdx b/apps/docs/content/docs/index.mdx index 6e29d990..cc898aa0 100644 --- a/apps/docs/content/docs/index.mdx +++ b/apps/docs/content/docs/index.mdx @@ -21,9 +21,9 @@ It eliminates unnecessary runtime work, replaces JavaScript abstractions with mo | `1.x` | `>=0.83` | | `2.x` | `>=0.83` | -In Boost 2.x, we validate runtime behavior against all versions of React Native since 0.83. Boost 0.x and 1.x are not supported anymore and may break with future React Native updates. +Boost 0.x and 1.x are not supported anymore and may break with future React Native updates. For Boost 2.x, we validate runtime behavior against all stable versions of React Native since 0.83. -Starting from React Native 0.80, Boost 0.x prints import deprecation warnings. [See react-native-community/discussions-and-proposals #893.](https://github.com/react-native-community/discussions-and-proposals/discussions/893) +Starting from React Native 0.80, Boost 0.x causes React Native to print import deprecation warnings. [See react-native-community/discussions-and-proposals #893.](https://github.com/react-native-community/discussions-and-proposals/discussions/893) ## Getting Started @@ -127,5 +127,4 @@ React Native Boost supports all platforms. Optimizations are performed on iOS an - diff --git a/apps/docs/content/docs/information/benchmarks.mdx b/apps/docs/content/docs/information/benchmarks.mdx index 27f757f6..da8a00ff 100644 --- a/apps/docs/content/docs/information/benchmarks.mdx +++ b/apps/docs/content/docs/information/benchmarks.mdx @@ -10,42 +10,31 @@ import fpsAndroidDark from './img/fps-android.svg'; import fibersLight from './img/fibers-light.svg'; import fibersDark from './img/fibers.svg'; -To show what that React Native Boost buys you, -the example app in the repository serves as a benchmark by rendering a heavy, constantly-updating screen and -measuring the **frame rate**. We compare three configurations on the exact same device: the -**baseline** (stock React Native), a [**core-optimized** configuration](#reducedefaultpropsintext-feature-flag-in-react-native) that turns on React Native's own -overhead-reduction feature flag (detailed below), and **React Native Boost**. +To show what React Native Boost buys you, the example app in the repository hosts a benchmark that renders a heavy, constantly-updating screen and measures the **frame rate**. We compare three configurations on the exact same device: the **baseline** (stock React Native), a [**core-optimized** configuration](#reducedefaultpropsintext-feature-flag-in-react-native) that turns on any experimental feature flags in React Native that aim to do similar runtime work reductions as Boost (detailed below), and **React Native Boost**. Higher frames per second (FPS) means a smoother UI. The ideal target is 60 FPS, which means you need to commit one new frame every ~16 ms. Once the app can't keep up, FPS drops and the interface starts to stutter. ## Results -**iOS**: The baseline starts dropping frames early and falls to ~32 FPS under the heaviest load, while React Native Boost -holds a solid 60 FPS far longer and stays roughly **69% faster** at the top end. The core-optimized build (the middle -line) recovers part of the gap โ€” around **8โ€“15%** under heavy load โ€” but Boost stays roughly **50% ahead of even -that**. +**iOS**: The baseline starts dropping frames early and falls to ~32 FPS under the heaviest load, while React Native Boost holds a solid 60 FPS far longer and stays roughly **69% faster** at the top end. The core-optimized build (the middle line) recovers part of the gap, but Boost stays roughly **50% ahead of even that**. -**Android**: Same shape, with Boost about **55% faster** at the heaviest load (and higher at intermediate heavy loads). -The core-optimized build helps here too โ€” roughly **10โ€“22%** at heavy loads. This device is noisy enough that a handful -of loads couldn't be measured reliably for the core comparison and are left out of that middle line (you'll see small -gaps), but Boost's lead is unambiguous throughout. +**Android**: Similar, with Boost about **55% faster** at the heaviest load (and higher at intermediate heavy loads). The core-optimized build helps here too, but can't recover the whole gap. The load on the test device used is quite noisy, but Boost's lead is unambiguous. ## Methodology -The test screen is a live crypto-style order book: two stacked columns of rows, each +The test screen is a live crypto-style order book. It displays two stacked columns of rows, each row a few pieces of `Text`, all updating many times per second from a simulated price feed. -Each run is a clean comparison on identical inputs: +Each run compares these identical inputs: -1. **One build, three configurations.** From a single release build we run the *baseline* (stock React Native), a *core-optimized* configuration with React Native's `reduceDefaultPropsInText` flag enabled, and *React Native Boost*. Nothing else changes. -2. **Sweep the load.** Each configuration steps through a range of row counts, from light to heavy. -3. **Hold the temperature constant.** Phones throttle as they heat up, which would corrupt the comparison. So before every capture the app idles until the device cools back to a fixed thermal floor, and every sample records the device's thermal state. All three series are measured at the same temperature. -4. **Measure FPS, repeatedly.** The app runs a continuous animation loop and records how long every frame takes over a fixed window, reporting the average FPS (plus 95th-percentile frame time and the share of dropped frames). Each point is captured several times and reported as the **median**, with the replicate spread drawn as error bars on the graphs. -5. **Validate the core comparison.** Boost's frame rate doesn't depend on the `reduceDefaultPropsInText` flag, so the Boost curve should land identically in the baseline and core-optimized runs. This is used as a built-in sanity check / validator. At any load where the two disagree (or the device is simply too noisy to trust), the point is dropped as unreliable. +1. **One build, three configurations.** From a single release build we run the *baseline* (stock React Native), a *core-optimized* configuration with any experimental performance optimization React Native feature flags enabled, and *React Native Boost*. +2. **Change the load.** Each configuration steps through a wide range of row counts, from light to heavy. +3. **Not run into thermal throttling.** Phones throttle as they heat up, which would corrupt the comparison. So before every capture the app idles until the device cools back to a fixed thermal floor. +4. **Measure FPS.** The app records how long every frame takes over a fixed window, reporting the average FPS (plus 95th-percentile frame time and the share of dropped frames). Each point is captured several times and reported as the **median**, with the replicate spread drawn as error bars on the graphs above. Everything runs as a **release/production build on the New Architecture**. @@ -53,8 +42,7 @@ Everything runs as a **release/production build on the New Architecture**. ### Number of React tree nodes -We're also making a second, device-independent measurement. For a single row, we count the **React tree nodes** -(fibers). One of the ways React Native Boost impacts an app's performance is by deleting a layer of these fibers per element it optimizes. +We're also making a second, device-independent measurement. For a single row, we count the **React tree nodes** (fibers). One of the ways React Native Boost impacts an app's performance is by deleting a layer of these fibers per element it optimizes. @@ -68,7 +56,7 @@ Thanks to various improvements to the reconciler and other internals in React Na ## `reduceDefaultPropsInText` feature flag in React Native -In React Native 0.82, a `reduceDefaultPropsInText` feature flag was introduced. It trimmed the `Text` wrapper's output so that unset accessibility/`aria-*` props no longer crossed the JSโ†’native boundary on every render. It shipped disabled by default and has since **graduated**: in newer React Native the flag is gone and the optimized behavior is simply the default. It's one step in React Native's long-term goal of reducing the `Text` and `View` wrapper overhead directly in core. +In React Native 0.82, a `reduceDefaultPropsInText` feature flag was introduced that reduced some of the default props being set in the JS wrapper component, similar to what Boost is doing. It has since **graduated**, meaning the optimized behavior is the default in newer React Native versions. It's one step in React Native's long-term goal of reducing the `Text` and `View` wrapper overhead directly in core. wrappers so that we no longer have any reason to export these APIs.`} /> -In our benchmark, the **core-optimized** series in the graphs enables `reduceDefaultPropsInText` (on the React Native version measured here, where the flag still exists). Under heavy render load it recovers roughly **8โ€“15%** of the baseline's lost frame rate on iOS (a bit more on Android), but closes only part of the gap. `NativeText`, the component React Native Boost uses under the hood, stays well ahead โ€” around a **50%** margin over the core-optimized build at the heaviest loads on iOS. As React Native lands more of these optimizations, we expect the core-optimized line to keep rising toward React Native Boost. +In our benchmark, the **core-optimized** series in the graphs enables `reduceDefaultPropsInText` (on the React Native version measured in this benchmark run, where the flag still exists and isn't enabled by default). Under heavy render load it recovers roughly **8โ€“15%** of the baseline's lost frame rate on iOS (a bit more on Android), but closes only part of the gap. `NativeText`, the component React Native Boost uses under the hood, stays well ahead. As React Native lands more of these optimizations, we expect the core-optimized line (and then the core line) to keep rising toward React Native Boost. diff --git a/apps/docs/content/docs/information/how-it-works.mdx b/apps/docs/content/docs/information/how-it-works.mdx index cfc39b80..a51841be 100644 --- a/apps/docs/content/docs/information/how-it-works.mdx +++ b/apps/docs/content/docs/information/how-it-works.mdx @@ -5,9 +5,9 @@ description: Why React Native Boost makes your app faster. In React Native, many of the standard components, like `Text` and `View`, aren't quite what they appear to be. They look like basic building blocks, but each one runs JavaScript code **every time it renders**, wrapping lower-level native components underneath. -These wrappers are genuinely useful. They handle edge cases and power many conveniences such as style normalization. But the majority of elements do not need all that runtime work, making these wrappers pure overhead. On a busy screen with hundreds of these components, that overhead adds up and starts costing you frames. +These wrappers are genuinely useful. They handle edge cases and power many conveniences such as style normalization. But the majority of elements do not need all that runtime work, making these wrappers pure overhead in most cases. On a busy screen with hundreds of these components, that overhead adds up and starts costing you frames. -React Native Boost removes such wrappers when they're not needed. Additionally, it also provides a few smaller micro-optimizations that move small runtime work to the build time, like resolving `StyleSheet` function calls, folding `Platform.OS` branches, and more, which all stack up additionally across an app. +React Native Boost removes such wrappers when they're not needed. Additionally, it also makes a few smaller micro-optimizations that move small runtime work to the build time, like resolving `StyleSheet` function calls, folding `Platform.OS` branches, and more, which all stack up additionally across an app. React Native Boost can therefore be described as a performance optimization compiler for React Native. @@ -21,7 +21,7 @@ React Native Boost can therefore be described as a performance optimization comp Hello ``` -`NativeText` is exactly what the `Text` wrapper would have rendered after doing the wrapper work outlined above. Boost just skips the middleman on the runtime and does it during build time instead. The defaults the wrapper would have applied are baked in during compilation, so runtime behavior stays identical. +This is exactly what React Native would have rendered using its `Text` wrapper component. The difference is that Boost does this work at build time, while pure React Native relies on a middleman on the runtime doing this work on your user's device instead. ## Only when it's safe @@ -31,7 +31,7 @@ By default, Boost rewrites a component only when it can **prove** that doing so - Are its props fully compatible with the underlying native component? - Is it in a safe spot in the tree (for example, not nested inside another `Text`)? -If any check fails, Boost leaves that component or function exactly as it was. It has a strong bias toward safety and would rather miss an optimization than risk a bug. +If any check fails and Boost can't safely transform it at build time, it leaves that component or function exactly as it was. It has a strong bias toward safety and would rather miss an optimization than risk a bug. ## Compatibility boundary diff --git a/apps/docs/content/docs/optimizers/index.mdx b/apps/docs/content/docs/optimizers/index.mdx index d7c63c4d..a45f5634 100644 --- a/apps/docs/content/docs/optimizers/index.mdx +++ b/apps/docs/content/docs/optimizers/index.mdx @@ -3,7 +3,7 @@ title: Overview description: What React Native Boost can optimize and the cases it safely skips. --- -React Native Boost includes different optimizers that optimize different parts of your app. Every optimizer leaves your code unchanged when it cannot prove that a build-time rewrite is safe. +React Native Boost includes different optimizers that optimize different parts of your app. From 645e410813a01a622771cf47f0c323a5b8dee890 Mon Sep 17 00:00:00 2001 From: Maximilian Krause Date: Sun, 13 Sep 2026 15:53:55 +0200 Subject: [PATCH 54/56] feat: add support for React Native 0.88 --- .github/workflows/ci.yml | 2 + .../src/metro/__tests__/uniwind.test.ts | 2 +- .../src/plugin/__tests__/parity/normalize.ts | 2 - .../plugin/__tests__/parity/parity.test.ts | 50 ++++++- .../plugin/__tests__/parity/text-raw.test.ts | 46 ++++++- .../__tests__/parity/uniwind/uniwind.test.tsx | 35 ++++- .../__tests__/static-accessibility.test.ts | 16 ++- .../fixtures/fallback-semantics/output.js | 39 +++--- .../fixtures/request-headers/output.js | 37 ++--- .../__tests__/fixtures/source-array/output.js | 47 +++---- .../fixtures/src-precedence/output.js | 27 ++-- .../__tests__/fixtures/src-prop/output.js | 24 ++-- .../__tests__/fixtures/view-props/output.js | 13 +- .../native-image/__tests__/index.test.ts | 11 +- .../plugin/optimizers/native-image/index.ts | 76 ++++++---- .../src/plugin/utils/static-accessibility.ts | 27 +++- .../src/runtime/__tests__/index.test.ts | 30 +++- .../react-native-boost/src/runtime/index.ts | 130 +++++++++++------- 18 files changed, 405 insertions(+), 209 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 19a7488c..ce7c8f53 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -74,6 +74,8 @@ jobs: metro: '0.84.6' - react-native: '0.87' metro: '0.87.0' + - react-native: '0.88.0-rc.0' + metro: '0.87.0' steps: - name: Checkout uses: actions/checkout@v7 diff --git a/packages/react-native-boost/src/metro/__tests__/uniwind.test.ts b/packages/react-native-boost/src/metro/__tests__/uniwind.test.ts index 26592b89..a7baf4fa 100644 --- a/packages/react-native-boost/src/metro/__tests__/uniwind.test.ts +++ b/packages/react-native-boost/src/metro/__tests__/uniwind.test.ts @@ -89,7 +89,7 @@ it('builds class styles and native adapters through the real Metro and Uniwind w unstable_conditionNames: ['require', 'react-native'], extraNodeModules: { 'react-native-boost': packageRoot }, }, - watchFolders: [path.resolve(packageRoot, '../..')], + watchFolders: [packageRoot, path.resolve(packageRoot, '../../node_modules')], transformer: { ...base.transformer, assetRegistryPath: createRequire(require.resolve('react-native/package.json')).resolve( diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/normalize.ts b/packages/react-native-boost/src/plugin/__tests__/parity/normalize.ts index 127fcf44..531f4b3b 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/normalize.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/normalize.ts @@ -61,8 +61,6 @@ export const normalizeImage = (props: Record, reactNativeMinor: 'crossOrigin', 'referrerPolicy', 'srcSet', - 'width', - 'height', ]) { delete normalized[key]; } diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts b/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts index 6f35d4d5..3ebf9ae9 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/parity.test.ts @@ -189,6 +189,7 @@ const IMAGE_CASES = [ '', 'Logo', '{null}', + '', '', '', '', @@ -283,7 +284,8 @@ const IMAGE_PROP_ASSERTIONS = new Map, o [ '', (props, os) => { - if (os === 'android') expect(props.accessibilityState).toEqual({ selected: true, busy: true }); + if (os === 'android' || REACT_NATIVE_MINOR >= 88) + expect(normalize(props).accessibilityState).toEqual({ selected: true, busy: true }); else expect(props.accessibilityState).toEqual({ selected: true }); }, ], @@ -373,6 +375,52 @@ describe('differential parity', () => { DYNAMIC_IMAGE_PROP_ASSERTIONS.get(jsx)?.(boost.props); }); + it.each([ + [false, 'logo.png'], + [true, 'logo.png'], + [false, ''], + [true, ''], + ] as const)('Image: preserves source headers and collisions (dynamic=%s, uri=%s)', async (dynamic, uri) => { + for (const headers of [ + 'null', + '{}', + '{ Authorization: "Bearer token", "Referrer-Policy": "no-referrer", "Access-Control-Allow-Credentials": "false" }', + ]) { + const source = `{ uri: ${JSON.stringify(uri)}, width: 16, height: 8, headers: ${headers} }`; + const preamble = dynamic ? `const source = ${source};` : ''; + const jsx = ``; + const boost = await captureBoost(os, jsx, preamble); + if (!boost.optimized) throw new Error('Image headers must optimize'); + const wrapper = await captureWrapper(os, jsx, preamble); + expect(boost.props.source).toStrictEqual(wrapper.props.source); + expect(boost.props.headers).toStrictEqual(wrapper.props.headers); + expect(normalizeImage(boost.props, REACT_NATIVE_MINOR)).toEqual( + normalizeImage(wrapper.props, REACT_NATIVE_MINOR) + ); + } + }); + + it.each([false, true])('Image: preserves native dimensions (dynamic=%s)', async (dynamic) => { + for (const source of [ + '{ uri: "logo.png", width: 16, height: 8 }', + '[{ uri: "logo.png", width: 16, height: 8 }]', + '[{ uri: "logo.png" }, { uri: "large.png", scale: 2 }]', + ]) { + const preamble = dynamic ? `const source = ${source};` : ''; + const jsx = ``; + const boost = await captureBoost(os, jsx, preamble); + if (!boost.optimized) throw new Error('Image dimensions must optimize'); + const wrapper = await captureWrapper(os, jsx, preamble); + for (const key of ['width', 'height']) { + expect(Object.hasOwn(boost.props, key)).toBe(Object.hasOwn(wrapper.props, key)); + expect(boost.props[key]).toBe(wrapper.props[key]); + } + expect(normalizeImage(boost.props, REACT_NATIVE_MINOR)).toEqual( + normalizeImage(wrapper.props, REACT_NATIVE_MINOR) + ); + } + }); + it.each(STATIC_SELECTION_COLOR_CASES)('Text: precomputes selectionColor: %s', async (jsx) => { expect(boostUsesRuntimeSelectionColor(os, jsx)).toBe(false); const boost = await captureBoost(os, jsx); diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/text-raw.test.ts b/packages/react-native-boost/src/plugin/__tests__/parity/text-raw.test.ts index 6dff618b..fd20492c 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/text-raw.test.ts +++ b/packages/react-native-boost/src/plugin/__tests__/parity/text-raw.test.ts @@ -86,7 +86,13 @@ for (const platform of ['ios', 'android'] as const) { : []), ...(component === 'Image' ? [ + 'alt={null}', 'alt={null} accessible={false}', + 'accessible={null}', + 'accessible={undefined}', + 'accessibilityLabel={null}', + 'accessibilityLabelledBy={null}', + 'aria-labelledby="winner" accessibilityLabelledBy="fallback"', 'alt="fallback" aria-label="winner" aria-hidden={true}', 'aria-labelledby={null} accessibilityLabelledBy={null}', 'aria-labelledby={null} accessibilityLabelledBy={["first","second"]}', @@ -155,6 +161,40 @@ for (const platform of ['ios', 'android'] as const) { } }); + it.runIf(reactNativeVersion.minor >= 88)( + 'preserves dynamic Image accessibility own keys and state copies', + async () => { + for (const properties of [ + { alt: null, accessible: false }, + { accessible: null, accessibilityLabel: null, accessibilityLabelledBy: null }, + { accessible: undefined, accessibilityLabel: undefined, accessibilityLabelledBy: undefined }, + { 'aria-labelledby': 'label', 'accessibilityLabelledBy': 'fallback' }, + { 'aria-label': null, 'accessibilityLabel': null, 'alt': null }, + { 'aria-hidden': true, 'alt': 'logo', 'accessible': true }, + { accessibilityState: null }, + { accessibilityState: { busy: false, extra: 'removed' } }, + { 'aria-busy': true, 'accessibilityState': { busy: false, selected: true } }, + ]) { + vi.stubGlobal('imageAccessibilityInput', properties); + try { + const jsx = ` `${key}={input[${JSON.stringify(key)}]}`) + .join(' ')} />`; + const preamble = 'const input = globalThis.imageAccessibilityInput;'; + const expected = await captureWrapper(platform, jsx, preamble); + const result = await captureBoostHosts(platform, jsx, preamble); + if (!result.optimized) throw new Error('Dynamic Image accessibility must optimize'); + const actual = result.hosts[0].props; + expect(accessibilityProps(actual)).toStrictEqual(accessibilityProps(expected.props)); + if (properties.accessibilityState != null) + expect(actual.accessibilityState).not.toBe(properties.accessibilityState); + } finally { + vi.unstubAllGlobals(); + } + } + } + ); + it('keeps literal spread string whitespace and entities', async () => { for (const component of ['Text', 'View']) { const jsx = `<${component} {...{id:"a\\n b &", testID:"a\\n b &"}} />`; @@ -246,7 +286,7 @@ for (const platform of ['ios', 'android'] as const) { } }); - it('reconciles shared state in place across renders and preserves ARIA copy boundaries', () => { + it('preserves release-specific state identity and mutations across renders', () => { setPlatformOS(platform); for (const aria of [{}, { 'aria-busy': true }]) { const expectedState = { disabled: true }; @@ -262,10 +302,10 @@ for (const platform of ['ios', 'android'] as const) { } }); - it('throws for a frozen conflicting state, but not an ARIA-created copy', () => { + it('preserves release-specific frozen state errors and ARIA copies', () => { setPlatformOS(platform); const state = Object.freeze({ disabled: true }); - if (reactNativeVersion.minor >= 85) { + if (reactNativeVersion.minor >= 85 && reactNativeVersion.minor < 88) { expect(() => wrapper({ accessibilityState: state, disabled: false })).toThrow(TypeError); expect(() => processTextAccessibilityProps({ accessibilityState: state, disabled: false })).toThrow(TypeError); } else { diff --git a/packages/react-native-boost/src/plugin/__tests__/parity/uniwind/uniwind.test.tsx b/packages/react-native-boost/src/plugin/__tests__/parity/uniwind/uniwind.test.tsx index cbddda2e..a289b840 100644 --- a/packages/react-native-boost/src/plugin/__tests__/parity/uniwind/uniwind.test.tsx +++ b/packages/react-native-boost/src/plugin/__tests__/parity/uniwind/uniwind.test.tsx @@ -8,7 +8,7 @@ import { transformSync, type TransformCaller } from '@babel/core'; import boost from '../../../index'; import { renderAndCaptureAll } from '../capture'; import { normalize, normalizeImage } from '../normalize'; -import { setPlatformOS } from '../mocks/Platform'; +import { reactNativeVersion, setPlatformOS } from '../mocks/Platform'; import * as optimized from '../../../../runtime/uniwind'; vi.mock('../../../../runtime/components/native-text', () => @@ -90,7 +90,7 @@ UniwindStore.reinit( const capture = (Component: React.ElementType, props: object) => renderAndCaptureAll(React.createElement(Component, props)).map((item) => ({ which: item.which, - props: item.which === 'NativeImage' ? normalizeImage(item.props, 87) : normalize(item.props), + props: item.which === 'NativeImage' ? normalizeImage(item.props, reactNativeVersion.minor) : normalize(item.props), })); const generated = fileURLToPath(new URL('__generated__/', import.meta.url)); mkdirSync(generated, { recursive: true }); @@ -189,6 +189,26 @@ describe('free Uniwind native parity', () => { setPlatformOS('ios'); }); + it.each([false, true])('preserves Text state ownership and errors (frozen=%s)', (frozen) => { + const expectedState = { disabled: true }; + const actualState = { disabled: true }; + if (frozen) { + Object.freeze(expectedState); + Object.freeze(actualState); + } + const expected = () => + capture(original.NativeText, { accessibilityState: expectedState, disabled: false, children: 'label' }); + const actual = () => + capture(optimized.NativeText, { accessibilityState: actualState, disabled: false, children: 'label' }); + if (frozen && reactNativeVersion.minor >= 85 && reactNativeVersion.minor < 88) { + expect(expected).toThrow(TypeError); + expect(actual).toThrow(TypeError); + } else { + expect(actual()).toEqual(expected()); + expect(actualState).toStrictEqual(expectedState); + } + }); + it.each(['NativeView', 'NativeText', 'NativeImage', 'NativeActivityIndicator'] as const)( '%s preserves scoped themes, variables, and style precedence', (name) => { @@ -308,9 +328,14 @@ it('routes animation hooks missing from Uniwind through the native runtime', asy const { code } = await compile( '' ); - expect(code).toMatch(/import[^;]*useAnimatedValueXY[^;]*from "react-native-boost\/uniwind"/); - expect(code).toMatch(/import[^;]*useAnimatedColor[^;]*from "react-native-boost\/uniwind"/); - expect(code).not.toContain('new Animated.'); + if (reactNativeVersion.minor >= 85) { + expect(code).toMatch(/import[^;]*useAnimatedValueXY[^;]*from "react-native-boost\/uniwind"/); + expect(code).toMatch(/import[^;]*useAnimatedColor[^;]*from "react-native-boost\/uniwind"/); + expect(code).not.toContain('new Animated.'); + } else { + expect(code).toContain('new Animated.ValueXY'); + expect(code).toContain('new Animated.Color'); + } }); it('retains classes when removing an eligible Animated wrapper', async () => { diff --git a/packages/react-native-boost/src/plugin/__tests__/static-accessibility.test.ts b/packages/react-native-boost/src/plugin/__tests__/static-accessibility.test.ts index 10fd89df..d59cd107 100644 --- a/packages/react-native-boost/src/plugin/__tests__/static-accessibility.test.ts +++ b/packages/react-native-boost/src/plugin/__tests__/static-accessibility.test.ts @@ -49,7 +49,7 @@ function emittedProps( return new Function(`return ${code}`) as () => Record; } -for (const minor of [83, 84, 85, 86, 87]) +for (const minor of [83, 84, 85, 86, 87, 88]) for (const platform of ['ios', 'android'] as const) { it(`emits release-specific nulls and own keys on ${platform} RN ${minor}`, () => { const text = emittedProps( @@ -72,13 +72,17 @@ for (const minor of [83, 84, 85, 86, 87]) expect(Object.hasOwn(roles, 'accessibilityRole')).toBe(minor < 85); expect(roles.accessibilityRole).toBe(minor === 83 ? null : undefined); expect(Object.hasOwn(first, 'importantForAccessibility')).toBe(minor < 85); - expect(first.accessibilityState).toStrictEqual({ disabled: false, extra: 'kept' }); + expect(first.accessibilityState).toStrictEqual( + minor >= 88 + ? { busy: undefined, checked: undefined, disabled: false, expanded: undefined, selected: undefined } + : { disabled: false, extra: 'kept' } + ); expect(first.accessibilityState).not.toBe(text().accessibilityState); const image = emittedProps('Image', 'alt={null} accessible={false} accessibilityState={null}', platform, minor)(); - expect(image.accessible).toBe(platform === 'ios' || minor < 85); - expect(Object.hasOwn(image, 'accessibilityLabel')).toBe(platform === 'ios' || minor < 85); - expect(Object.hasOwn(image, 'accessibilityState')).toBe(platform === 'ios' || minor < 85); - if (platform === 'ios') expect(image.accessibilityState).toBeNull(); + expect(image.accessible).toBe((platform === 'ios' && minor < 88) || minor < 85); + expect(Object.hasOwn(image, 'accessibilityLabel')).toBe((platform === 'ios' && minor < 88) || minor < 85); + expect(Object.hasOwn(image, 'accessibilityState')).toBe((platform === 'ios' && minor < 88) || minor < 85); + if (platform === 'ios' && minor < 88) expect(image.accessibilityState).toBeNull(); const view = emittedProps( 'View', 'aria-busy={null} aria-disabled={false} accessibilityState={{busy:true, extra:"removed"}} aria-valuenow={0} accessibilityValue={{text:null}}', diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/fallback-semantics/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/fallback-semantics/output.js index f6f9e1e2..e486a8a4 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/fallback-semantics/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/fallback-semantics/output.js @@ -1,10 +1,13 @@ -import { NativeImage as _NativeImage } from 'react-native-boost/runtime'; +import { + processImageSourceProps as _processImageSourceProps, + NativeImage as _NativeImage, +} from 'react-native-boost/runtime'; import { Image } from 'react-native'; const _imageSource = [ { uri: 'logo.png', - width: null, - height: 12, + width: 16, + height: 16, }, ], _imageSource2 = [ @@ -27,26 +30,16 @@ const _imageSource = [ width: 16, height: 16, }, - ], - _imageSource5 = [ - { - uri: 'logo.png', - width: 16, - height: 16, - }, ]; <_NativeImage - style={[ - { - width: 16, + {..._processImageSourceProps({ + source: { + uri: 'logo.png', + width: null, height: 12, }, - { - overflow: 'hidden', - }, - ]} - source={_imageSource} - resizeMode="cover" + width: 16, + })} />; <_NativeImage style={[ @@ -61,7 +54,7 @@ const _imageSource = [ resizeMode: 'contain', }, ]} - source={_imageSource2} + source={_imageSource} resizeMode="contain" />; <_NativeImage @@ -77,7 +70,7 @@ const _imageSource = [ resizeMode: 'contain', }, ]} - source={_imageSource3} + source={_imageSource2} resizeMode="contain" />; <_NativeImage @@ -93,7 +86,7 @@ const _imageSource = [ objectFit: 'fill', }, ]} - source={_imageSource4} + source={_imageSource3} resizeMode="stretch" />; <_NativeImage @@ -109,7 +102,7 @@ const _imageSource = [ tintColor: 'red', }, ]} - source={_imageSource5} + source={_imageSource4} resizeMode="cover" tintColor="red" />; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/request-headers/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/request-headers/output.js index cd67c56f..20826ce8 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/request-headers/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/request-headers/output.js @@ -1,17 +1,9 @@ -import { NativeImage as _NativeImage } from 'react-native-boost/runtime'; +import { + processImageSourceProps as _processImageSourceProps, + NativeImage as _NativeImage, +} from 'react-native-boost/runtime'; import { Image } from 'react-native'; const _imageSource = [ - { - uri: 'https://example.com/logo.png', - headers: { - 'Access-Control-Allow-Credentials': 'true', - 'Referrer-Policy': 'no-referrer', - }, - width: 16, - height: 16, - }, - ], - _imageSource2 = [ { uri: 'logo.png', width: 16, @@ -22,7 +14,7 @@ const _imageSource = [ }, }, ], - _imageSource3 = [ + _imageSource2 = [ { uri: '', width: 16, @@ -30,14 +22,13 @@ const _imageSource = [ }, ]; <_NativeImage - style={[ - {}, - { - overflow: 'hidden', - }, - ]} - source={_imageSource} - resizeMode="cover" + {..._processImageSourceProps({ + src: 'https://example.com/logo.png', + width: 16, + height: 16, + crossOrigin: 'use-credentials', + referrerPolicy: 'no-referrer', + })} />; <_NativeImage style={[ @@ -46,7 +37,7 @@ const _imageSource = [ overflow: 'hidden', }, ]} - source={_imageSource2} + source={_imageSource} resizeMode="cover" />; <_NativeImage @@ -59,6 +50,6 @@ const _imageSource = [ overflow: 'hidden', }, ]} - source={_imageSource3} + source={_imageSource2} resizeMode="cover" />; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/source-array/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/source-array/output.js index 52abbdb1..1e45188d 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/source-array/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/source-array/output.js @@ -1,31 +1,28 @@ -import { NativeImage as _NativeImage } from 'react-native-boost/runtime'; +import { + processImageSourceProps as _processImageSourceProps, + NativeImage as _NativeImage, +} from 'react-native-boost/runtime'; import { Image } from 'react-native'; -const _imageSource = [ - { - uri: 'logo.png', +<_NativeImage + {..._processImageSourceProps({ + source: [ + { + uri: 'logo.png', + width: 16, + height: 16, + scale: 1, + }, + { + uri: 'logo@2x.png', + width: 32, + height: 32, + scale: 2, + }, + ], width: 16, height: 16, - scale: 1, - }, - { - uri: 'logo@2x.png', - width: 32, - height: 32, - scale: 2, - }, -]; -<_NativeImage - width={16} - height={16} - style={[ - {}, - { - overflow: 'hidden', - }, - { + style: { opacity: 0.9, }, - ]} - source={_imageSource} - resizeMode="cover" + })} />; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/src-precedence/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/src-precedence/output.js index a696d1a3..e7d83b86 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/src-precedence/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/src-precedence/output.js @@ -1,19 +1,16 @@ -import { NativeImage as _NativeImage } from 'react-native-boost/runtime'; +import { + processImageSourceProps as _processImageSourceProps, + NativeImage as _NativeImage, +} from 'react-native-boost/runtime'; import { Image } from 'react-native'; -const _imageSource = [ - { - uri: 'https://example.com/src.png', - headers: {}, - width: 20, - }, -]; <_NativeImage - style={[ - {}, - { - overflow: 'hidden', + {..._processImageSourceProps({ + source: { + uri: 'source.png', + width: 16, + height: 16, }, - ]} - source={_imageSource} - resizeMode="cover" + src: 'https://example.com/src.png', + width: 20, + })} />; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/src-prop/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/src-prop/output.js index 9807103b..401bb9b0 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/src-prop/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/src-prop/output.js @@ -1,20 +1,12 @@ -import { NativeImage as _NativeImage } from 'react-native-boost/runtime'; +import { + processImageSourceProps as _processImageSourceProps, + NativeImage as _NativeImage, +} from 'react-native-boost/runtime'; import { Image } from 'react-native'; -const _imageSource = [ - { - uri: 'https://example.com/a.png', - headers: {}, +<_NativeImage + {..._processImageSourceProps({ + src: 'https://example.com/a.png', width: 10, height: 20, - }, -]; -<_NativeImage - style={[ - {}, - { - overflow: 'hidden', - }, - ]} - source={_imageSource} - resizeMode="cover" + })} />; diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/view-props/output.js b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/view-props/output.js index 739677fc..b8ccebe0 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/view-props/output.js +++ b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/fixtures/view-props/output.js @@ -1,4 +1,7 @@ -import { NativeImage as _NativeImage } from 'react-native-boost/runtime'; +import { + processImageAccessibilityProps as _processImageAccessibilityProps, + NativeImage as _NativeImage, +} from 'react-native-boost/runtime'; import { Image } from 'react-native'; const _imageSource = [ { @@ -15,9 +18,6 @@ const _imageSource = [ accessibilityValue={{ text: 'loaded', }} - accessibilityState={{ - selected: true, - }} nativeID="logo" pointerEvents="none" collapsable={false} @@ -27,6 +27,11 @@ const _imageSource = [ borderTopRightRadius={2} borderBottomLeftRadius={3} borderBottomRightRadius={4} + {..._processImageAccessibilityProps({ + accessibilityState: { + selected: true, + }, + })} style={[ { width: 16, diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/index.test.ts b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/index.test.ts index 0663612c..bbdf079d 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/index.test.ts +++ b/packages/react-native-boost/src/plugin/optimizers/native-image/__tests__/index.test.ts @@ -493,7 +493,8 @@ describe('image android output', () => { expect(getStyleDimensionEntries(modernImages[2]!).properties).toHaveLength(0); const unknownOutput = await transformImage(source, 'android', { reactNativeMinor: null }); - const unknownStyle = getAttributeExpression(getNativeImageAttributes(unknownOutput)[0]!, 'style'); + expect(unknownOutput).toContain('processImageSourceProps'); + const unknownStyle = getAttributeExpression(getNativeImageAttributes(unknownOutput)[1]!, 'style'); const unknownDimensions = unwrapRuntimeGate( (unknownStyle as t.ArrayExpression).elements[0] as t.Expression, 'processImageArraySourceDimensions' @@ -515,8 +516,8 @@ describe('image android output', () => { const androidOutput = await transformImage(source, 'android'); expect(androidOutput).toContain('processImageSourceProps'); - // iOS emits the dimensions only once (in the source entry), so it can stay static. - const iosOutput = await transformImage(source, 'ios'); + expect(await transformImage(source, 'ios')).toContain('processImageSourceProps'); + const iosOutput = await transformImage(source, 'ios', { reactNativeMinor: 88 }); expect(iosOutput).not.toContain('processImageSourceProps'); expect(iosOutput).not.toContain('const _imageSource'); expect(iosOutput).toContain('<_NativeImage'); @@ -773,8 +774,8 @@ describe('image consumed props', () => { for (const image of images) { const names = getAttributeNames(image); - expect(names.has('width')).toBe(false); - expect(names.has('height')).toBe(false); + expect(names.has('width')).toBe(platform === 'ios'); + expect(names.has('height')).toBe(platform === 'ios'); expect(names.has('crossOrigin')).toBe(false); expect(names.has('referrerPolicy')).toBe(false); } diff --git a/packages/react-native-boost/src/plugin/optimizers/native-image/index.ts b/packages/react-native-boost/src/plugin/optimizers/native-image/index.ts index 7b07a2f7..b40adf8d 100644 --- a/packages/react-native-boost/src/plugin/optimizers/native-image/index.ts +++ b/packages/react-native-boost/src/plugin/optimizers/native-image/index.ts @@ -220,7 +220,7 @@ const optimizeNativeImage: JSXOptimizer = (path, { logger, options, platform, un return; } - const nativeSource = staticSrcSetSource ?? buildStaticNativeSource(path.node.attributes, platform); + const nativeSource = staticSrcSetSource ?? buildStaticNativeSource(path.node.attributes, platform, reactNativeMinor); const styleInfo = buildStaticStyleInfo(path.node.attributes); logger.optimized({ target: 'Image', path }); @@ -273,7 +273,6 @@ type NativeSource = { sourceAttributes: t.JSXAttribute[]; requestHeaderAttributes: t.JSXAttribute[]; sourceArray: t.ArrayExpression; - consumesSizeProps: boolean; androidHeaders?: t.Expression; width?: t.Expression; height?: t.Expression; @@ -321,7 +320,8 @@ function processImageProps( if (!t.isJSXAttribute(attribute)) return true; if (consumed.has(attribute)) return false; const name = attribute.name.name; - if (nativeSource.consumesSizeProps && (name === 'width' || name === 'height')) return false; + if (name === 'width' || name === 'height') + return reactNativeMinor !== undefined && reactNativeMinor < (platform === 'ios' ? 88 : 85); return name !== 'resizeMode' && name !== 'tintColor'; }); @@ -353,6 +353,12 @@ function processImageProps( } } + if ( + t.isNullLiteral(androidHeaders) && + (!nativeSource.objectSourceHeaders || (reactNativeMinor !== undefined && reactNativeMinor >= 85)) + ) + androidHeaders = undefined; + path.node.attributes = [ ...remaining, ...(accessibilityInfo?.replacements ?? []), @@ -448,12 +454,16 @@ function buildImageAccessibilityInfo( const hasLabelTrigger = hasAlt || directNames.has('aria-label'); const hasHiddenTrigger = directNames.has('aria-hidden'); const hasLabelledByTrigger = directNames.has('aria-labelledby'); - const hasStateTrigger = [...IMAGE_ARIA_STATE_PROPS].some((name) => directNames.has(name)); - // Android drops a nullish `accessible`, so passing the authored value through would emit an - // `accessible={null}` the wrapper never sets. iOS forwards it unchanged, so only Android needs the helper. + const hasStateTrigger = + [...IMAGE_ARIA_STATE_PROPS].some((name) => directNames.has(name)) || + ((reactNativeMinor === undefined || reactNativeMinor >= 88) && directNames.has('accessibilityState')); + // Android 0.85โ€“0.87 drops nullish `accessible`; keep the runtime gate for unknown targets. const accessible = getAttributeExpression(path.node.attributes, 'accessible'); const hasNullableAccessible = - platform === 'android' && accessible !== undefined && !isStaticNonNullishExpression(accessible); + platform === 'android' && + (reactNativeMinor === undefined || reactNativeMinor < 88) && + accessible !== undefined && + !isStaticNonNullishExpression(accessible); if (!hasLabelTrigger && !hasHiddenTrigger && !hasLabelledByTrigger && !hasStateTrigger && !hasNullableAccessible) { return undefined; @@ -600,7 +610,6 @@ function buildStaticSrcSetSource( ), requestHeaderAttributes: requestHeaders.attributes, sourceArray, - consumesSizeProps: true, androidHeaders: t.cloneNode(requestHeaders.headers, true), width: emitsDimensions && width ? t.cloneNode(width, true) : undefined, height: emitsDimensions && height ? t.cloneNode(height, true) : undefined, @@ -647,8 +656,19 @@ function isStaticSrcSetDimension(expression: t.Expression): boolean { function buildStaticNativeSource( attributes: Array, - platform?: string + platform?: string, + reactNativeMinor?: number ): NativeSource | undefined { + // Unknown targets need a runtime gate; dynamic dimensions must not be evaluated twice. + for (const name of ['width', 'height']) { + const value = getAttributeExpression(attributes, name); + if ( + value && + (reactNativeMinor === undefined || + ((platform === 'android' || reactNativeMinor < 88) && !isStaticLiteralTree(value))) + ) + return undefined; + } const requestHeaders = buildRequestHeaders(attributes); if (!requestHeaders) return undefined; @@ -664,12 +684,6 @@ function buildStaticNativeSource( const source = findAttribute(attributes, 'source'); const width = getAttributeExpression(attributes, 'width'); const height = getAttributeExpression(attributes, 'height'); - // On Android the dimensions are emitted twice (source entry AND style), so a non-literal - // expression would be evaluated twice; defer those to the runtime helper instead. - if (emitsAndroidProps) { - if (width && !isStaticLiteralTree(width)) return undefined; - if (height && !isStaticLiteralTree(height)) return undefined; - } const headers = t.cloneNode(requestHeaders.headers, true); return { sourceAttributes: [src, source].filter((attribute): attribute is t.JSXAttribute => attribute !== undefined), @@ -682,7 +696,6 @@ function buildStaticNativeSource( ...(height ? [t.objectProperty(t.identifier('height'), height)] : []), ]), ]), - consumesSizeProps: true, androidHeaders: t.cloneNode(requestHeaders.headers, true), width: emitsAndroidProps && width ? t.cloneNode(width, true) : undefined, height: emitsAndroidProps && height ? t.cloneNode(height, true) : undefined, @@ -704,7 +717,6 @@ function buildStaticNativeSource( sourceAttributes: [source], requestHeaderAttributes: requestHeaders.attributes, sourceArray: t.cloneNode(sourceExpression, true), - consumesSizeProps: false, androidHeaders: getFirstSourceHeaders(sourceExpression), width: dimensionSource ? getObjectPropertyExpression(dimensionSource, 'width') : undefined, height: dimensionSource ? getObjectPropertyExpression(dimensionSource, 'height') : undefined, @@ -717,24 +729,28 @@ function buildStaticNativeSource( const sourceHeight = getObjectPropertyExpression(sourceObject, 'height'); const width = getNullishFallback(sourceWidth, getAttributeExpression(attributes, 'width')); const height = getNullishFallback(sourceHeight, getAttributeExpression(attributes, 'height')); - const sourceArrayObject = buildSourceObject(sourceObject, requestHeaders); + if ( + reactNativeMinor === undefined && + requestHeaders.headers.properties.length > 0 && + hasObjectProperty(sourceObject, 'headers') + ) + return undefined; + const sourceArrayObject = buildSourceObject(sourceObject, requestHeaders, reactNativeMinor); // An object source with generated request headers and a truthy `uri` goes through ImageSourceUtils // as a single-entry ARRAY source, so the width/height ?? prop fallback does not apply: only the // source entry's own dimensions reach the style, and only on Android. Without generated headers it // stays an OBJECT source, whose own dimensions always reach the style and whose inline `headers` // are lifted only on the RN versions that do so โ€” hence the gate. + const uri = getObjectPropertyExpression(sourceObject, 'uri'); const usesGeneratedHeaders = - requestHeaders.headers.properties.length > 0 && hasObjectProperty(sourceArrayObject, 'headers'); + requestHeaders.headers.properties.length > 0 && uri !== undefined && isStaticTruthyForLogicalOr(uri); const arrayDimensionSource = usesGeneratedHeaders && emitsAndroidProps ? sourceArrayObject : undefined; return { sourceAttributes: [source], requestHeaderAttributes: requestHeaders.attributes, sourceArray: t.arrayExpression([sourceArrayObject]), - consumesSizeProps: true, - androidHeaders: usesGeneratedHeaders - ? t.cloneNode(requestHeaders.headers, true) - : getObjectPropertyExpression(sourceArrayObject, 'headers'), + androidHeaders: getObjectPropertyExpression(sourceArrayObject, 'headers'), objectSourceHeaders: !usesGeneratedHeaders, width: usesGeneratedHeaders ? arrayDimensionSource && getObjectPropertyExpression(arrayDimensionSource, 'width') @@ -782,14 +798,22 @@ function buildRequestHeaders(attributes: Array= 88 && sourceHeaders && !isNullishExpression(sourceHeaders)) + headers.properties.push(t.spreadElement(sourceHeaders)); + nativeSource.properties.push(t.objectProperty(t.identifier('headers'), headers)); return nativeSource; } @@ -913,7 +937,7 @@ function findAttribute( } function getObjectPropertyExpression(object: t.ObjectExpression, name: string): t.Expression | undefined { - for (const property of object.properties) { + for (const property of object.properties.toReversed()) { if (!t.isObjectProperty(property) || !t.isExpression(property.value)) continue; if (t.isIdentifier(property.key, { name }) || (t.isStringLiteral(property.key) && property.key.value === name)) { return t.cloneNode(property.value, true); diff --git a/packages/react-native-boost/src/plugin/utils/static-accessibility.ts b/packages/react-native-boost/src/plugin/utils/static-accessibility.ts index 3669284e..d3698ece 100644 --- a/packages/react-native-boost/src/plugin/utils/static-accessibility.ts +++ b/packages/react-native-boost/src/plugin/utils/static-accessibility.ts @@ -55,7 +55,7 @@ export function foldAccessibility( platform?: string, minor?: number ): t.JSXAttribute[] | undefined { - if ((platform !== 'ios' && platform !== 'android') || minor === undefined || minor < 83 || minor > 87) return; + if ((platform !== 'ios' && platform !== 'android') || minor === undefined || minor < 83 || minor > 88) return; const names = new Set(); for (const attribute of path.node.attributes) { if (!t.isJSXAttribute(attribute) || !t.isJSXIdentifier(attribute.name) || names.has(attribute.name.name)) return; @@ -117,14 +117,21 @@ function textProps(props: Props, platform: string, minor: number): Props { ]) delete result[key]; let state = props.accessibilityState as Record | null | undefined; - if (stateKeys.some((key) => props['aria-' + key] != null)) { + const stateDisabled = props['aria-disabled'] ?? state?.disabled; + const resolvedDisabled = props.disabled ?? stateDisabled; + const needsStateUpdate = + resolvedDisabled !== stateDisabled && + ((resolvedDisabled != null && resolvedDisabled !== false) || (stateDisabled != null && stateDisabled !== false)); + if ((minor >= 88 && needsStateUpdate) || stateKeys.some((key) => props['aria-' + key] != null)) { state = state == null ? (Object.fromEntries(stateKeys.map((key) => [key, props['aria-' + key]])) as Record) : merge(props, 'accessibilityState', stateKeys); + if (minor >= 88) state.disabled = resolvedDisabled as Primitive; } - const disabled = (props.disabled ?? state?.disabled) as Primitive; + const disabled = (minor >= 88 ? resolvedDisabled : (props.disabled ?? state?.disabled)) as Primitive; if ( + minor < 88 && disabled !== state?.disabled && ((disabled != null && disabled !== false) || (state?.disabled != null && state.disabled !== false)) ) @@ -177,6 +184,20 @@ function viewProps(props: Props): Props | undefined { function imageProps(props: Props, platform: string, minor: number): Props { const result = { ...props }; const legacy = minor < 85; + if (minor >= 88) { + for (const key of Object.keys(result)) + if (key.startsWith('aria-') || key === 'alt' || key === 'accessibilityState') delete result[key]; + if (props['aria-label'] != null) result.accessibilityLabel = props['aria-label']; + else if (props.alt != null && props.accessibilityLabel == null) result.accessibilityLabel = props.alt; + if (props['aria-labelledby'] != null) result.accessibilityLabelledBy = props['aria-labelledby']; + if (platform === 'ios' && props['aria-hidden'] === true) result.accessible = false; + else if (props.alt != null) result.accessible = true; + if (platform === 'android' && props['aria-hidden'] === true) + result.importantForAccessibility = 'no-hide-descendants'; + if (props.accessibilityState != null || stateKeys.some((key) => props['aria-' + key] != null)) + result.accessibilityState = merge(props, 'accessibilityState', stateKeys); + return result; + } if (platform === 'android' && !legacy) { for (const key of Object.keys(result)) if ( diff --git a/packages/react-native-boost/src/runtime/__tests__/index.test.ts b/packages/react-native-boost/src/runtime/__tests__/index.test.ts index 185ea6f6..7c03d5c6 100644 --- a/packages/react-native-boost/src/runtime/__tests__/index.test.ts +++ b/packages/react-native-boost/src/runtime/__tests__/index.test.ts @@ -253,7 +253,7 @@ describe('getDefaultTextStyle follows the installed RN version', () => { describe('Text accessibility release defaults', () => { afterEach(restorePlatformMock); - it.each([83, 84, 85, 86, 87, undefined])( + it.each([83, 84, 85, 86, 87, 88, undefined])( 'preserves null visibility and state ownership on RN 0.%s', async (minor) => { const runtime = await loadRuntime(minor); @@ -266,8 +266,9 @@ describe('Text accessibility release defaults', () => { 'disabled': false, }); expect(result.accessibilityElementsHidden).toBe(legacy ? true : null); - expect(result.accessibilityState === state).toBe(!legacy); - expect(state.disabled).toBe(legacy); + const mutatesState = minor !== undefined && minor >= 85 && minor < 88; + expect(result.accessibilityState === state).toBe(mutatesState); + expect(state.disabled).toBe(!mutatesState); expect(Object.hasOwn(result, 'accessibilityLabel')).toBe(legacy); if (legacy) { expect( @@ -548,6 +549,7 @@ describe('processImageAccessibilityProps', () => { it.each([ [84, { accessibilityLabel: 'Label', accessible: true }], [85, { accessibilityLabel: 'Label' }], + [88, { accessibilityLabel: 'Label' }], ])('handles a null alt on RN 0.%i', async (minor, expected) => { const runtime = await loadRuntime(minor); expect(runtime.processImageAccessibilityProps({ 'alt': null, 'aria-label': 'Label' })).toEqual(expected); @@ -556,6 +558,7 @@ describe('processImageAccessibilityProps', () => { it.each([ [84, { accessible: null }], [85, {}], + [88, { accessible: null }], ])('handles a null accessible prop on RN 0.%i', async (minor, expected) => { const runtime = await loadRuntime(minor); expect(runtime.processImageAccessibilityProps({ accessible: null })).toEqual(expected); @@ -716,7 +719,7 @@ describe('processImageSourceProps', () => { describe('object-source headers follow the installed RN version', () => { afterEach(restorePlatformMock); - it.each([84, 87])('lifts them on RN 0.%i', async (minor) => { + it.each([84, 87, 88])('lifts them on RN 0.%i', async (minor) => { const runtime = await loadRuntime(minor); const source = { uri: 'logo.png', headers: { Authorization: 'Bearer object' } }; expect(runtime.processImageSourceProps({ source }).headers).toEqual({ Authorization: 'Bearer object' }); @@ -725,6 +728,25 @@ describe('processImageSourceProps', () => { }); }); + it.each([83, 84, 85, 86, 87, 88, undefined])( + 'merges generated headers only from RN 0.88 (target %s)', + async (minor) => { + const runtime = await loadRuntime(minor); + const headers = { 'Authorization': 'Bearer token', 'Referrer-Policy': 'no-referrer' }; + const result = runtime.processImageSourceProps({ + source: { uri: 'logo.png', headers }, + referrerPolicy: 'origin', + }); + expect(result.source[0].headers).toStrictEqual( + minor === undefined || minor >= 88 ? headers : { 'Referrer-Policy': 'origin' } + ); + expect(result.headers).toStrictEqual(result.source[0].headers); + const nullHeaders = minor !== undefined && minor < 85 ? null : undefined; + expect(runtime.processImageObjectSourceHeaders(null)).toBe(nullHeaders); + expect(runtime.processImageSourceProps({ source: { uri: '', headers: null } }).headers).toBe(nullHeaders); + } + ); + it('drops them on RN 0.85, matching the wrapper of that version', async () => { const runtime = await loadRuntime(85); const source = { uri: 'logo.png', headers: { Authorization: 'Bearer object' } }; diff --git a/packages/react-native-boost/src/runtime/index.ts b/packages/react-native-boost/src/runtime/index.ts index 48104e8b..3e57d952 100644 --- a/packages/react-native-boost/src/runtime/index.ts +++ b/packages/react-native-boost/src/runtime/index.ts @@ -111,6 +111,8 @@ function propagatesArraySourceDimensions(): boolean { * build target is unknown. See {@link liftsObjectSourceHeaders}. */ export function processImageObjectSourceHeaders(headers: T): T | undefined { + const minor = getReactNativeMinor(); + if (headers === null && (minor === null || minor >= 85)) return undefined; return liftsObjectSourceHeaders() ? headers : undefined; } @@ -235,7 +237,8 @@ function getImageSourcesFromProps(props: ImageSourceHelperProps): ImageSource | return [{ uri: props.src, headers, width: props.width, height: props.height }]; } if (source != null && source.uri && Object.keys(headers).length > 0) { - return [{ ...source, headers }]; + const minor = getReactNativeMinor(); + return [{ ...source, headers: minor === null || minor >= 88 ? { ...headers, ...source.headers } : headers }]; } return source; } @@ -292,11 +295,20 @@ export function processImageSourceProps(props: ImageSourceHelperProps): Record): Recor // Merge label props: prefer the aria-label if defined. const normalizedLabel = ariaLabel ?? accessibilityLabel; - // Merge the accessibilityState with any provided ARIA properties. + const minor = getReactNativeMinor(); + const copiesState = minor === null || minor >= 88; + const stateDisabled = copiesState ? (ariaDisabled ?? accessibilityState?.disabled) : undefined; + const resolvedDisabled = disabled ?? stateDisabled; + const needsStateUpdate = + resolvedDisabled !== stateDisabled && + ((resolvedDisabled != null && resolvedDisabled !== false) || (stateDisabled != null && stateDisabled !== false)); let normalizedState = accessibilityState; - if (ariaBusy != null || ariaChecked != null || ariaDisabled != null || ariaExpanded != null || ariaSelected != null) { + if ( + (copiesState && needsStateUpdate) || + ariaBusy != null || + ariaChecked != null || + ariaDisabled != null || + ariaExpanded != null || + ariaSelected != null + ) { normalizedState = normalizedState == null ? { busy: ariaBusy, checked: ariaChecked, - disabled: ariaDisabled, + disabled: copiesState ? resolvedDisabled : ariaDisabled, expanded: ariaExpanded, selected: ariaSelected, } : { busy: ariaBusy ?? normalizedState.busy, checked: ariaChecked ?? normalizedState.checked, - disabled: ariaDisabled ?? normalizedState.disabled, + disabled: copiesState ? resolvedDisabled : (ariaDisabled ?? normalizedState.disabled), expanded: ariaExpanded ?? normalizedState.expanded, selected: ariaSelected ?? normalizedState.selected, }; } - // Reconcile `disabled` with `accessibilityState.disabled`. When the two are out of sync (and not - // both falsy) the explicit `disabled` prop wins and is mirrored back into the state object, so the - // native host receives a consistent value on both fields. - const minor = getReactNativeMinor(); - // RN 0.85 removed the legacy Text path, which copied state and treated aria-hidden null as absent. + // RN 0.85โ€“0.87 mutates conflicting state; 0.88 copies only the five native fields. const legacy = minor !== null && minor < 85; - const stateDisabled = normalizedState?.disabled; - const normalizedDisabled = disabled ?? stateDisabled; + const mergedDisabled = normalizedState?.disabled; + const normalizedDisabled = copiesState ? resolvedDisabled : (disabled ?? mergedDisabled); if ( - normalizedDisabled !== stateDisabled && - ((normalizedDisabled != null && normalizedDisabled !== false) || (stateDisabled != null && stateDisabled !== false)) + !copiesState && + normalizedDisabled !== mergedDisabled && + ((normalizedDisabled != null && normalizedDisabled !== false) || + (mergedDisabled != null && mergedDisabled !== false)) ) { if (legacy || normalizedState == null) normalizedState = { ...normalizedState, disabled: normalizedDisabled }; else normalizedState.disabled = normalizedDisabled; @@ -548,42 +571,55 @@ export function processImageAccessibilityProps(props: Record): Reco } = props; const result = restProperties; - const normalizedLabel = ariaLabel ?? accessibilityLabel ?? alt; - if (normalizedLabel !== undefined) result.accessibilityLabel = normalizedLabel; - - if (Platform.OS === 'android') { - const normalizedLabelledBy = ariaLabelledBy ?? accessibilityLabelledBy; - if (normalizedLabelledBy !== undefined) result.accessibilityLabelledBy = normalizedLabelledBy; - } else if (accessibilityLabelledBy !== undefined) { - result.accessibilityLabelledBy = accessibilityLabelledBy; - } - - // RN 0.85 changed Android from undefined checks to nullish checks. - if (Platform.OS === 'ios') { - if (ariaHidden === true) { - result.accessible = false; - } else if (alt !== undefined) { - result.accessible = true; - } else if (accessible !== undefined) { - result.accessible = accessible; + const minor = getReactNativeMinor(); + const modern = minor === null || minor >= 88; + if (modern) { + for (const key of ['accessible', 'accessibilityLabel', 'accessibilityLabelledBy', 'importantForAccessibility']) { + if (Object.hasOwn(props, key)) result[key] = props[key]; } + if (ariaLabel != null) result.accessibilityLabel = ariaLabel; + else if (alt != null && accessibilityLabel == null) result.accessibilityLabel = alt; + if (ariaLabelledBy != null) result.accessibilityLabelledBy = ariaLabelledBy; + if (Platform.OS === 'ios' && ariaHidden === true) result.accessible = false; + else if (alt != null) result.accessible = true; + if (Platform.OS !== 'ios' && ariaHidden === true) result.importantForAccessibility = 'no-hide-descendants'; } else { - const minor = getReactNativeMinor(); - const usesUndefinedChecks = minor !== null && minor <= 84; - if (usesUndefinedChecks ? alt !== undefined : alt != null) { - result.accessible = true; - } else if (usesUndefinedChecks ? accessible !== undefined : accessible != null) { - result.accessible = accessible; + const normalizedLabel = ariaLabel ?? accessibilityLabel ?? alt; + if (normalizedLabel !== undefined) result.accessibilityLabel = normalizedLabel; + + if (Platform.OS === 'android') { + const normalizedLabelledBy = ariaLabelledBy ?? accessibilityLabelledBy; + if (normalizedLabelledBy !== undefined) result.accessibilityLabelledBy = normalizedLabelledBy; + } else if (accessibilityLabelledBy !== undefined) { + result.accessibilityLabelledBy = accessibilityLabelledBy; } - } - if (ariaHidden === true && Platform.OS !== 'ios') { - result.importantForAccessibility = 'no-hide-descendants'; - } else if (importantForAccessibility !== undefined) { - result.importantForAccessibility = importantForAccessibility; + // RN 0.85 changed Android from undefined checks to nullish checks. + if (Platform.OS === 'ios') { + if (ariaHidden === true) { + result.accessible = false; + } else if (alt !== undefined) { + result.accessible = true; + } else if (accessible !== undefined) { + result.accessible = accessible; + } + } else { + const usesUndefinedChecks = minor !== null && minor <= 84; + if (usesUndefinedChecks ? alt !== undefined : alt != null) { + result.accessible = true; + } else if (usesUndefinedChecks ? accessible !== undefined : accessible != null) { + result.accessible = accessible; + } + } + + if (ariaHidden === true && Platform.OS !== 'ios') { + result.importantForAccessibility = 'no-hide-descendants'; + } else if (importantForAccessibility !== undefined) { + result.importantForAccessibility = importantForAccessibility; + } } - if (Platform.OS === 'ios' && accessibilityState !== undefined) { + if (!modern && Platform.OS === 'ios' && accessibilityState !== undefined) { result.accessibilityState = accessibilityState; } else if ( accessibilityState != null || From 85cec9bfde66077a7ab3b05bc7128c2423b553fe Mon Sep 17 00:00:00 2001 From: Maximilian Krause Date: Sun, 13 Sep 2026 15:54:23 +0200 Subject: [PATCH 55/56] ci: remove v2 branch from CI --- .github/workflows/build-example.yml | 1 - .github/workflows/ci.yml | 1 - 2 files changed, 2 deletions(-) diff --git a/.github/workflows/build-example.yml b/.github/workflows/build-example.yml index 686c9488..e1702ffe 100644 --- a/.github/workflows/build-example.yml +++ b/.github/workflows/build-example.yml @@ -4,7 +4,6 @@ on: push: branches: - main - - v2 paths: &paths - 'apps/example/**' - 'packages/react-native-boost/**' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ce7c8f53..a5b75736 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,7 +3,6 @@ on: push: branches: - main - - v2 pull_request: branches: - main From de18dd0988ee5dd0bd1df82b82b30b66b6f84fc2 Mon Sep 17 00:00:00 2001 From: Maximilian Krause Date: Sun, 13 Sep 2026 16:00:31 +0200 Subject: [PATCH 56/56] docs: update domain --- README.md | 12 ++++++------ apps/docs/app/layout.tsx | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 8ff8eb86..8fc8f42c 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ It eliminates unnecessary runtime work, replaces JavaScript abstractions with mo ## Documentation -The documentation is available at [react-native-boost.oss.kuatsu.de](https://react-native-boost.oss.kuatsu.de). +The documentation is available at [boost.kuatsu.de](https://boost.kuatsu.de). ## Benchmark @@ -37,7 +37,7 @@ The documentation is available at [react-native-boost.oss.kuatsu.de](https://rea

-See the [benchmarks page](https://react-native-boost.oss.kuatsu.de/docs/information/benchmarks) for Android results and the full methodology. +See the [benchmarks page](https://boost.kuatsu.de/docs/information/benchmarks) for Android results and the full methodology. ## Compatibility @@ -53,7 +53,7 @@ For older React Native versions, you can install `react-native-boost@^0`. Please ## Installation -Install the package using your favorite package manager. Please **do not** install the package as a development dependency. While the Babel plugin itself would work as a development dependency, it relies on importing the runtime library (`react-native-boost/runtime`) into your code, which requires the package to be installed as a regular dependency. Read more [here](https://react-native-boost.oss.kuatsu.de/docs/runtime-library/). +Install the package using your favorite package manager. Please **do not** install the package as a development dependency. While the Babel plugin itself would work as a development dependency, it relies on importing the runtime library (`react-native-boost/runtime`) into your code, which requires the package to be installed as a regular dependency. Read more [here](https://boost.kuatsu.de/docs/runtime-library/). ```sh npm install react-native-boost @@ -76,7 +76,7 @@ If you don't see the `metro.config.js` file, run this command first: npx expo customize metro.config.js ``` -If you're using Unistyles, Nativewind, or a bundler other than Metro, see the [documentation](https://react-native-boost.oss.kuatsu.de/docs) for setup instructions. +If you're using Unistyles, Nativewind, or a bundler other than Metro, see the [documentation](https://boost.kuatsu.de/docs) for setup instructions. Finally, restart your React Native development server and clear the bundler cache: @@ -88,11 +88,11 @@ yarn start --clear That's it! No imports in your code, rebuilding, or anything else is required. -Optional configuration is described in the [documentation](https://react-native-boost.oss.kuatsu.de/docs/configuration/configure). +Optional configuration is described in the [documentation](https://boost.kuatsu.de/docs/configuration/configure). ## How it works -A [short overview of how the plugin works](https://react-native-boost.oss.kuatsu.de/docs/information/how-it-works) can be found in the documentation. +A [short overview of how the plugin works](https://boost.kuatsu.de/docs/information/how-it-works) can be found in the documentation. ## Contributing diff --git a/apps/docs/app/layout.tsx b/apps/docs/app/layout.tsx index 67dee669..73962940 100644 --- a/apps/docs/app/layout.tsx +++ b/apps/docs/app/layout.tsx @@ -8,7 +8,7 @@ const inter = Inter({ }); export const metadata: Metadata = { - metadataBase: new URL('https://react-native-boost.oss.kuatsu.de'), + metadataBase: new URL('https://boost.kuatsu.de'), title: { default: 'React Native Boost', template: '%s | React Native Boost',