From a8a8f4a1fbe5e854198c21df4e11d1e6af20f3ae Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Thu, 13 Mar 2025 18:40:41 -0700 Subject: [PATCH 01/13] Switch from `react` to `preact` --- src/js/bun.lockb | Bin 102858 -> 103200 bytes src/js/package.json | 3 ++- src/js/src/components.ts | 4 ++-- src/js/src/mount.tsx | 3 +-- src/js/tsconfig.json | 24 ++++++++++++++++++++++++ tests/test_app/tests/utils.py | 11 ++++++++++- 6 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 src/js/tsconfig.json diff --git a/src/js/bun.lockb b/src/js/bun.lockb index 0bb863ce6fe213b5ee701cee3732b5011ecc3a6d..2e9333e3b8b75b035f92390e89bce003ef290ceb 100644 GIT binary patch delta 18331 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 delta 18398 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 HHuwJkqC#a9 diff --git a/src/js/package.json b/src/js/package.json index bfcdb72c..eda9dd6f 100644 --- a/src/js/package.json +++ b/src/js/package.json @@ -15,6 +15,7 @@ "@pyscript/core": "^0.6", "@reactpy/client": "^0.3.2", "event-to-object": "^0.1.2", - "morphdom": "^2.7.4" + "morphdom": "^2.7.4", + "preact": "^10.26.4" } } diff --git a/src/js/src/components.ts b/src/js/src/components.ts index 176a1f30..71f72da5 100644 --- a/src/js/src/components.ts +++ b/src/js/src/components.ts @@ -1,6 +1,6 @@ import { DjangoFormProps, HttpRequestProps } from "./types"; -import React from "react"; -import ReactDOM from "react-dom"; +import React from "preact/compat"; +import ReactDOM from "preact/compat"; /** * Interface used to bind a ReactPy node to React. */ diff --git a/src/js/src/mount.tsx b/src/js/src/mount.tsx index a3a02087..e2c19763 100644 --- a/src/js/src/mount.tsx +++ b/src/js/src/mount.tsx @@ -1,6 +1,5 @@ import { ReactPyDjangoClient } from "./client"; -import React from "react"; -import ReactDOM from "react-dom"; +import ReactDOM from "preact/compat"; import { Layout } from "@reactpy/client/src/components"; export function mountComponent( diff --git a/src/js/tsconfig.json b/src/js/tsconfig.json new file mode 100644 index 00000000..1293173f --- /dev/null +++ b/src/js/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "jsx": "react-jsx", + "jsxImportSource": "preact", + "target": "esnext", + "module": "esnext", + "moduleResolution": "node", + "composite": true, + "allowJs": false, + "allowSyntheticDefaultImports": true, + "declaration": true, + "declarationMap": true, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, + "lib": ["DOM", "DOM.Iterable", "esnext"], + "noEmitOnError": true, + "noUnusedLocals": true, + "resolveJsonModule": true, + "skipLibCheck": false, + "sourceMap": true, + "strict": true + } +} diff --git a/tests/test_app/tests/utils.py b/tests/test_app/tests/utils.py index f1fb4bd9..dc3cb9dd 100644 --- a/tests/test_app/tests/utils.py +++ b/tests/test_app/tests/utils.py @@ -117,7 +117,16 @@ def start_playwright_client(cls): cls.browser = cls.playwright.chromium.launch(headless=bool(headless)) cls.page = cls.browser.new_page() cls.page.set_default_timeout(10000) - cls.page.on("console", lambda msg: _logger.error("error: %s", msg.text) if msg.type == "error" else None) + cls.page.on("console", cls.playwright_logging) + + @staticmethod + def playwright_logging(msg): + if msg.type == "error": + _logger.error(msg.text) + elif msg.type == "warning": + _logger.warning(msg.text) + elif msg.type == "info": + _logger.info(msg.text) @classmethod def shutdown_playwright_client(cls): From 78b2d78aa3e7135d1d336d5f7f4af74b6ecf7237 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sat, 14 Jun 2025 03:40:41 -0700 Subject: [PATCH 02/13] attempt bumping preact and removing "jsx" from tsconfig --- src/js/bun.lockb | Bin 103200 -> 103200 bytes src/js/package.json | 2 +- src/js/tsconfig.json | 1 - 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/js/bun.lockb b/src/js/bun.lockb index 2e9333e3b8b75b035f92390e89bce003ef290ceb..ccbbe604a37444dfe536446251f4df10eb3663fe 100644 GIT binary patch delta 148 zcmV;F0BirCrUsy<29Pcw6-t1VsM0-g4p={9aBH^qA~U%vjdC$U5k8LGjZGa!u}+E* z0SS|V5GRrn39|_iqGltTcQuaX-MCJvMfo=cG%`Es-#@En(KG0Xeq>3;_^1mvVXmAh$F{0qjjf C^*fsY delta 146 zcmV;D0B!%ErUsy<29PcwuRRPsYLuZtSW;cdfJ6B+(Oz~7c9E>5rjvb#u}+E* zlN1vuk`f8C2@&K^Kq#0_?65^nGyB!wH@3CDB3a{ZkFrX}fPg30IdvtNY{}y&7(HpS zvTpmz4j!8a=A%8^+ib5Nk}OnF+l5Al=d&$g)~W$Cw*(9U5IL9Pa{(Z?G(`dIO&R+^ AsQ>@~ diff --git a/src/js/package.json b/src/js/package.json index eda9dd6f..c853a3a1 100644 --- a/src/js/package.json +++ b/src/js/package.json @@ -16,6 +16,6 @@ "@reactpy/client": "^0.3.2", "event-to-object": "^0.1.2", "morphdom": "^2.7.4", - "preact": "^10.26.4" + "preact": "^10.26.9" } } diff --git a/src/js/tsconfig.json b/src/js/tsconfig.json index 1293173f..a276577e 100644 --- a/src/js/tsconfig.json +++ b/src/js/tsconfig.json @@ -1,7 +1,6 @@ { "compilerOptions": { "esModuleInterop": true, - "jsx": "react-jsx", "jsxImportSource": "preact", "target": "esnext", "module": "esnext", From 8fc2e97de8b0865487cd7a41360fc525c0474ea0 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sat, 14 Jun 2025 03:46:10 -0700 Subject: [PATCH 03/13] add react to paths --- src/js/bun.lockb | Bin 103200 -> 103555 bytes src/js/package.json | 4 +++- src/js/tsconfig.json | 7 ++++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/js/bun.lockb b/src/js/bun.lockb index ccbbe604a37444dfe536446251f4df10eb3663fe..494ed8815d2bdd4619ab9f9e202036909b2ddf7c 100644 GIT binary patch delta 14637 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 delta 14270 zcmeHOdw5mFwcm4+1KEK<5<*T+P6A1IBqZd`;RHgmArO#2P(%vhC8rV~f+QqBc~o*x zQK}-3fsPRoB0jLTzS4r$@{+b*v>;Hmgn$qqwRi=^`dN!2_qS$dheV0({XYM6f3EY} zYt5ROHEXST>@eQ>REOx-n^mr~bOXBR~jK5%Mn zY5d6b8<`=W4U>900+%-|O{g6UzN=vbx}u~raCT*Nx&M~AMuC=p0J#Y{Nf$xpbr?n% z_>3m6W}0aE=M|4;qPDi@?0wN7O~3JO9|Fs6fQ z*wQ%Xmh`!mmGcZQAI6ev`-G@&VxdjVe~Rv-fr-$L0ycr~4h#kF0(O8N$*Zc%7cHtN zua1LR-N2XE%&%C0@zlc>>Q!j$g+_^AtN9a}KccWUFu#1s0<>Z5g@DF0tGv7_y`si= z9K0L+N>n6&7IjjF9)}X~10z(!DL|+Os-Z{zD+Tre-ddBs%zxW_!(Tn8%3obmZb43Z z6*cK|=2!mIm+D{iY;WR$>-R346cG_WRq%;93|`8h{&;%c~(%I1|XTS9|R z#Yl;tJ>S1*QTZ%`@$4YiAP+?3yYd=%8UUR9l|)Yd@1UNwn-WxvmjlsN zpaG532xj|h7A-`7)#Zz8DrPS;t|TgZjwY%8<9eyS_Jb$=&8UYC0?UCgEikdSVIW@u zRp4n{Gj+Se5ic5-4+v3h;G%j7ybpx;0=0eBz(%2za-tuQ8r})pDJjn+t6^M7H4LOf zpd?KhQr=I==TuhBg58D-Jhg}6SN;s1yS~5Tr$J63el>-#R!-Vc+#(^@mJSY`Zl4x^^ylG`C#x=uQ!nD89*A?#T27ZR@j!WMtnxQcsr0Rzfa=|AayhhNXgX? zNF!Xwk9Ba>HWeBMayoDfNZlL+lK+;%sl?0G7t72%@MKmQko-IbNP1o^pFd0u`zVl7 zv;mc=JOt&$A1qS!5{Ii{+y_KEwSm4PlzD4_)Zt2vaCl8Q)=A)P{wnwuavIhpRHX5r z15zMnRo=3wx?(~3r>IQBY6MdG0nOX%ZOiHcCsIFZtw0Ldi-o;72_V%k9;*fbnT!X`v(EgskWOZ9sgfi$tO_~Pk$}6L?)W%lQCgk-UCSE(Yz7AwcPEp*lu3t zvYh8T8b%(U9+A&7cq629xjV*k{yM}kig`TjzsT!iESAF?@q0UWyDjHmOvAW=pLXT5 z{=Cj@v01zkzn^n=tYtop*bI?YCc1s>LtY12Ix>!APF^4DV-?)(vCMb1%;1UeL=Rr) zv7A#d(X#mT=zQnBc)O0DhE2zLS)9c}cwL<3yb<$dB#-ZwZ$5}O@*~C?;bYCbEZzzk zinOC%_{BG}$d%^LAwYHpm~_Z~aO9p~ULWBzDaos48B8(*;0DUF<`|#33tS#J2X9Ww z3kEZS$4BRzIhZd>DKXk-R)eG7pcLtIJ_D|hPmjwtKgQbt$elb9@&shqV6vD^;dKcX z+rk?YEc0zhF`ok+q+wB*KGd$0a>ASmj>=?)n2%_#gDg7*jto?|{rWd;$34M3*@@yvq9Uy1sHY;a6~Xvc=xyWyzMAgcXwFExn5DZA8fn+?`^XU+EI~tFO=W z#vwDIr@Xfs99azy!Lxh7<;XIBck~OcKRCn>R(NpAAbUHK6=nb&X*y(lUTEQ{mG{As z^{5BV*F()o)x$Dyx*SIGX1U>AS88 zDu#$doR5v+b^R@KCu9_xVD5*tr@&ELu-4^sM&V3z1I;0G7T%^wIr0PRPh+~pBDp)m zGK-T`JQ%Ok4}Lb%H!SnW?C;bQfMJE3wc?lWj+VlMCd|>xH@|)Z)1H* z_L&R8jhF4fhmKcz^Vrxz^Is6stb=iJKJzCy4~+u{cfmoAfuk~T81`k&DVG%VRZdVH ztpTT|I}PO(?#{8yPRWLGBWefJ0%9%&_Y-h33)x4!F~@RTN#(J*g=SfrJq}tIw}B&H zGa2dA;Ak4iZm>eS2UzAbqy>3bMSnfGBB_Cu#yk#=3{kZ^r`sG2U?ez-gTd>u@~z}` zUW@&KH+n78%uvHdtrVX*58PzcBJ4Q`Zmi@epSor$kHVg;ykIal@zdUX^Dy2hlyY=t zKUhpDsHWyRaO4NYMP=J2A+(Nh+5Dup(76UeOm8%F6mQrkNg1PwMS7~yP#)X_PI-p> zv=N-P3oGn9ym63a_R6)LOd88tILd`Lz$tx{VOMM%Y?(iU8^v_ku*@5M zs#HbpIdHTVz?W!;8lgC1`9}&B@v=h8ya%!&s%?q{xSJ$L{kjIhXW-hXgIU315;3nH;>%=f^4?bqiD^vU_FhBJ9KFQkQmlUOx(kG9M|L8ih& z>K??Hl1(l3<=~JZ#KF9+;FMFFd*+3J(a}WiV~sAc%pEvhB9Q~8TpLSZAlVoqca4pB zB^!~8h}{uzq!}uAhM>{P3s?rx&3JH>QK*Nk-N4JnTISy%Lt?;(@P#uH77pXnaTc4v z-K7?Lh?kXG=9`d`XR#J}d}hp;*0z*_qc*YZqKCEMFi`?s$TIdvUN_Eid_9Jr99L*g zfsfVrY3q56*IjQpJ{-$WUSDVq$I%#*kJ>=~EaPQ2SnOq9cSC+{s3Fhs_-%^}d?yfL zXAnJv!Ju%BQ9uVM8bl8v>Elo$A3`d3D^{Y3_aw~&YvpSzfouS~mV5}QQ!J;PH}BKZ;!J%nV~ zQeyD5Ac8KR76CY_xC}%UR)FaFK4kp18(sY2DKY%lQ$j#7{M3|?2&%nG)>X*(8&RQPiv&sH%h5O(&L){9^~^TMEI#sp>+wV?t_{q zq_!Udk$ek?9zxc&4ko*}9r1~Bz=X)l)YRSk1;(&?tqmf!q*76h}@fkp>oeQL125KAx z#DB(M%@+`ZhmiD!0;%^AnjZzEen&GzhYCs|poft7@fs&;IU&i*G*3vcQ#4N1azc8Y zh9Bx+29ON!1F3$wme0}hTN&md6)ez#g+TmgRBL{*#-$opXj};lf!^If>Szs+*2hgi zdI+gwq50NGq6c;PmRhZ_MGGDQl0lDZ{&CGerSUgF{AWCa9}3BDfn9*F04X%D0y_ea z0Lh?}Kx*$DAQ^fVNRN$S_6s57rziEKe?>6P>1yYJ)XhJEy@4*Yfmb62NX^CKhsGIC zj7ECxsrhRm6(#C<WEb^T1mAgRGIJ1+9@f%FuE`s+b8Rd5)HU8&O1m9g}3g+er1l zyR+(y_yM<8>aX=yD-G`@rG`OBfy&f;rra4?3-B&Ss1^SITdS)0-7WXKa@tvIfAFnU z8~$JJtkKupVt?FP4P!eTNjY0j4*hX!{c&qW8Vp53(E9%4)=FC}&5j?pRyYCAHMZ7~ zKg`zJ&^U9}Px$8DWB8igVf_5=G3+uQ^x`C*_hJ~|`r;VJ6{F#!7n6cm91r_Lvhzc1 zv0)AMdv0bMe;>@M8@BFw&%u`PRr|Mv&5f5EbD$d7r6K!JzN2CN>mM`w=S`~7eK7vI zf`1wb$U)(UV!Wau{m>YPZaVwW|B_-u;P79vLjUKo((C^Xzvr6*wU>T#MLkq<3Pdf? zp@trtr{e=1a_Bh?qF35=`+?|r2ShTOYgr(A&VWcZ`5WR4;{;O;gbrDpn^TxDAfbjA zUK!kljwo56Y|uX$zx&F)4zIB}k|i-~vzPT`?#&ZfuUb09bp>Il^6=9K+R304P%4PR znE={}@~1$*0zC@a0on?B1hfrA-(_?fqm!8jL?0Brzm1aT0Z zbNYZ%K;+a^P#UN|CfY z=mTU3=ueRS8T2aX5a>0~>!72cW1zo+n#5(sTw(9x^*zx0pmQS8ftxXL)B148ZQc6)H#M_-%stE4P zvc$N~ESANIiq0&TWs0qxncGtUeI!_5_FF3!+_mpFI~;6ARz_|Hj+0}>vCgcNbrn6s zSgvQR)?3`6{*K|Rcdm5=)3*fvf)tPnZgF=Q+WtV)hcP$nCl+=Actrt0k@y5Hv=w^n zYfb;yd2iRZ-|kR_F$JlA9&S_FW8XKLcy?tVX??d1(!T5rIQ>(x53PIb3rMegJ@ZEY z-~69xgUaKFkWSj`TuBVife+ z?>5ROv=*)BX27k6VPC%b$ApawKYnJ@tGWd4 zZeyP~8_wo>+gG-4X}!GtT#V<>YaLey-5_p{fZg`B0MX0pe{w;A8w%MOIT<+ZH;U(> z0J~q0fLB7q72-U?9f=^@w;XP2TAq>?mp9wN`e5>fBgly1FzAgDt0DnqVhg}yUzSL7 zRq<&PmR-=DAT~?I8<8xH-66h;WQlB@i0_74JB6%z z=f}N<Iq=_bi0itU(z!Jj=O2x}?nOGl+lpWm2~<+2#E*eN*DWNVpJ_d;m=%rJ(iL36UKGGmncg z0FQl>ZqoQSOQ(N!s2Q~|@u=27Q5%DFQCH^hm-emAC-3U`UM>`JGP23cjp8sAScyPu zZZ=VP+^p1NUx3SevT*<3SO4^OX@#81P2x^BTg6rjXDp&2y%a4fVp%*}FYbwj<5R^a zv1rI6Ob?oUT@-l0$)H4w+dQnhInAT)JAEd?hD*hLq~Q^OIY`&!IP{;|Lme4H&rOQA zw%>mV{nM<(c-|B1;$(wQ#i99K;xssqGeI3gj!pj6(b1o8`@q3gVr&^$@?{#h*>aH< zk6N2VaXc$^TuBt0;@McXUo?~SsQ3!tv9G}8_q=Y#@{J{9qz`3EO%$0u&{>hVr3c%> zd?I3muv;!scKGN&i2 z>rY3-^Jy%qLpG(;8R0LacOT||KM|jRrtMo&p9WsPA+_(nAJR=jd72mx1!U~_!O*jB zRlT55z5eJ4q!M-5YHTaQtZ_bGe=w>lV z2a6qv$V&Sz-lJU}d};C8mxo?em?kb#Pvzob1}5g;`!H89s#S?qgCMewg^q`iFX5EmrchH^KP;nNAJ6X1HmC=X;XVV0_BGI#mwq(<#K_B*_9Ipx zOt*9xY+v&<27SKd(NXuUxaw%_#pU86(#g||DkfHjkNnR#3l=@`mezv{KN1U5nA`DH zmbgEK#k7~7$g)mi9~4z|qG=wKh++L8(4Y*mxk@pW%G9EuqN^v9O7rg-*#&_Np&++f zR<6-P`)%tIrbDLZl`;hz7nV7eN22^{}>T+ii=7iBAUnH!1tDNY92| zJ0n9JtHp+_tF5bk9j%5-CTiQR`jUjwQaKOxp!R2CP|2bx^J)zp1fB5huWC9jOR}U} zq(N<}k_FVK)Qb*AK%|SiJ8^(8^boJP6wBGWP59vhCR4a|?rLAFg-5)bZO5clq?lgD zwFk6OSA}iDYAdTv6E?T@Y>UCUDhZ-GknL)ll4nGOU^rPU9x!DH&f%WO29-qA0HD1 zUf9$mCV8=!$uF)bvCYez`kPJc^(x<8&C^zM>>9?$tJ&A4q*aXuae5$lH}NUbm+mBXL}~Pn@R{UHb=c)Vi>iE_ zP$I-H@{uj_M3altFYQDaL?@iea0I1ufEY4_4fNPo+qb_qC;a^HgKw5;mqnjZYs6Yo z)&psot#aRi@ap0zQVPDEfA$*O5+j)ivaxm-5|t~ox?IC|-=1%}z3=-h&8DxF6XJ3q z{Ak~McXyc7+mo_n6GoYp;iIpKnIhZ5D67O6fXBW+Uo&>z#F@kISS|H(NH0{>lAiij zh4Y3D$CiS*kR}e3JWqUR*`KKNCD-03Y92mH(AovDb?CP~QF{(UxDvz!0{v~OK1vaR z?|zSZ+W#J{7X?LVqe(0*LKiKcU+B=y+J14#QMlP!F?Bfm-8H{zSg}}k^;1Xuc?1HT zB%1NP!*az}C<&cG|7w9}#t4yD%!a0}(fk_vqahyrAvLcsAv>X_VtIMx?EZN3&!_)c cYj&vESgA1-D)#)?|bI_`dcBRkIi53NRcz5oCK diff --git a/src/js/package.json b/src/js/package.json index c853a3a1..d9df0da3 100644 --- a/src/js/package.json +++ b/src/js/package.json @@ -1,5 +1,6 @@ { "type": "module", + "version": "1.0.0", "scripts": { "format": "prettier --write . && eslint --fix", "check": "prettier --check . && eslint" @@ -9,7 +10,8 @@ "@types/react-dom": "^18.2.18", "eslint": "^9.13.0", "eslint-plugin-react": "^7.37.1", - "prettier": "^3.3.3" + "prettier": "^3.3.3", + "bun-types": "^0.5.0" }, "dependencies": { "@pyscript/core": "^0.6", diff --git a/src/js/tsconfig.json b/src/js/tsconfig.json index a276577e..6793d431 100644 --- a/src/js/tsconfig.json +++ b/src/js/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { "esModuleInterop": true, + "jsx": "react-jsx", "jsxImportSource": "preact", "target": "esnext", "module": "esnext", @@ -18,6 +19,10 @@ "resolveJsonModule": true, "skipLibCheck": false, "sourceMap": true, - "strict": true + "strict": true, + "paths": { + "react": ["./node_modules/preact/compat"], + "react-dom": ["./node_modules/preact/compat/"] + } } } From c59c688ffb500fc7e40336b15aff2353ab4e9a11 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sat, 14 Jun 2025 03:48:46 -0700 Subject: [PATCH 04/13] Try using non-compat render function --- src/js/src/mount.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/js/src/mount.tsx b/src/js/src/mount.tsx index e2c19763..19037a25 100644 --- a/src/js/src/mount.tsx +++ b/src/js/src/mount.tsx @@ -1,5 +1,5 @@ import { ReactPyDjangoClient } from "./client"; -import ReactDOM from "preact/compat"; +import { render } from "preact"; import { Layout } from "@reactpy/client/src/components"; export function mountComponent( @@ -75,5 +75,9 @@ export function mountComponent( } // Start rendering the component - ReactDOM.render(, client.mountElement); + if (client.mountElement) { + render(, client.mountElement); + } else { + console.error("Mount element is not defined. Cannot render the component."); + } } From 9d63a8ae8c16df568d86f3e1f22a2c5abe8f8b01 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sat, 14 Jun 2025 03:54:16 -0700 Subject: [PATCH 05/13] Avoid all functions from preact/compat --- src/js/src/components.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/js/src/components.ts b/src/js/src/components.ts index 71f72da5..65ed78cb 100644 --- a/src/js/src/components.ts +++ b/src/js/src/components.ts @@ -1,17 +1,16 @@ import { DjangoFormProps, HttpRequestProps } from "./types"; -import React from "preact/compat"; -import ReactDOM from "preact/compat"; +import { useEffect } from "preact/hooks"; +import { render, createElement } from "preact"; /** * Interface used to bind a ReactPy node to React. */ export function bind(node) { return { - create: (type, props, children) => - React.createElement(type, props, ...children), + create: (type, props, children) => createElement(type, props, ...children), render: (element) => { - ReactDOM.render(element, node); + render(element, node); }, - unmount: () => ReactDOM.unmountComponentAtNode(node), + unmount: () => render(null, node), }; } @@ -19,7 +18,7 @@ export function DjangoForm({ onSubmitCallback, formId, }: DjangoFormProps): null { - React.useEffect(() => { + useEffect(() => { const form = document.getElementById(formId) as HTMLFormElement; // Submission event function @@ -64,7 +63,7 @@ export function DjangoForm({ } export function HttpRequest({ method, url, body, callback }: HttpRequestProps) { - React.useEffect(() => { + useEffect(() => { fetch(url, { method: method, body: body, From 1f7efab555f3c3b8aff0a5125f1d5d9909a2f5e9 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sat, 14 Jun 2025 03:59:17 -0700 Subject: [PATCH 06/13] more tsconfig changes --- src/js/tsconfig.json | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/js/tsconfig.json b/src/js/tsconfig.json index 6793d431..3db768bc 100644 --- a/src/js/tsconfig.json +++ b/src/js/tsconfig.json @@ -17,12 +17,17 @@ "noEmitOnError": true, "noUnusedLocals": true, "resolveJsonModule": true, - "skipLibCheck": false, + "skipLibCheck": true, "sourceMap": true, "strict": true, + "typeRoots": ["./node_modules/@types"], "paths": { - "react": ["./node_modules/preact/compat"], + "react": ["./node_modules/preact/compat/"], "react-dom": ["./node_modules/preact/compat/"] } - } + }, + "resolve": { + "extensions": [".js", ".jsx", ".ts", ".tsx", ".json", ".svg", ".css"] + }, + "include": ["src"] } From 2fef71a6e317f2cf21df1fa042f7e9ea78326caf Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sat, 14 Jun 2025 04:12:04 -0700 Subject: [PATCH 07/13] fix browser page logging --- tests/test_app/tests/utils.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/tests/test_app/tests/utils.py b/tests/test_app/tests/utils.py index dc3cb9dd..a2c3211f 100644 --- a/tests/test_app/tests/utils.py +++ b/tests/test_app/tests/utils.py @@ -117,16 +117,8 @@ def start_playwright_client(cls): cls.browser = cls.playwright.chromium.launch(headless=bool(headless)) cls.page = cls.browser.new_page() cls.page.set_default_timeout(10000) - cls.page.on("console", cls.playwright_logging) - - @staticmethod - def playwright_logging(msg): - if msg.type == "error": - _logger.error(msg.text) - elif msg.type == "warning": - _logger.warning(msg.text) - elif msg.type == "info": - _logger.info(msg.text) + cls.page.on("console", lambda msg: print(f"{msg.type.upper()}: {msg.text}")) + cls.page.on("pageerror", lambda err: print(f"ERROR: {err.name}: {err.message}")) @classmethod def shutdown_playwright_client(cls): From 6003a424989265d106311576c7db96d06ba5d096 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sat, 14 Jun 2025 04:13:45 -0700 Subject: [PATCH 08/13] hatch fmt --- tests/test_app/tests/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_app/tests/utils.py b/tests/test_app/tests/utils.py index a2c3211f..de39981a 100644 --- a/tests/test_app/tests/utils.py +++ b/tests/test_app/tests/utils.py @@ -1,4 +1,4 @@ -# ruff: noqa: N802, RUF012 +# ruff: noqa: N802, RUF012, T201 import asyncio import os import sys From c2b6e371c6613a2ac94d2a27191aded69e2fdd38 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sat, 14 Jun 2025 04:40:08 -0700 Subject: [PATCH 09/13] use overrides to patch react to preact --- src/js/bun.lockb | Bin 103555 -> 102940 bytes src/js/package.json | 4 ++++ src/js/tsconfig.json | 28 +++++++++++----------------- tests/test_app/tests/utils.py | 4 ++-- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/js/bun.lockb b/src/js/bun.lockb index 494ed8815d2bdd4619ab9f9e202036909b2ddf7c..1adab9a62a3903f17ad3a4209fe9152bd3ccf99a 100644 GIT binary patch delta 19636 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 suUl5UvC24WPSM*fTd5v?hwBHh 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 Q%H0t@M;-L)qdS)VA4twt7ytkO diff --git a/src/js/package.json b/src/js/package.json index d9df0da3..30e30a3a 100644 --- a/src/js/package.json +++ b/src/js/package.json @@ -19,5 +19,9 @@ "event-to-object": "^0.1.2", "morphdom": "^2.7.4", "preact": "^10.26.9" + }, + "overrides": { + "react": "npm:@preact/compat", + "react-dom": "npm:@preact/compat" } } diff --git a/src/js/tsconfig.json b/src/js/tsconfig.json index 3db768bc..ce0d02dd 100644 --- a/src/js/tsconfig.json +++ b/src/js/tsconfig.json @@ -1,33 +1,27 @@ { "compilerOptions": { - "esModuleInterop": true, - "jsx": "react-jsx", - "jsxImportSource": "preact", - "target": "esnext", - "module": "esnext", - "moduleResolution": "node", - "composite": true, "allowJs": false, "allowSyntheticDefaultImports": true, "declaration": true, "declarationMap": true, + "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "isolatedModules": true, + "jsx": "react-jsx", + "jsxImportSource": "preact", "lib": ["DOM", "DOM.Iterable", "esnext"], + "module": "esnext", + "moduleResolution": "node", "noEmitOnError": true, "noUnusedLocals": true, + "paths": { + "react": ["./node_modules/preact/compat/"], + "react-dom": ["./node_modules/preact/compat/"] + }, "resolveJsonModule": true, "skipLibCheck": true, "sourceMap": true, "strict": true, - "typeRoots": ["./node_modules/@types"], - "paths": { - "react": ["./node_modules/preact/compat/"], - "react-dom": ["./node_modules/preact/compat/"] - } - }, - "resolve": { - "extensions": [".js", ".jsx", ".ts", ".tsx", ".json", ".svg", ".css"] - }, - "include": ["src"] + "target": "esnext" + } } diff --git a/tests/test_app/tests/utils.py b/tests/test_app/tests/utils.py index de39981a..e127b0c2 100644 --- a/tests/test_app/tests/utils.py +++ b/tests/test_app/tests/utils.py @@ -117,8 +117,8 @@ def start_playwright_client(cls): cls.browser = cls.playwright.chromium.launch(headless=bool(headless)) cls.page = cls.browser.new_page() cls.page.set_default_timeout(10000) - cls.page.on("console", lambda msg: print(f"{msg.type.upper()}: {msg.text}")) - cls.page.on("pageerror", lambda err: print(f"ERROR: {err.name}: {err.message}")) + cls.page.on("console", lambda msg: print(f"CLIENT {msg.type.upper()}: {msg.text}")) + cls.page.on("pageerror", lambda err: print(f"CLIENT EXCEPTION: {err.name}: {err.message}")) @classmethod def shutdown_playwright_client(cls): From f320a4400e6164165717dc9d4b6478394aa8fa6b Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sat, 14 Jun 2025 04:48:24 -0700 Subject: [PATCH 10/13] add stack to error msg --- tests/test_app/tests/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_app/tests/utils.py b/tests/test_app/tests/utils.py index e127b0c2..de43d958 100644 --- a/tests/test_app/tests/utils.py +++ b/tests/test_app/tests/utils.py @@ -118,7 +118,7 @@ def start_playwright_client(cls): cls.page = cls.browser.new_page() cls.page.set_default_timeout(10000) cls.page.on("console", lambda msg: print(f"CLIENT {msg.type.upper()}: {msg.text}")) - cls.page.on("pageerror", lambda err: print(f"CLIENT EXCEPTION: {err.name}: {err.message}")) + cls.page.on("pageerror", lambda err: print(f"CLIENT EXCEPTION: {err.name}: {err.message}\n{err.stack}")) @classmethod def shutdown_playwright_client(cls): From 33f3ee30565d503c8173320faccaa526bc8bc552 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sat, 14 Jun 2025 05:33:50 -0700 Subject: [PATCH 11/13] try different method of patching react --- src/js/bun.lockb | Bin 102940 -> 102821 bytes src/js/package.json | 8 +++----- src/js/src/client.ts | 6 +++--- src/js/src/components.ts | 2 +- src/js/tsconfig.json | 14 +++++++++----- 5 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/js/bun.lockb b/src/js/bun.lockb index 1adab9a62a3903f17ad3a4209fe9152bd3ccf99a..164473dfad60ef0e6aee86170f5938c06700f2c1 100644 GIT binary patch delta 14582 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 MlHEU+AK2CSKgW@Nvj6}9 delta 14642 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�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 P|9u{?Yw8kws^ Date: Sat, 14 Jun 2025 05:57:10 -0700 Subject: [PATCH 12/13] self review --- src/js/bun.lockb | Bin 102821 -> 100965 bytes src/js/package.json | 3 --- src/js/src/components.ts | 37 ++++++++++++++++++++++--------------- src/js/src/mount.tsx | 4 +++- src/js/tsconfig.json | 6 ++++-- 5 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/js/bun.lockb b/src/js/bun.lockb index 164473dfad60ef0e6aee86170f5938c06700f2c1..77925c8ff8f648a7dbc38e2da122163eebd07da0 100644 GIT binary patch delta 14236 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 iMt_z}I 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 diff --git a/src/js/package.json b/src/js/package.json index c7e1bb75..0cdda830 100644 --- a/src/js/package.json +++ b/src/js/package.json @@ -1,13 +1,10 @@ { "type": "module", - "version": "1.0.0", "scripts": { "format": "prettier --write . && eslint --fix", "check": "prettier --check . && eslint" }, "devDependencies": { - "@types/react": "^18.2.48", - "@types/react-dom": "^18.2.18", "eslint": "^9.13.0", "eslint-plugin-react": "^7.37.1", "prettier": "^3.3.3", diff --git a/src/js/src/components.ts b/src/js/src/components.ts index 9db2c3c7..6c265ac2 100644 --- a/src/js/src/components.ts +++ b/src/js/src/components.ts @@ -1,13 +1,17 @@ import type { DjangoFormProps, HttpRequestProps } from "./types"; import { useEffect } from "preact/hooks"; -import { render, createElement } from "preact"; +import { type ComponentChildren, render, createElement } from "preact"; /** * Interface used to bind a ReactPy node to React. */ -export function bind(node) { +export function bind(node: HTMLElement | Element | Node) { return { - create: (type, props, children) => createElement(type, props, ...children), - render: (element) => { + create: ( + type: string, + props: Record, + children: ComponentChildren[], + ) => createElement(type, props, ...children), + render: (element: HTMLElement | Element | Node) => { render(element, node); }, unmount: () => render(null, node), @@ -22,7 +26,7 @@ export function DjangoForm({ const form = document.getElementById(formId) as HTMLFormElement; // Submission event function - const onSubmitEvent = (event) => { + const onSubmitEvent = (event: Event) => { event.preventDefault(); const formData = new FormData(form); @@ -30,18 +34,21 @@ export function DjangoForm({ // If duplicate keys are present, convert the value into an array of values const entries = formData.entries(); const formDataArray = Array.from(entries); - const formDataObject = formDataArray.reduce((acc, [key, value]) => { - if (acc[key]) { - if (Array.isArray(acc[key])) { - acc[key].push(value); + const formDataObject = formDataArray.reduce>( + (acc, [key, value]) => { + if (acc[key]) { + if (Array.isArray(acc[key])) { + acc[key].push(value); + } else { + acc[key] = [acc[key], value]; + } } else { - acc[key] = [acc[key], value]; + acc[key] = value; } - } else { - acc[key] = value; - } - return acc; - }, {}); + return acc; + }, + {}, + ); onSubmitCallback(formDataObject); }; diff --git a/src/js/src/mount.tsx b/src/js/src/mount.tsx index 19037a25..c69d63e8 100644 --- a/src/js/src/mount.tsx +++ b/src/js/src/mount.tsx @@ -78,6 +78,8 @@ export function mountComponent( if (client.mountElement) { render(, client.mountElement); } else { - console.error("Mount element is not defined. Cannot render the component."); + console.error( + "ReactPy mount element is undefined, cannot render the component!", + ); } } diff --git a/src/js/tsconfig.json b/src/js/tsconfig.json index 6ee72dfa..dc3f4f16 100644 --- a/src/js/tsconfig.json +++ b/src/js/tsconfig.json @@ -10,7 +10,7 @@ "isolatedModules": true, "jsx": "react-jsx", "jsxImportSource": "preact", - "lib": ["ESNext"], + "lib": ["ESNext", "DOM", "DOM.Iterable"], "module": "Preserve", "moduleDetection": "force", "moduleResolution": "bundler", @@ -19,7 +19,9 @@ "noUnusedLocals": true, "paths": { "react": ["./node_modules/preact/compat/"], - "react-dom": ["./node_modules/preact/compat/"] + "react-dom": ["./node_modules/preact/compat/"], + "react-dom/*": ["./node_modules/preact/compat/*"], + "react/jsx-runtime": ["./node_modules/preact/jsx-runtime"] }, "resolveJsonModule": true, "skipLibCheck": true, From 0bea4c1c75fe4986c3967e4cfa777540c561c62d Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sat, 14 Jun 2025 06:17:28 -0700 Subject: [PATCH 13/13] add changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3a0ff04..53609f21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ Don't forget to remove deprecated code on each major release! - The `name` argument has been renamed to `channel`. - The `group_name` argument has been renamed to `group`. - The `group_add` and `group_discard` arguments have been removed for simplicity. +- To improve performance, `preact` is now used as the default client-side library instead of `react`. ### [5.2.1] - 2025-01-10