From 892ee29060534eec1bcf5ca768a86db9a21d8ec0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 16 Jan 2024 11:47:48 +0100 Subject: [PATCH] Refactoring --- bun.lockb | Bin 159977 -> 160399 bytes package.json | 1 + src/extendSchemableClass.ts | 30 ++++++++++++++-------- src/makeSchemableClass.ts | 38 +++++++++++++++------------- src/tests.ts | 48 ++++++++++++++++++++++++------------ 5 files changed, 74 insertions(+), 43 deletions(-) diff --git a/bun.lockb b/bun.lockb index dc2bf927cab3aee136b3fe7dbe87262a7a246c20..6e480f417ea87a3ec7eb6f758ea54b36b9ff880c 100755 GIT binary patch delta 28858 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

uLu!e3F3+n*``S)i1R|s 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 delta 28516 zcmeI5d3;UR`v1>56><>s6p6WpgoGfHh~$`yW7Y~Ph&hNM(V|MCle#*uwu`E&wr-`W zsG5ozs)ia$wThxtl^CnErKaEe*+aSaYQNv_ecjjZue;mNdDin;&l;Y!p0)NqXKy>t zpYY`!^Suxqk+!e?wTd&kT>re@(x)DK<*SqT7k=rxjsxdB_11_-vkuRGse8}SUXL7e zUrec#J^OWKDfUO0$CLBOsDYNUj!z%@az_ptJb2K6u^!L+=mp_tAWI>ibM&!U<4Jiu zgR=%bJZR+Dtj)AinEZD4cs#|BgR=TRls;mhXLgXsQv&^O$dcJ49ws3b4RkU(J9?5B zz}I&8vJS71W#G@{v&-#6mPKEW6n-I6%FT50ry`}nEJsg8id{Qowiw2eD2=S*7!-00 zexv8ou@gwCU^3o`Cz+#0jCg3Y$8&#CkEa59JTe>^=ICBzDEjwBJf6zPO~{JKw~$ql zk0UD~2Nv;UTZz_=K}{#45K=1qDa7NEDH)qJBE3J2Utv6mm$UT42DbWvj$~nJUl4V+NnDG>O9bG!;j>s4A%*LNiS@yp% zXaB1y8#y{7Dr;2c*dBDeI31W|@_3%4A{nWS^pWWq%oW1o2SnHv@5f&9KZvyJsae~uXDm`is030*GJhSh&-Uc} zj-kxO5NoDAo)J-Yfv!mDNIyq!g$zNT8g1uKM#@wr!b`=GNb$5RQaW&~u3bLA!+%iE zF7NWg2Tgd`)0@7JiLrbB8U_*z*+_}vU+G~nsR$`O{;9sL?{WAl&Pb(aMKRiR3SI0{ z8rluF*Ij}t^;FKd4o%C7nvj+`@>j-BLOZ#U-Q6`vY4sgs2yzKh@@G0S#^Ec++ji^d zvACUIZwsoK?P+Xl6RA}O;cw_7^AhYqs+efkRtzbF*@Aqj{TK2@y0slems-DZCE(u%(THC&yW$LWdHHZYi{RD@QqH(%5wLOBG^mo3tQOjcw5@;K88Jf zx13oJGMCRGWt81`IYWTwZHm6e$;ea}iCk~MZz=AawZ?TH`W(Uw`G1`N+4-`mL^ zvGmbm?eT0TU%JvncL^?=o#tqrol?z_MaXUF$U!3qj2f6ea>&XqcBvv=?b^nmi=8`C zwXv6xDvy-aQV=N)&Fg0C1Jd|!=pawa`)!A3BJq%YA}S+IdRFQIJ7X+TMlu~KL(mXI zsmOId5?#7~y@TC>TitED4DprY9e61}_MyR1!{Cml*m^B?ELla9$(L>6RjWMv#7Gj- zK(Bzk_pj?|pXJ^{%2}{2ym)k^m!04JLHi_j1Su8X&svxAt&lR6U&2d-wn54Wu|SzH zt}jyUj_hKd#BOxvr~y$Aj2JZ}k_IGLZ!*D>QKhfl0lBPT8_e3=$6le~{p=wQbvl%b zF6BbdrNR5yZwn!hwbP9Y*2un0WJ|wBjT|sY24-Al+UU^}=o7JZXH3Tov0`6fM-Cp5K4j?FJjzRT>_K#r1hq&rL((1^A{EvcY?li|id{M+r@@>e=uAL%P8uHe zr%ye}kd7Rp67kPJ)E<}^M}Ccz3igsO9UD1n^jPU|TL1o;gC6#H+`x7N-VMz^38|a| z!=ycCb{7e$*j?qW=WF3*M%_@_JHqZzCLWiBmunK~$c}dQ41a|a;=p_8Rgr6$O{sSd zy2ufu2Bu}<#O3OCxx>h^5*ovXJtU5J+;iEk>iXwGHL{P7w(ZW0u}83fX4-&3gsNPz z6r|V!q(sgQr1aw`cG37_=8cMG(GCsKVoWt+ERd)52rSU}<7gAewUU|RwH;;}COI9&D zJ z$Ek%nw}L-tQIN;eN-wOC7<8G`eO4+lzsJ+oN@0394H_$~G%N$lBZ>Qg#z-Np%-HZ^=^nbhTt(t5P0M zbEe}SnGWBqJ2j%fo zStr>STHfPng1HqZz6a1GlISLp^sLUSaLf z>g&9^el=M~)bo4SSJcDmCHqQLa=SBTXuQs==U30^h#0^3NF_ZiCRyF9b7TBLJu1rt zE{sVG`jAu)D^;+H%MB#e6|PA>68)^qGVFf6tyCtdfmUiCDWh;u^Mh`Sp^pIA6D#9#696YfMsnu%lQ5@B0F+o;8vTgRfvM z+tA7jYJ=8NNBI+dGe|YXDpsW_b*=l6|_@OV06;T0}u4O+Zj7?OAkZ=uyiE39Mc#reiZ+5NJ^btM|tiB9ld|A)LL(RN^a^^&@AK8+^+&<@&OGzrWg z%exS&mq^3AjCh^f#P8EE;+q|~7trihByi|`lHa$QA#9EXwAz z6B*}w6iue$9vLU!$7r2xOUAWeeUFE$DJd5lr_ywU-|x$Xlb|I`vG+8vcS~!OeQnU} zelLlSQ;+G0rheaMxQ5tUef9p{K)=^CSq;*8WaYx&Zu%q|e%ou;S31_?p(UqV_o2z! zWLSxwNoZ2ec4sx3v-EKFl9OjO7u1PD?ew{(iQe6fbYzQUU*$M^TAaw-GGWT^PDRW!E(q48nyQ7%>c(;I$m`(uE^e+PJ0|-)eCLx|nWoq{UpyKEnNv{5WW)!f zh+jVGvTqHV-8C7$V$6d~1@*H<+^=&xakgoxPj^c8or9NR!IBm9QY$oT_u4^9I+#x{ zX%*)yOI_ldy@m#$$!yr&orBf}&GOWD63s3ru~VI82w{&&&~UUidSOIj&}LE{tr4wA zQD;Qk#`*f7*(W$D{W6+(Yqjd#(MAvJmh8I;$$kbYBNy4$Zq6F?piHzTI-_o)?*md& zEwkJr&UX~esfe*D*Ur6s!e!quG!|q|QNlDnIAAaE{8r4)N0W(QB{JHF(CkX2;Zkh5 zqTQpHbc*w}cQkfGe_YTLXvz9qM51paDXGDZkYCZ*yqGU0*4L7Vu zLoYNtzz9C|hR%D?A9Mh&vCbINB)A(bP~Kjfsc1|gnr!>a(O9g`09`_3Z_6oet%Gj& z-w`~%chKy>l5*dp$*|a~xY`4*<;5}a!6@Rno%Jc26yy4t5mW36(zvw{g4&`nPfZhj zQ%T7@vA;ybc~^JW@AXag6-=>*Kz1zYQ+rav<3D8{MUygi z94$s`tQS^G^qwA|-y4?fOB`q~MUQpz8iyv$u?fV+c^3`T!-gmOPC`m&?Fgto$ga;` zyU(D>Y}mWT4m2m!naO&C-Mv>fwkc>*i@h(eLnDx7+=!#nL;jdCv=lVyv0dkMG+77s zc$`6NZEMVJhoSCTmhpJ;w#IlLMU(b8-xI|Z)7^QJc^`l#BgBBCX*7F;Bto{J$?jIr zDpz8dZON&Mm~M_H6J_rtPoc%371OfJ^3bGbwtsbp+pXK1eFmC6H_IH}UU!$!q#xGR zi>jt0GX1{P5qIo{zBy?2SV$}%L*ukAb4iPpGwgM0pUp<1NhI1=!1K}Cq1m(aGn&kj z-J2dGtuG&3J8U5(V`TBZpiy_6(Sj01(-~ojL1Rd9rVUT@EgT3Bda?0Lf_QKQKOv4zv!gJ`mv z?9dH+*q$J3vk!Uz%|7vJhqtf!b~>7U`CMR}-3NOU>V_u1*r$sZ9nB8nFVLhdv5XHM zZx^Fs;-n3l6l00=jpivGF`4fXaQ5{WaqZ=cyqqWl6Wj&6q;H&>sw1-f-ft%8VcE&5 zoX*Ym%fRsYq>jk(dpAF#hvg)zGCDWM@4J7Z{ne(ZjDq*(L>)OL+1KY$?)uWMy>Dzn zlffoh*bO|B?7^_|f*PZ7V&`H=lak@&jKUf|;8=0(9UZ4i>b%Divx|AGpS$?{-${jC zam(74_mD2-=prS*w4;kG3+g!fU1YYEb(f6)PrTj!U-eLayObc59}(s3W*z@A>9qfs z6?}1w)rxefFxU55DQ82|;|3otWe{JyZpO8#|;2dU^55W@cW-$}7od`S6xNYR7j!;zBA@91|* z8T4R>4_3O@w1T?#v|wu-e9$tcMUY}v%rU!D3RRpBktLjbkz!xU(M9G*FOQV&RX|Es zMMqW=g+rv2tD>xRVI`~#2y0TSJBD{kp=vn1NJ-XobdgeFgronJEP-7jcGA&iO4g;7 zuq$XmhSbs0sYs+GTRFN&Nw(%gMl67o&8HVqJWfSQNBSb=xKj$%&&luaU>a4>fv*j+S=Q@ONH~5eaDQcCKR1ztCDMyx; z);R8zGCbv-{4k`LRB&V^Q8?}@KNwG z9}S%RyGiMAJo#eMIGj%@nCQqRj!cqVz4N(B*6FO7!!{R|L!=~II(#dKzf(%BtsVZa zq?ojE>_kerwvKG)WrBnVI0kohL0k@8;+tW#RNfO8HcW zPjx5gHena+;~4z2q^uQD5>;~iZ=`gjxMh8pFC!8lV(@?XHeyxvpZYSA{hzAn&U*e2 zUq-V3@=Jxd`tN*;k=g46M0Npkh?J4;Dhh{4Ya_n%TZm+c{#V~d`ic?9UrE_z*ki3= z8!W~gca<{#cg^?{UMjxZmk?-+m+1b#d>P4>A<2}|93tg{V2UUl{~x6IZ#PsKIT!qo z-$t-m0;J;~0vVBi|H}xIEkm{rNU&@Ga)^`$Hj2V=r~L1i5qoU@`(=c{`0tmI|9%;< zm&1R*jM(Gw-!CK98AHC5$Qk6nUq=4>WyFqz|M|;EO)GNl_;z9!{O2zreU>K7ezdS2 z^j<(!*Gt|@Q8l!0L5ixW)A+2VSMeF4i@%?uB6T{Swe*&yhDJn{j;WJuquT;r6BS-X99n`- zSdyaSmxSoqO9CoU=b@cK>+oSfCFz+Trsx?ThUgn;e%*Fyif*$sL@!(#P|fsJv@2+- z9|cqko%>OWp8rvZ4p|mZt#r?2DZ0n95WN=dKJ8ncqJx)*=#1q7)mE=UTZvX-ML-2~ z`ic}ibVZ2XiPk}fu1wM8R)*+FD+8*N-iEdnEoxOjb~xQ=xM9*Z#Dj*_0$P#@Q6rR^?wl+nj>Y04@ z(HHsbtJ{8(qWbB%e5UEEeD>E})}`?DN-m!RwOXITvwA)G9ITh{IYj$5q^O}fjn8zw zY6Bi^z@v=;HC(4}#G{RPgqER0KgFX@@#xcl8l|_PZAFXP6i{RIgiUy~36IdSbi`+P z^cfy~7EllA18Dovk~Rm_I6ZAM9&N@WvZo7>c+s2G-3#cjjD%usa)XxLzah>})Gxj+%wmra&!JgZhvF*$l+Ene^!Hn%- z#&!gF;&v6jr_eg=4XD|A z=3e~Ui+^Zyblb1+?<@TKD!{|-SJAGZrG6byZ|mHz@$YN=+ZRytbkBYGw-5i&-qpTu z@b4S^`zD}r^(wTLXchJc)B>HpAOH5_AKF44dI0|p;NO9OTBNt3ZAFVZ7*I>}goF5Z z5dYAY>WFXg?_2!)HlUX218Dovk`4vb3O(%*{vEfEFFcNG7Q1=MG{=P~>{hJR>V zwC{WT`yT(k52$T=71~O)3daL#yG}ojf5-6;ZKn?X0snr$zaIkX3%w0(D_YcvfZC%c zoWQ>m_=mPvNBoF?KjPny0rj;$fVLkk>105CqoyKeIf4*nA0G5xE*;2>J+uK{(B&ixe!f5pMy z0xC%N{0#?x!$GtH+IIy9ui)U7fb!{8Xe-ewTn(r~I{hjRUd2JQ5FPqE4*rgVzXw!N zy$x+ETGX`wPiarMhJ)8|5Ur$+xQ>I@aqxOTmDUH)_M;`;2=MRhrrp578#ss-suOPF z;7uI78Bk$55A76Mhg$(vLC?H}gST)Htd+3PCI^1kub~ z72--ERmAiutlFs-Cbuxe{K8m-gkaIi^bCRM5dyJRi2IDM2t;rZh>Ri-ZOtknRtiy} zC`7=d7ljyF6k?|k9ZYC3h;qdsCKZF|WVQ*hRfwqK5M9iK;t=DDLmU>On~5j^QL6;R zvn3!NFb9O#FGNyFh!iueBp*+ggg7TePm@pzBEA&F>{1X9nmi#+3DKc6M5>ut8e&Fi zh#NxmHEqj4v?&9zuna_+xhljJAyUgi3^2K6A?BBb2q_0K$n-1+(W4y1S|NrQUnoRy zC`3jmM7mie#7ZG5l!q8@(#t~(Ef29%hzt`N22m~yVp15yD6>t7twKbFLyR#K!Xd_o zLmU<&%S2Rws8s>t*$NO3nFB)X7b2-5#5gmpBE-`bA6EQB@@wIFKMf_SzT#4F~25c`ElihwX?S_H(?5fJBum}wFs zA>tz;W=BHIGI>Ir5~4$Gh}mXlZHO7QA#MmU$F!{j(WVZ>!aC}LddAF-Qk~RWE6zo! zlj_w*DyXpYR)&Qk{GhqwVw5_r^wIM9%+VMX9P}|y`-B+CA;Oh*-(xUfM0&LR<5&3^ zaMp^9`f8o>E(}=_-B6WL-rw(C(K=S0&L8rM-~K0dbCAWPlDDP3%Fe%yzTV8bC6FU^ zxc`FE;-nA5tv*y3mNjZ*EcvC{*fojmF!}fB86!NM&5Oy(sIrECbQKoVuN@X z4Vf^y>WVR~RA0r`vZu9r*V`j~#rY^T(&}1B{gK@3@_2IEBMVEH?W!+ZV`^@+R|UM6 zCK~KFuGrc^&Fxh1=-e0!;cL+-_Jj1vWX{YMFoWE&`O0T#j`};Ua-Nlp~$`6i%{hgUdiVC6x## zciK(?IX-i^DAHe$mJV!oxM53{5>CPrpc~b|NJ^29$QV zT@EL!rmVwBWBf1wc+C^)aJ!MRtQ&&OKo0i_0on27E{(MR$KwKxNPDFR9P-G3R2T<> z;H3B8I9xpG5)QZD;S%7!CtVkLz~LH`mSC06i54?K9Nk~V(mHT}{HUVpa9ETi3 zS^u9{49{~pTr#@cLYIynaX3F|89B-O&f%JpmJyM>qYhVD)*r_^vK%-HHhHK){bW<{ zZPh(mHop781E4!d0X=}+x0VgCBj^OCQ0_60`Px4}DL9{4+WmxpV{%~Qo&EkyYMi~^hzt$VTkkZGVl=mzcw4}k8V zC+G!wgHE6eC~fx4Qx9g##v$7$&$W4O0C`A39&~5`8iH652cE!YG>~0xBFF$Ef$VUy zp$!53KpN-`iUZkgb3jeXM}o?r3Xr{F4fsF;QZ^LXrQQWE1KHtPgZn@m&=w>DKWGYS z03Rp_LVyBZaE8vG1?RyE>|mR|!?L1iGDTuBfFexv?N;53j8>^S&g5FbB+ z55ZFK5#YHHPYWQ=r6hyKAe{J#Pd%pK zd{rZRHRg2JJjqlM$VH0mKXSbx&$6T*m32XtM zgAaiLEkO}b6kMU4oTn~>6X1~S>azQt1DC)r;2Mx~N@-9Q$T>m^3i7~SbcLt+fNb}& zy&r}9-mw#hq=V(r!$3ILjlL3m3}ja>2TFola*7jU!3MA%Y^Q*9N*dao%LhlBrRL^a zs%q#A)K|faK=x7@_6I>X^UHh6)RGONBWMYl06B%o`AbeYa(ZeAK}?cw}SH0kj7J&<;p@EkJY73?u`I3O{HHB(E)K z16qOmKx-i7Bs98!&Oo}srdQS40Y#BrPI^T zp5Y|k2hxc-;0-Vv%mN0y3SI%Dfh-HDOqPZ$8%d7>vWaDb@gNfjp9RK&hrvT&ESLZ$ zgGa$5V4{=~gGu0J@Dg|t{0%$}rh=!y<6sJS4CFZJCy`HpY2XDQcF%)n!82ew$N|p* z4Q7HF;5G0%$OZGI*Ym)eKsx=`9ToK2c*(l;3l{Mt^?`FWgs260>sf@z;EDJnSUX!f!~32LLiOHetj0{ zLAvL8$#W|ShIi9)s+G}@sgjOJdAV3~J0eTe9f5+R3jv9>><|*NvC9VUHk?d`yMK%K zvWJ%g(oq=!+0P{o+|dzE>?#2{qe&+uUB%HOku`zTTNPOYR0GxJ3g})(5m^gF0P#R7 zb%#?fEoCHRo@H*OLXlEoG_tOfjzNkO4Up0iu@@UbENSWVK%~S_Jg6XF$>K;z#P>(0 zfyQ7y`u)hRpe0BEQi%l6Mj$pVKyx6c&SW5`S-Dh80)8MXqA5~%;o5_?pfzX(0-#+s zA40YPvgY08aUZ&*yC6FNX`~bA2s(pqKmsuZ+$|7g6lDIpgPWxPIT#;+7n^MPxHHiD zlF@8(Ix*0@EFJhW58%I3QPeL!FV8C78naUQ^!Ndhru|R z{|O`>0h7U_U=onRGBr8iaWD-$4gLnEgJ*zD&kM+xfd(%*=~s{jbRz#vf&%x{=K z4L$8CezMy+BN9xH4Q)TiIHJUiv&#Cw^* z*ywuE^||sXY&x$}Q=l*Cz<-x$p8lJbiEInzwduC#OEqQIAWn z!sZRidiNDJFRW4J!jIF6gvpMXlLx+8;{8<1vYuF;Eo{z;<(0xF|HrC+Y*2{(#=4KL zRy_DZ&KoOBspO=%=<$SEF>;DfN12;dTdiBP_qp3S6-~y+_*xf(au}2zQtU|Q$aX7k z8{B8+VxR__)gnfjuRm6`!zW^17W3z*yC8B-^_)7jpB&V`n0hJ1gs)bWy+4JR>e*-)>E|6TUb=Z zV*2wpUSCnI`03jgo5-n1&X3Ki2mjKd<)+&?-xo1O7&PTIqc%9rhM8t-Xg1zFhzNII z`uud}teS_PZX0sDs59Q_|LW6Jma(j4_kGQkKH6`dY5RC@W`cQO;aL}p|2Ph(C=g1S zDW&bV;a)91X!y;BJ7-cRCYog)>xnSM*Q!wOtum(0T2(I0eYf(e$sgAk*!asqR^>6W zUqqO`7~bc;jQL2l_1&)|=V{9zF1kS@&!0zGcP5GO$!YM?fJZjWeshwSn~dw$sw%3# zIkr|c2zTEk{bpkQ>(!synP~N{UUY+4UMX$reWL1z{c8;wxW)A6JYpt&Lgcvbj9yXh zvqQUg-~53p>dT-s^vp6#K2Z&Zxi6W{n%3s#NAvD|)MG{o!W! zI`&2P&C;(f54;^5x9K;^vtnbT<2>%Wr+aT(KJ}icZMB>>iO676VLhSazKr^XQj1p3 ze77ujxvi;;XUT?}uIm{r_l4i9OO+{+`uxnt?BHrhOk2w!lzZSTfzp+PY3;;t{;^*U z9I@*XyR5{&$h$1H)}U=mYHoXZlDM6RyTz=vcD{@Zfa~)^~2rwWqx?? zjJ6jG54&ZJ9ns9!j_PJC7T#Ue&HRn3eYo{%PZpd?Brnnf7IK3T)wx;ri0Gw$3sp|Kdq z*3D$QZ(?5YldojSd!{~RwPbC#bIlD}^8Q-GwEs-iSIT66Mh6ROU&zKdPB}8kPv#8!P zwM_mksy(;NyKSN1lV)5A>_;#P4uRp8&crTI1xrZ9uS91?(oZRuNtm|zk z8cP;A$Lg48w$i%$Qtv6Vj+&n%k6gndj&Z{xzgf4HfpuRW9x~>+7UhpWa|MG&wt@SC z@qQ(yR{!9oN1h-@&Unm8qAC749e3YQ-o8$arEk}$Qr|J4V_i+NZH!$%^B^M3eZzT! z-%j^lq~;gEu7TZzZP&GwIC$_Mx_TjKeAp7*z$ zPx*jC@pg~?ysu--LUG!CD|)?qo*nz*h%~uEu(nUWc$i}taM%3W=W2+`Z>E2b7GoxD zrL`bl5>x)|nwYh}xYA=5=cFev@F9@8BZDeHD64 zlbJWYJ74xVU870&rRq0EsKukJwme9VObY?9&Q#cmSMFQYgAQJ6m9co|Vhm*L<(j~B z!GMQqhKt=@E3)h+nmHK6y03BXrC$HG^>1@VQ;`HA6}c~R@42~A*VFB;o+XFLl>w<} z&Pfw?4dH*@L|%evvWq}*-`sw7V6O)bH(B43nw&ZBYDVp{YFcuF&fcXj&Q6nL*6v~h zdCFYe#WL?{{9j-m)y!U;PuyDe#7&L5TwTbMrR zVcwSZR+iG`s}89@Z##Co3(uJschkZwvj7o$*DpTZRg1&)*M>0^nLtt z_O2z3%*{P&uy^TwX7HD4uo`N1eo0mCi?0u@e7DYPDs46eBpzwYeMNR+v*RaUc=HX} z2Ax&Aqn!!g%W^o@&NSM~8Szp(Gfd>ocBb+%2G@Oy`T2=AyXn3C3f}HSsM)iZ!HqO$ z_7W9MOr@^~2luV)t@?HT^!@U&vOb;dw3oSXjD2XtS86DYtl0OJ@+vjb6g^BGlTE6K zS4{|8RU`LR@jv%{z4PU@pG(Y3NU>Sm{Uj_4<$4Fxdmkq`d$$X7Uvpo-?E5tyiFtG? zRY(vs66H;WlQdP^9HuERSB)bMs@lO$W85Y~2m(O>~INo z?f(!0e^Qamu-$C9`}+UHzrA&+ewC{mZac89r+MixSABnOaio_ydYEsh?w=CqP`mz1 zzgD@#Vs!_B>%s7&T;a4a$1ZZ!)9i?UTBWzZnp{lf#ZW`16NOvcJWR3r!8+M2{DI2T&6XdiJjY!7LDlx%9AtN`h^fnotC9PM z4xWEEyWtb{C!TV~lK^)A6vDe7s{ym~zrTnaXZN$NDoR(3yX(nbt}@wltQ|X4)iB#> zY>q8e+=-$gsqi4nJb={#Avy8tm&hXWrE~t5?>k{p+FTF$}%- z)>WrKBkQbaZD3_8((C`@9%km`sRHf}!A2o_*8jMX4RN-taQAO6tZC2N)jsUL%^D(h zU2fwHGe4iAo9sn3@>pK(UvKDNs_KkEi!1)!aftJkvzh)wNB*G)=5n5D=shsZM4o2P zY-wIRO&@2P1-6h2z&ipZ>I{M6oZ`(RXDGOLgjsw>wfC+WX>Ok3_m)3j#($n;2W`2q zf4#ck+}cpiy7p69?*F0gGSjk7O0x_8;$F|F7~TQG1= z;BCw$+TeR(v!7(55=`%(sL=hZ5_<2Mdp_B4Yhgac)wskBKLb6FVXXV-CEngXW5S$a zU#5FiB$;w-pJ0Ev@r`P-`E-}pR?`&U-Wo9pcG0kZHJI!e_)PJObmFnXrp`r1c)>*b z@~pw~Dz7Z|&g1fiebo9Av}&U1Cl(vAD9+Vbw=-oLb)S&_3vD%Ec{6l-Cz_Wps+PV( zSjZKhwe^Sc82&X{2y_4J#r5@ZSGN!9GSC_?>#X>Msr$1EE!g>@{fqkUi>B+(EVvmz zt9pd?wx2n3G%, - schemaApplier: (schema: C["schema"]) => z.ZodObject< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - SchemaValues, - SchemaValues - >, + props: { + schema: ( + schema: z.ZodObject< + ExtendSchemaT, + ExtendSchemaUnknownKeys, + ExtendSchemaCatchall, + ExtendSchemaValues, + ExtendSchemaValues + > + ) => z.ZodObject< + SchemaT, + SchemaUnknownKeys, + SchemaCatchall, + SchemaValues, + SchemaValues + > - defaultValuesApplier: (defaultValues: ExtendDefaultValues) => DefaultValues, + defaultValues: (defaultValues: ExtendDefaultValues) => DefaultValues + }, ) { type Class = ( C extends ConcreteClass @@ -50,8 +60,8 @@ export function extendSchemableClass< : AbstractClass ) - const schema = schemaApplier(extend.schema) - const defaultValues = defaultValuesApplier(extend.defaultValues) + const schema = props.schema(extend.schema) + const defaultValues = props.defaultValues(extend.defaultValues) return class extends extend { static readonly schema = schema diff --git a/src/makeSchemableClass.ts b/src/makeSchemableClass.ts index 8268b52..544dade 100644 --- a/src/makeSchemableClass.ts +++ b/src/makeSchemableClass.ts @@ -21,15 +21,17 @@ export function makeSchemableClassFrom< >( extend: C, - schema: z.ZodObject< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - Values, - Values - >, + { schema, defaultValues }: { + schema: z.ZodObject< + SchemaT, + SchemaUnknownKeys, + SchemaCatchall, + Values, + Values + > - defaultValues: DefaultValues, + defaultValues: DefaultValues + }, ) { type Class = ( C extends ConcreteClass @@ -77,15 +79,17 @@ export function makeSchemableClass< Values extends {}, DefaultValues extends Partial, >( - schema: z.ZodObject< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - Values, - Values - >, + props: { + schema: z.ZodObject< + SchemaT, + SchemaUnknownKeys, + SchemaCatchall, + Values, + Values + > - defaultValues: DefaultValues, + defaultValues: DefaultValues + } ) { - return makeSchemableClassFrom(Object, schema, defaultValues) + return makeSchemableClassFrom(Object, props) } diff --git a/src/tests.ts b/src/tests.ts index 5e8740f..ce37480 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,3 +1,4 @@ +import { pipeInto } from "ts-functional-pipe" import { z } from "zod" import { makeSchemableClass, newSchemable } from "." import { makeJsonifiableSchemableClass } from "./jsonifiable" @@ -7,29 +8,44 @@ import { dejsonifyBigIntSchema, jsonifyBigIntSchema } from "./legacy/jsonifiable const UserLevel = z.enum(["User", "Admin"]) -const UserProto = makeSchemableClass(z.object({ - id: z.bigint(), - name: z.string(), - level: UserLevel, -}), { - level: "User" -} as const) +const UserProto = makeSchemableClass({ + schema: z.object({ + id: z.bigint(), + name: z.string(), + level: UserLevel, + }), + + defaultValues: { + level: "User" + } as const, +}) UserProto.defaultValues -const JsonifiableUserProto = makeJsonifiableSchemableClass(UserProto, { - jsonifySchema: ({ schema, shape }) => schema.extend({ - id: jsonifyBigIntSchema(shape.id) +class User extends pipeInto( + makeSchemableClass({ + schema: z.object({ + id: z.bigint(), + name: z.string(), + level: UserLevel, + }), + + defaultValues: { + level: "User" + } as const, }), - dejsonifySchema: ({ schema, shape }) => schema.extend({ - id: dejsonifyBigIntSchema(shape.id) - }), -}) + v => makeJsonifiableSchemableClass(v, { + jsonifySchema: ({ schema, shape }) => schema.extend({ + id: jsonifyBigIntSchema(shape.id) + }), - -class User extends JsonifiableUserProto {} + dejsonifySchema: ({ schema, shape }) => schema.extend({ + id: dejsonifyBigIntSchema(shape.id) + }), + }) +) {} const user1 = newSchemable(User, { id: 1n, name: "User" })