From 07e1eabcf153a31669a8207ccaba1a2120502f42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 24 Mar 2024 22:24:25 +0100 Subject: [PATCH] 0.1.3 (#4) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Julien Valverdé Reviewed-on: https://git.jvalver.de/Thilawyn/zod-schema-class/pulls/4 --- .drone.jsonnet | 4 +- bun.lockb | Bin 160864 -> 154440 bytes package.json | 44 +++-- rollup.config.ts | 43 ----- src/ExtendZodSchemaClass.ts | 56 ++++++ src/JsonifiedZodSchemaClass.ts | 42 +++++ src/ZodSchemaClass.ts | 24 +++ src/builders/ZodSchemaClassBuilder.ts | 133 ------------- src/builders/ZodSchemaClassExtender.ts | 196 -------------------- src/lib.ts | 6 +- src/schema/bigint.ts | 19 ++ src/schema/date.ts | 19 ++ src/schema/decimal.ts | 36 ++++ src/schema/effect/index.ts | 7 +- src/schema/effect/option.ts | 153 +++++++++++++-- src/schema/jsonifiable/bigint.ts | 28 --- src/schema/jsonifiable/date.ts | 28 --- src/schema/jsonifiable/decimal.ts | 33 ---- src/schema/jsonifiable/index.ts | 16 -- src/schema/lib.ts | 14 +- src/shapes/JsonifiableZodSchemaClass.ts | 78 -------- src/shapes/ZodSchemaClass.ts | 55 ------ src/tests.ts | 92 +++++---- src/tests2.ts | 20 ++ src/traits/ExtendableZodSchemaObject.ts | 63 +++++-- src/traits/JsonifiableZodSchemaObject.ts | 110 ----------- src/traits/JsonifiedZodSchemaObject.ts | 174 +++++++++++++++++ src/traits/MobXObservableZodSchemaObject.ts | 6 +- src/traits/ZodSchemaObject.ts | 183 +++++++++--------- src/util/class.ts | 93 +--------- src/util/index.ts | 2 +- src/util/misc.ts | 3 - src/util/zod.ts | 25 +++ tsconfig.json | 2 +- tsup.config.ts | 11 ++ 35 files changed, 796 insertions(+), 1022 deletions(-) delete mode 100644 rollup.config.ts create mode 100644 src/ExtendZodSchemaClass.ts create mode 100644 src/JsonifiedZodSchemaClass.ts create mode 100644 src/ZodSchemaClass.ts delete mode 100644 src/builders/ZodSchemaClassBuilder.ts delete mode 100644 src/builders/ZodSchemaClassExtender.ts create mode 100644 src/schema/bigint.ts create mode 100644 src/schema/date.ts create mode 100644 src/schema/decimal.ts delete mode 100644 src/schema/jsonifiable/bigint.ts delete mode 100644 src/schema/jsonifiable/date.ts delete mode 100644 src/schema/jsonifiable/decimal.ts delete mode 100644 src/schema/jsonifiable/index.ts delete mode 100644 src/shapes/JsonifiableZodSchemaClass.ts delete mode 100644 src/shapes/ZodSchemaClass.ts create mode 100644 src/tests2.ts delete mode 100644 src/traits/JsonifiableZodSchemaObject.ts create mode 100644 src/traits/JsonifiedZodSchemaObject.ts delete mode 100644 src/util/misc.ts create mode 100644 src/util/zod.ts create mode 100644 tsup.config.ts diff --git a/.drone.jsonnet b/.drone.jsonnet index fefec26..ecbbc49 100644 --- a/.drone.jsonnet +++ b/.drone.jsonnet @@ -16,8 +16,8 @@ local lint_step = { local build_step = { name: "build", - image: bun_image, - commands: ["bun run build"], + image: node_image, + commands: ["npm run build"], }; local pack_step = { diff --git a/bun.lockb b/bun.lockb index 6409dc584fc1f2037ea68159368bd3086dfe4393..422b3ef287913d5d3ee5d3d855e545f2f223ce3e 100755 GIT binary patch delta 38502 zcmeFaXIK==7B)IPfH1%i#J~tBDk`8v$;bdADhwc)Frgrzq9h3_ronB*jIFjgZ87JB zdFwV~&ZwYb&Ixn8@9LnObKK|o?vL+2_s8jncUG-cdDW^_)jiYH?MI5^I~3EM9kw^G zvm&S>XYZG8H@j|fTNkX|a#*w5BF^W`q~jj_27iCPvzuH-*UZA$dd&|{V|YgRu#(C0 zhh`-4Og=sp;0KGeH)u`pT?!A@)>@$mV=#+B%|Mg0d*`O4CduCD%4F5S-vYG&JqcO^ zbeAYE68RZoe7-1873G~lYaxA0k#7oG8+=VsE(b-q+WZ$fLcwLARN--v-vUYnEC!_p zOa!G?4-(_!#rO!3_XDN;IoY|H=%CCQy`o-c=O$()WGBn&D}{P8Q?e3rlCx!LLn)OO zFpcY{lp54Pq<1k6 zRDe6wLFxH|K>w*6DSv;clNuzI!=YhXYSARrLKWnTba20v#D3^$N_O&)WYFrCLXYl) zQpK4GIsKdlB>Tzk-m4&JO9Q!AB5D)Y2OI=f^C| z!;4g#nVX)Mn30rhWGz&bm64iCqj|ZmOlE@&yFd|@zd+r%K zx}fzy?;|tOW1tkjO5`WosD%OtLO?A}0;L`rqop(ipP&|KJwGoYEtMMB-%jXp{|vM< zT_$493kc38La?V0e3q+diB21x#^t`l$oWy>K35k?b_S8s7H^5b>AU!k9 zDLW%8rw!sTOY%eA1;cv=ilq4!BF#=t88L^{P>R>_7Rnh8O68mYB~A1N)sks< z_YpF*g8;K6zi&nkUr@2HkYOPxHDs;GPX{HHUhoqO1SM5#A*Y_Ff>On={DpkoMftuK zLOw~3S*RUEHRT5g4Ooo?@DKS@LCK;u$VkTI1xgM50gETTu_!+xY6wOM?aO4Fz*D+D zL1M+AqzOqgNS8=DN=$J|N$-;(D{_w(67);RcFIf0N}q=UC_`jRp(h7GsX<#osmH58 zDLzQ#AA|_;`6!e$(A|fL1_e9pgNLEBWVMkM#u=XI;iAx zKEkG`+8=I0d{#=k%SqWs&Sq!(=%uXuKvzDjW!GRkv>J*Zz>e#DKvuJ09- z5FrR*^Mli~WU}n+tQ0g|mYvc!J0~M6c^fjBBh$5Z0?p1y96<9V6MCYCrDRfSnal$` zbzlvfU{G6o7O9EbFXq|=O7^l$q{->bLbpnJ$Ee@<>6r~c@FR9AtY4O$cOXHmjL(dF}NW%*?gPzA@K-&&wf z-38xn1`4m7Uko|vHKK!vn4M^(O!fjsOV#vE$n8r7&V-Ee6@XH@tB9`+IvhL(K%1X{9`;6?k0F8- z6b^Hx{;dZk#Vi(SNPnS#VDJja(=#%8AC}O&cUJNsnM^Wl$>5i@6Y~FqN#(amrTQ?k zEfAoVNgF7s=S?9e1xltAjM1S6-G+0v0KE!I4e^T*Mz|$->VPHq2B40aLb*!tRDNnk zQbIQNEo(8dly4?zZQ5Y<@1IMWmq|WM8v5a4!fcWDNl8y~!hYi@rZp9~N2HlfsTqmb zG=gH4$dT=VJ@XwxK4YYl_CayrX(;wUZ`2V_)EP!C>4^F%p$3%rAW$kmk~cy^>e&pa znI=tIM(-ii;N(7ik`qxF9J$PpU8uA&Sfj8ub#$(KmMvAj>cWPolac4F*@Sodp^FemHS*EMHr+n|Fmj<_SJ%?DQoU547^G&7EpfR>JKFwh5Rjvk|;-CHaJU!t(+eI}& zJECh>oA|e^b!MltT^`0}X{A2I`mOCX#hl?b#S5IAh!)>}!XL$WLtiAaG z_Lcc5P%Cmmpq`Yk9;eqTc3ww4>4cD!uHKKLd z+p0O1)q71@99yiM*vt0T%u%O~6c5eXdZOjEqND7AI&GN(R$&#W+zEU0haKvIny?4! zG@W5(Ag`3MC01&s3xjPi;t(Zc*z;{EPEiD53kdaCb8Bz;bA~mvQOldi*>I3va(1GP zTCq_sleI+>hAr&r!z$_q>gnpqWTC9GuD@OwLT&iabcDkA(6yhjb*o9Tz6c5FHXtPA zt^66=LSH6}((03jjWHiU$93?{W83rC1APq7CfSM=L}J@4YJ=mIx@tsb;+-q%~X3mi6#`8v>L zLs8EPPk4YB2xY9fpSNNhI4^Lzta+-paxb`M;Gj#HzLdcTz6QHGlo{jet>^@fGU%{{ zsBhA*xYpi^6X06%g~d2|>ltAc2xlYx{N>4}?8GRw{H7^e5~Wsn!xi};l|FmEpN|0; zG6h4n(9v751{^hC!4?L4D=NXY1}A3=-MkfT%w@7x;LtS}Z}}v1HauD_zhll$j8-e` zu&`1-K?#pU4i(sYE1cl#$#$x-F^N6~BBRH~wDDmq*pe`{o;ge??z}sHZ3f z8H+?tmyJQ+UV)>&$yxI_AA_1gnNUf9w_*r5p?2!S7BNnr@6ij9tH$@iv6f60ghF7) zcE|^gs#DNlDRzLP{$X6u+s|SgTJ7qs=YtiuEgR|Nub7Px<^_0xlgkCZ6V= zxo;hqxFke`3U<+iChX!m>_i8(-W$Y+vr0REMGLGWR1ZdIkWUjZA!0Td|Ie#;a!!J? zt4y|U`jaCg9dtjjuj*JT<05k)Sh2YndzpoGy*D-XL(U>=ZYDy%h-guv1+8l{XRM z4GqOgcB*u-k;yzM8-z+SUiLtJg>hY(tb0`=FMp<(1zFJsZem|54@)2>&DdYY6|f zLmtM8*ng`;zO*50=&DwfHI$5ytlZiTn`cVN`;TmJ7#uR3AaA`t!TFKd>6Iho!5g4? zBSFhXWPp0zz`^7&cP1m`ft(n8TY%Gj0{EVx&d{tw1qKjH_ z2SUoD!`E%wkt zKsM6HU;fRWoj6pjaCHz8qnV!Giay{%`NZc#y!DE~1+hvue?>LNpOzfvt%v{@$frWv z6_db``+@^RGf#n|hCzMy-g?!VqG9Y5M}I{tglGoB(KvZ44uT^k^Yc+|+KdfvrB+13 z(|Ykq;0*LegM)D+>mG!H_#&x-FCr&QWq&83I^HGf<$`O;=P5>rdd<5Td8HF;*io%$ z~JgLD2-pL!-u9lX3{Smf(;=hVkJ2iTtoDTjHrUH^XK&5^-jf9WdvM&?pR`HF6@= zc$@eDP8ex&t)9&#=SPk#zd38zRIS(sA&mesz?@%zBc<}=p|FE>kvU_mki8c;!FN*1 zh2W^Ef=N9G7X;3LAFl}b5#j`OPWEKOebkCW5Jo|W6(G?^7nS(%h85<;8v3f`gT2^r zU$tU8tHfh590*2jk}fv^a|_Pmf<`T-p2 z*O)yI?|;ab?2<-D2OSm0sSQHBOfeoIQZf__>%2*Fz8vD}`U|?@tx(>@pA8RCE0#e> zO%xRN9UQ5FSCPDB3)WDrR+PY&s7zrYG!FPVsL)$9IMOL*a#PF(aHLaVHk<$#&Bu|| zs}R9EA%3o9f@_O7LEk&UwE-tgZ&OS!iW64)Sa9eD%^hEFd0`-15~NmKh7e;Uv|6qR zV#9;g@|+-cVz64V6FvUbi1*-}`NC+J?Sh4ghz1VuVS?F-E!B$2kWqTUNJ_v7rj4DW z0lH05ymIti=@ zE!fkp{)#|^s78kO9V5UAR#n)_#{dkq7v2}f`5Ihn-Z;I(_)UtVzupXlqWF!-6NIQ6 z=o=iVBm9XtIiYDVqy$6_@zDjN=1aMaPzzRxCRl5Pyl8odw;~Fhkes~yIB=*~m_v$E zaJ2H9@>{2ym|Qge)p)KJoD8*AaQNZigi>e&_J_z}uM_R9*e!CHx^U%hzzMG06$<+~ zK8hr8a9!B2qW6mB;HW&@b+q(W)N6;`J2)eL(4K%pXGDWn!zKhxnA>soyDT}92`7~a04KB?Z8g#rdCYoAT$Wh4T?DqjxwNIuv+7e?8F{wy*3@m z-mnoXVqX%#d4n^j8KQR(9B(U%>YXKnrb!YF&K;=) z8!ZF}qZK@o;w3ohzYymJe?n%7Wn%pCIMd%;0Jq+Uic1k^G#e+jtWKRJ01L8;7H}T z+rXx2BRC)4u{=Zw^B~`ZH}I;kjlQ}`qAa4_)gvb3or|9Ym#QaxOS(GL{E)@c=kdqM(fL;K&@op_HD9g0%=rTnvuJ4mVLj zxMc(<4!y?5AW2xMP-K|5UKY5ve4}=Ya^5E^o`9n){Bo>UH<^qacQf)X$!z!lwPG~{ zG#hbSmgi#thAM*&J-y{NeOSX(wW3oWX~1dtS#VUG(ALl3s8@p0{rdj2bM$c$I4T(x z!@s=*M?Dtixl=#flk#z7M5DpAMy`fwhcEApWa;FtlDf@o3q1gAlqA)hZF9Hqn!I}CagII2%@ zB5%QYgEM2P)v>9Pfg+{eLU8c+{w;J75Jsh8+D|o-jf10t4QS`a6tX9>0u?7ABQ*#r zQl?94APa5>E)a1TQ{0wJ1sBENu9P7}9TRp(wK9IrG2B_kgA?{uM-fV*1xwE}lW!Pq zXtELVLQeipTW>XS>}e~1#Vv%WM9h8K;|%;cP`Crn0O!m`hPE)E0H2u>odieIOVG7> zmQaAOxzdOnzlTta1xJ+%)BZd-vI)WWnPv-|Fe;JY$P|T?W5H2ASOIi>R7{C7+xsv% zY{^KqqE*h%2QAn_Xmfb4e*!|m1Y_d8<$AeniB>I-&t(ns)$*meY&gi}Ty`Re$so1_ zq}?FaaFklUcn}*tO06g#B&>y)!5%)wgM~#{E|bZivuOUoT?mA<8ep}wc45!e(bbwD znn2g@C}lU}V+E>%u!YDIWq=wYPqa4BROJ5;sFqLqe~|G1QaYjje`#@bR0SRJ7g2ox zvxvW{Qqn{lfHZ&^&r@u#`0IC64>3^yX*8No1&W1)zeqp@#fY>$FXh)2K0`;5Ct3~Y z22caA^ziwxnD7@-lEbshWbD4NP0Wdd*W**cr$PE{Y!fXt0#lv8h*By{IzAO96n_z= zHet5#*Y7Ch%K@l7SRa4=j#4?WJ-(iy{ErC0Ai!5J43w^_)D-+gUiyE7io^cjD$qsc zQ^f}Sj?yU16ytwKX}ISCq?!3*I-;bB1ynx;7K(HcC|yKJzF4G7KO-8z^1>jZ%T%0kVDu3^iDXglthkJ*^P}rr=0mMj!u1DRp&G{yR!h z7GgY6eeiWezA7b=l_;-5$+rGAg3?%v3I7|VhSe3*5v5=~kta$)Tao`AC6jN&SO|J` z5HmPZ2DW@+Z50KYiP@`ChW$3NwwA2LQ_SNfrurSFC~q;oDkYH*KByCZV*KwYMfr>I zM9BsM8UB}nd;qLKDNT@=kSG=0Qsn;|t&VgZk&YZhH!(d?%HIQ&L~){=C{#zodZhw=27IoQ4-A;(=DJeAi+XWut=nfNr;Om z6|@wT8n9gCSBUXdDaEgboTAo<>DGzqs#5CuCdi3yqcNZgc8D2viW#a>ir)=6MePyk zUNId}3honmqBM68gHi>@K`H8lNJ~Jeyi+73szrbjo)Z(C7wH9&UIZnhC>8l@pyX`s ziTr&~vbv|BbP=WCGm$4s!RPp(ieHLyiE1f85wFDvqST;wB2Sd&={HakeHZ2bjZ%43 zC=H1Y&j^&V>WaKbwY-2L^u!3FX5edrlDrluHK-0K&9i2r+)1R)pmbHGq_O5=yay;H z@e-*IF}MWUR|*J}D)bc-5T&3$K1kjIlr+(bg#Sh~M52!#6oW#dhG{y)1D5bOUxs*o%#K*!GM9Ll;YxBQ*gWug-h?eocdxK4a!TifT0$JAo?hXETZ@{~ldSnf_h*Hp2=aRK&88S|ihd zLx$s$jrN~N+?JnMZO@U&qeo}IvmIpJ&b_g3a`mX=$`(!9mdC|(jf?-IBEB-Op6iz` z)izx_7C5=~!}AznM)uv5MqP(ZSscsuTddUT1a^HoZ9+lJ(UAF@^Geq{>5Wmi9p7@c zw&@MKneES=tKI10#RK`u)rnmkhX%*)jBnnlf5?8*BbDt!i&l*txgz#-l|pHKkuF`w zt>tBJ<{9k%^6F^OAI%gCl)Jn#^yPgsz4PY8jElGW+Thg00P|HVRh}IUK71YB|4XNu z7K6s;wb=FTXtQBUjgRZrWtB@TS*N8MMxV`F8p|GEqGZd#DOiVPv5X-*3ZF*oHGCSg zZhyuyO11!>CTs;hOxPb*>>OEzX@ETdvq(bX~s>Ua6paT30b?s#j(!J);}uaK5BFJ zMvuH%|KYCZ*B*b zUaC^CUDbkLwZ3f9bl-$q56zpoxKY)D6W_1hx9j_cy&vov6uot}>v;9z z2!|ct6CCb!+P3>|Dv*mJi>K?^C7MO{zBT?CI7XFCH!&tvhb>(znH1=8f|CH1Tb>krA0$ zD%TA?M#zdjp1XSSq+HcU&-%mn$#sY9t3P0@b6VH3oWFZM-}^!>ci+YR0v{DDINyIo%zy!XI(EAA zN7(vRo%$8Gn>1@qmDV{_ZCz;R_Vs(VwTjbc2d`Xqz2dI`i+7KAXV*XI9Q-4`TDs%P z;bT>XW1IY~wH$9+T4Z@HYf?tPQ}jSRmBa8zWLNO zPPXY@TBTe(E0FHuVfO3hShUQmv0y}MZBzGlMeREbKXmiRial#pVsttbWkTvV6Dx~uAjnWD; z-@!2-A3dJ+CEu}NW8ttCYh0dWm%n`e^+L&j+-eJSJDfNWGpxnh7BAP-x;th=bRUz+ z#jo$ty}4Ad6YF+AmT_ha@ae)<;M0}$eGtpIv4!|_XCLFUIUD>imhoWc;?t9TjZZH& z>`^S^%`SZu%eLLDWR{g#j=(=lx$I%hH1kx zPvH5$B|p(HVQfl8EIXuF$)2vzFd9~MCziF}sbojo(J+zh32>$0obGBO+f`Mb$DI|G zmPw}!Dr?tcu78h`<$T{WFDCf(OvU~sD4dXCpOF*b;0nH$>P-5b|xm{ zSC9O2MN6l}n~pS?wa>};s@0NP?+^HYyt8s`c+uI{^IBFJfS9U{+k4HgUxa(=fNlp< zwtW5iYC-&&$qq(cZQuXB_O4~Tt&g!>l{zC~aH;A~tDJLxBt`Vv>$HEEsm}beYTN!i zmtXXxcLM9Q+memjqKWKKwb-=k)$mUJG-%Z*ZjL z`h)F*D)qKU?RYo&q-U#6k1pAE@Lc?9-1L1dKTYg<-JvO4zS~mU=D1O)SI?4#-X*DL ze=NJhecQXO?>GyefmhZqe;HY#N(yS&DQ@qZ+BxZOJ91vjbzIBN`PnV|G|oKz%HOf) zPCWctrO)`0*UwA$hQpF4V}gqw-0b7hG5UsW$l31WZ9F3n-%F@NTSyS-j_^pnFj_AFO(CF`#sbEjwk8rM9bPPitk!hSB~@jgEG$Tqaw; zeewQkqwjqj+Uam`fyubCNqPMWYKZve+u9G z3Y!7=?w^-#g6XLFR_v&oGvj6zf6O1Jbu2uddwHh1^>)KgpI6=SOutdPjpIhoPpXT- zmwUX5+OK!xenF-3*3yf9TmD*)*H6BOvjKZ8wYh%%4zw+sWl}P_Zu=aSV;j!|^BT36 z{RrgFr@gxz@$S=-^J#{`jk?8YJKS+zf1u&%?GxrUUwFUBZl;dBdyUHRhtVEs!s2&j zKQG;VlZHhHbbQy(@2a-hm^~W54?%lg>TGhkGqZcEj)V2T7%v>?7-^9vQ;lf2aM$<>-c{%&d1Lx;|x+duEE#Xd*ttUWoa(yC-QKQ+$w22;EnKrsYD{lc+uW^laGm4(bG0T8?UrBEtc~5g@s?hx zO@}kvb83b~-qb5p^99T31t6L9s{|@v_nq~WHKQVP;#~H8Uejy+Eyqd0@sqIl_c zxYOfkMnH`Ft`7sQl`c*#zVc`59~B#!@1ZHyl(gB&1>5DeLHSlwNsmqw(O?5-L#+Hp&jco>?5x zNSAKl;!~@NHR0Vhr#&qw&%fDg=|d^@o-^gy#|ehZ|~*&WB%S!si3-*)q3X^DPr8s@2g!xopy9?HQBeD zy;blK?>p@e>Rk!5{Nrhp!<#x7MUDxr`~J;?gwUN4Z3cYJUs?JhTstQ^XnKPwD1@Qg zKj=BJYQgtsoBBP-UlshL`w+{`Dz_lrgWah0{b#L2Gl>;WB? z4_M&w?OBiTs0mZka{49aMCM+8>`u>D7<@xS8cwQOuF;6-_38ezyVTT{Y)fotF!k?) zM+Po)o!4?%*{iintNEsM+gUHj_pdLPI~s*h_K?DS75DNskT2C1pmh=6|~) z6`WkP;0DhP7fs1nr>?Y-z4jaMYUr|iIzF$>yGRu3c2=uzvpcb}><_4L{y5INiLm z|7_Ok)9s`aeVC`gnz;*OzVG;QA+Y7MKizdU*@pU$O>7c(`spdhb;}op9WfOA1WXtj z?kg1vs@2tNeBChRYx2tQ@*uN8oi~Jk>DJgM*|_b62j(?9jvlNt?gp3peOcM!?;!=T z?W}s+4IJ_4Y?-v3oKlELk=u^t-sp2U$@-GrxdG9eZoO$d*}zTLwsCNVV@kH7qPf1#z?WUy)b8ARR@@W5 zU}05AVT1R?YWr6$e)WU^`)@mQ)cp%LhTSdBN$Ki-?$-Q@x0fm}oPKZnaB|(u{+b3x z(+2E4kfYwN2-Ik%lFSsp{gUMSW=MSJ6FJP@`w7mWle|YB?fFCLx@G6Z zBFo2@c3tAif`&C7nBJqwRL|5Qe$G`|hhJ6xymbA0IcRsi*_%@~QSt)Fm0x0$|)>yPBV^-4B*1WqsTN#p@AoR`jBPh zt;x){si(T{sGPh!F?#v+yUV=#7SDQ`lr--Be#dZ!?%Q1cs+`fK&c?#V{`;SrsJEsk zAE|cpoWs7$@gDU|{Q@ooR%u;^jJspabY>?UR&t>>j7C0C#?7#Sz~_jPdq;w78P~Ed z1dkvns>^7YT()pG?sktVxo=?QgJoQJJ;b*?rsUSwgCI}FeI~(22;yuZ7$)P^*g~-C zxRO)WhhT(^>sB9vE+>@SJ`!kUoM8h93`&$-S_241$++Dl*a?A6LkLF8xc&_x=yy`d zohHFp8CS;+0?SiMZiF49iKK-|x^&;%Tb(@5nwc4l|Ab|GA+capYKyLWv1`8DXHcy4L9c6&p2JXeNW%;@*}g>c3S=L+lpO2Q_L#IrqAwU zTAbc)@X0lr$!Lvaq6Mt#D)!r_mDh>}E=0{iijxm>pChk2K z9y0P_>Kw~c{l{goHfJognrXF8&)V~HZ-vLihcAqyW{#O6U$rmEefmy zFqye#u1UMY@2oauj3_m|9sV`HXS0|cGcGuv+dKYm+QCR&rZqvjbW`^HSoP33;FEWZ z#Vu3cxgFY<%zM_NFmT&~Q7;|0EUC4(!N>ybps@>7IVP$#N2b3D8Bk-j&C{**R!lp& z?EUffN1xwfPos5Xx;1EQcmHYL!_OKg>-e-`dNUkzj8-;&_i)Dev9~=rZTkL;`xf@L zU)gQ&uItkVw$UEhoZE4$$(@mB8m<`@y6ZMQ2a{SiO==pbuKuXdzH9z!*RNun#+(7)TIkv;uj~k9%g;dr_qJ7D zZ}Pf!`sync`%Jpt+T>ww|7@*#&BEICMjonhYg%5dd*!Pg_CMblcH=^Z?Ni1$xJmz! zA?lZD<$eL3R1v4DXkb>=#yx(JdT)<+w{y!j<*t6`G_He-&6@Dmlkz)h0*>}yHRkcN z7a38xrLDHAw&%J=*Zt$sAM;zb_EHb}F-Kji_k_RO=({#!r<}LcCLJ_Sc`xgJMu`{brzTM`d|N3&b_6~Erx?gM6uB7z1D#~-q%k;J*9&7Sqb(`OO zFz-@p+MG$_!&Pma;?c+#lk--;INA8lv87Y$4Yhe(_r8v`zIn{EN!L2tj$Kf1MM&F| zKlZA8k9!Qrbq*iby#J>yoYADNI*V_ra;7#nZpa2)u+-Wg?pZVZt^TBurgulp@EGhc zapTgGL2=8s`Y-C3S$D-K9hfUR1*&Fq>f$Vd%Zkq8~ANzhId+rIayK=4mhO}O7^kntN z+AMoA%x=QHivCXm2Di{@uQNNiiC(8=Nt4@@_PSqtLf|Bedb;Tyjk8k?Xl<2rH(zQR zsBZo2-9AkNN=%(x*WC(O*kxYrg0$(&s-HNRdm!g#oXNm9`&MjO+32sKsx3{&8}1L~ zM*b+77P6p79kF}hY0qXWO;g9Q3olx-o`*D%3#%4ez3ZXetVK`TeAO&ZI2AjuPR09( z_I--`)+ilva?s>Pxhu-&r$6ixy*ak;{2||7tG3ylS-8K|t8<>0_th=(oOQHCe>U=x zC42vnhFQ$I9meyF%Xpq~Sc7+I61L%a2Dl^JG|Zo@`F1?dxT0jABd&<`J%Z;MSC#C- zBN}EU`xxADaFItf%xZS-QTW$VCHoEBS~lz$o@ZRc^Vnk=WyPVK4o7t`>Fkf#d*?r))vWk*e_7S+W5)HGR-34w=nUb|RsbPxQl#_T~Q;sJl z;C8X9Q+QqjZp0}KvxhwaZq-dCI~G1*AA9~Zp4Z$`vYux&%wO!NGw9!KC3_#-LDuao z`Uh^-Sq*cDtpL}r0#9$wX_zBy;W_m04xZkCJH`f|NB_VTo!2lY*w^5O+*PujE@+sO z?9vP9-#sO(cTvNfW@9d*f8e%*JIgYc(7*e5&T~nFm)16e^Lc&xyvpsNB^Foop`EspN+YR{ym3w@l@*} zyX!Xk2hIjhpdPb%chSEWsNt@LdCEH6L;qf)hI<<3IeQIUDY$)ja`lo`JVpOrp_Hc@ z<~6$uoX=~N@=U{2vMKPskHC$1u3_G>C!V8!Z_tMq8s-C=_X7Q^L=E6Ru?{cMKX6lC zYM3wVHE^rmq7Sb$%r~~+75euMRtN3}>-!r0dk?F7t&uYf`{XsYC14}pXyiH!JMRrP zB_CjSVD%U_yb@cIk1)JSja;8$KZ89EHtwxPu3*?TZ#%O?KEd?fY2-!>+wEOv*8Vg4 z^-hED92D=-OK@rLHTc$H7q|&u(60{~eD9F*0loYR+XH98sy?EZ;6{AZ;Jb$t;O2Zo zFF(IZuHMT2i33cke7>VkTogR95-evRb} z7_bY!YVbA0W3W4kjr^uz8nSc0#d7`RV84NF#D;y3LhlX)r zSO19RhUhZNSxW2{o6hRW#B%m}VE2J_;uH+{Qt(_F1Az;-iv$y@L0}_?z>Q0hL*Szi z!D$jS=TtfnJR-pe9SA(R6C{{p0D+S(1m0YpE(C2A5R{X^mvhjA;3Em9=t1DmT_eFN zLkI$@K@h+dRD+<45d_ak5XkxJLttPG!9slqg1N^e*hzv&0|-L6xdssQQ$p~K1fg7* z0s>1D2-YhgXv2LX!EqAA8A1@otu};Uh$#e0BM3BHS0f1Q%^=uEf=Etb3_&Rg(u^T! z$L%7)1ak;%NP#h2iV^~!>JXeJK?hD{0>L8^j4*+q6L*3Hb1WcmGKC10auVcm4ptC+B*7Fb2!?UjNU+Klf&gm>MsNkz5Ok>z z!DZZDFj}sDBM1x{Krpru1f#g~B-lv;&&Cjp=0-J!pkG4>?vr3F=hg%QOFIZ=HGyC} zS3!c~BnY*Kpnxm1hhRt}2;Pxk5*O?Mfqi2LiX0%A!o4OzDG53`LNJY6>IlJvCJ^W~ z#eGj9o(M>nuJujr$mBm3-o4y#QgPxm|6>EUH5;Q|lhg1|96uG_Bvtp(wo|-I=TJ#`t z&w~9&?pe;>QG2RIqcJTTEpNVdQqwijm;TO0nK=bB+Rw;K%XKVe)zJqP;#q(Ao} zEW_4W62*;iVUlLMFt+jvhMOABw47n3tCap%@drFNGAb?%XU;NQz8hm%Q~KY(iK!{h z^v?(B(FFc+M6e4t-G#}gtkVCY>xAFZn^D&0auV0K6#j!-Q&3(U!a&UJ^<)h6Y;Ew% zdrHd7l+wS1?VXbDoK|e+!K`A6Z~HO&R8Gxw@gJG)b`{E_1{hNV@QR%^RV4if)9mK> zUpO2Jod#*~0&m7ZhXQ;3m>?>M8?Hvpd?P7QAc>5F7z5R9{94pdhSw%haDV#8oB02< z*0{AZp=5oL%;tz2|7+ZQXBR;Wlrl3RF(U_0tIlxcK}-`p<46=j8HOQ)Liz`mvx*CY zneKWvk}lfgc^rPv&sUX>f6nXFH!pK~v7!yri;)lS%k^)|tYD57n};#kjABU!eu|B> zyNjowOY-9Qc8p!5p}};)!luvU7AxGiZXg#f`arD?KDAVBFhnl3JBA=!X=DF0Oh5N zUaO#>5zt1I4HjikhAd2!4H0EZ$U1NpC_?KeMhz9CU|~PsPocLjD4HHeRseL-n-?@V z=0H3^-5V*UqsNyEDFZHg8GwQoz*JF|FUo2_MtN|V$VQ36n&7nDsHJGrWidUy%Rwro z33fn~jTe){Op2L%E)>sXbapxpcW|kERxj+%0<}>Q0iO*fWEz@ zi(Wp_rSBLTg7E}H4WKtq@F%kak^pMJd{Nd2Vg3yz&;_EbF~W}!wgsipz@MxMPz~Lz z54s2fs@NW=q)1%LKq*LHqIX37e5?Kxg^u9qTR3Vdy|qFK@#QuBZh@E4ztbaGGoY&| zqqkXThByHR6p2fEqlKOpe&i*;-fnRLPygJVF6}z8K)54WT?nc5>qQy-gsiD3qw%M* z-GMI%P>(i>GI%Q9KB@7WM41P|^xY6Obh9Y)MED0l*A_w6o!)&GN(R{~CZu`oiHfPE z+eDcU!u0kE#cda5z6g{0DUM#n!Jq8FO!~wS&F4lgXBu-$mNPyL=&c5N10o7&2OLC# zzkx%*Vc>|2o4T5D4mgkS1>hoZ3AhYg0j>h206C`X06C*Fpd7df+yZWMOII=$demlD z?s5@RPfPQb<|(mpZ`4v;$}_ebuITvRm5q2Em6C!|_g2m-BuP=I_D`KE9{14ICkKsz8BhygkPK|nAN z0H^_ST0Vd`K;Jr40C$0Vzf05Jtzsg0dK5W~TV2F7tP5}o1nmRO9dI9l30?-@i2y_9u0^}mY0dk9}KpNl#xijDjGzUBYTcAGB z0B8u*1FY#=K^p`rk?9SvAE1Xadx6EkCSWiy1jqvh0$D&d&w% zdtd=D6vzSE0Q4f$a?oYKA4q#2cmO;E9s^GRdg<#m=o>&=iI2CyZeSZg&R{8^3+MsW z0DZs!Pyj}NF`xuYfN!YiBd`!C0$xEz?yw&49pN9qJK#O=5%>!10d@g!GFsj*TY<3v zY5}zYOTY{;2fm}wAAk(uPat1_7YNgvWDFn&5+JJs83WMIS$l)0SFv7!`a-4#jR&S6 zJOZGtz%YP+`*S`5hk;H&1QMkKZV0;raR@I0od=8tx&b$Ua^N;_7dQ!Q0^)!HNFN2X z1Ns4;kR^fE1$_k2N@fh005t%9#p;9vu|QXVG7*|0@iTzlx3d9gF`>od3uF`@4^ZQ} z0o?&w9I7MkGw4@<{Jk4M@99xG2|7q42krsXAQP(OIH>?vjUsaL4QyDjGk`*XHVPAg zg@`9(YrvJSWvpuIAc&%AZ_MxY^g$JzY8}%-t3=QkFaqWQa{(40-%QEJ0~rA6ne^2k zpe~Ra?0|;AkAJ(!50g%5QKmJp3D6j51ULds0eb+u04*<|x!?h~0WN?u;3|gQL7M|! zfF}?F_yNIy4-f>v+wyOok(^|{KnuWMYzLm;y`&CISV( z1YitY=L3eoEnos8tS7Xtw$H^T3`*Z5!eQ70X6}f z0gB%WoB)mi+N1dR3)lzj1!yRC0mZ;hV22pq1G*d74;%p~-C^Kw;2>}SptOg8l< zG;kI;50nFCz%}49KpiWk@xO`yjq??N!q1 zCx8=B2+%OT23`S`z0Yxs9W27uCTtR>I_@CRstqBWn^e>p(w z!DpnUwc`f}<@*YJ0saKOiBt-^fR|QW^1zJ&vZ;oEik50pBP~$0P}Kx#092?cD6NLH zD$?pm4WSj38bB*2^^#UoT1ja|C7xDNLx37Vpvq|xqy|chAGvgjqcXIViB?9bzy=7D zHb{-s5GueHRB8y#0!ah3I$8l3M}EUo4`EuAq>7h9ZU?>*K>Lj*fIUEUk_H@TsdfV+ zsfUD=&;@V?s1X#Vm6Lcsz#CW!Ijy8#Ky!drL=Q1c)CZs?nmRybO4?fQ+j55xdbKm?!xB7t^5b0mxgB{|7@09}F3KqsI(Kzj(1bpdEL(X8+R zV!=~50W=PvI(h*;fp|chh>wOqU*LC!NLrxr?*o_s|89)QkWm^!RYS{wJROh$G)q!J z2LLoAQkf`E%NIyfhYYJfKq{g_Nk#oYQvfoss#;2ejI`knIpw81nZQznX&43p&LU`t zs8X8JG}Kgw0$9qYZ7b~AD8V1VC}1=&1{e#F>Iy)o0F!}9Vt6X(bf9e!K5*@*;972H z8rP(-6<~<trZH@%3ZkoKD6W1GG*{Hb_+nM^cq=VC>Qzeko$Jv#O z+QHQI>>@U3aijcZO~)qpMw};F0<-Fk7_>RRR?oZNlPcD%kuyDAo!y+>d}V{VfMP~f zJ0A%YNN}*a|GQohGfpA_8sx#%D`sr)T>ZbMNkbaBm7JSg%(%-J%ee!^jHQ=!(A&+M ze=S_=zRy>eL504g73nCrqlvS|B8v%;Y@ZSuXK2v<>$|C?Mu9pf2EL)ms@1z zy8Ghe#BRT07VB_5kk?u|kWN{<)#F7Q1|9pA;@{*3lTiZG%E-SFff?o-wgY(WWHM2Qv|G3?+n3lR+vt4MI zbktsI{IVZc3U>wnN|CC|#Uq7RzApcWBLCs+oHt7Y-|zXALOQ;0g6_J0z0CdarJJP8 zB3*6+<&_TnJ9xivl|}6~AAY4ciBfA|WRJhkuQz;oC-zs&EnV&_^7fGq5%h{UwPWdw zZ9{*hkWT)R&b;8Q!j=B-d}2Z(ECzcb@l*`NcsY~(%A`}qqysh()7;t9*^M*4#;7p- zGU@vOvxWg7gY_$mk$~@wyG%L(O*;DnF`nGKLrh(5bD4COn{;9bUo7%rt7gPMZ^)O< z7(tAOGani%z}K*0db(_x9v+q#0g=Q3rTHyRI_nbU*1> z7c>Daqb5k_-be?(P+z&8HyCSeb7wbK>D)x=R2jbMZq8n~Nf;_LR63UiG42>*Xiqwv zQ98MXN)$9+Unv-ybhZs*FcQwV|B=pXluoljjMhyU4Cx3*>42MG#nC@9!RY2oN8%tx z%p)BGDIJm{XTp${M(H;diFxQGMRK~*u{d1GImXahI{5KGokrF6^oqZYI^3Z+Pi&=4 zxmV{HN3UJTR|ol|BPGY0^+-(}!z|!i<3^Syo$Do?{~~8>%(&?DjHR8F_Z})nG5KBp zdZD-A=5u?#7T!pG&AG`)X)PT%xoFLdr?qNc7>g8e>@%l-Z!w zb)>+&q7^ zEeX=Ol$|aDLcXMdg)lBrE`Kjml^m*p zJY)dK)3Z7keHQger(D`JsAzaV(O?%+z_clabbe+xX2Fft9~Niwz2G(RQY=+E$B1tU zpGP`lQ#$DgG0lb2(7#2f&-yN!MQ!ap&@Ldz$kYcZ+>ruv&Aldf6B>{=u;B8~Amwkh z$fp!_B~P*7&LE|ibP{LRqh9TwgnxR5GBF<1hu^f+SD5c&8SeQ|K3Q(`$ke@Mo42k* zUQ8XzD;?`79cY9Ye)4dS&N9~W>Xux!b4-L*I>giPajZ??lF6TuO6;+8Os8}{6Jp5M zpr_J-p3+H9d<@)%tIQVWt3qp}vz`#cI|mP$boi%q>Jwj&o3j=T{iotQWYWo?(veWe zBz8_Z5>z@23Napn&&UxE50#FMLJUnyG#lrO@+Z1U2TM_&`iOFeqY+OUmCl$#6naWp zOyZIcGR?KpiJ*IG)T$mgZSEhs4EhU2VH0PAohG`x{l~L6hIL9B{fd!}6^)tq;ziJs z^WT5P97CSE$WtxnLQ?9PO8KuC>1fiejdbH&AC0vTV@OTX>7_oehP5*>8-M;+Ch2_B zNz=Y9C~j!}wVn6oNN6nW;9}G38a8g zT~NAcdeWEa(kWi@K*3jfV5I(I%~A)D`|_3L;K)jRA1xcx#jB6`@tZwq$@1l=LhD9c z(hF=EV;XUDUNC*+&W&fk!~~TNR{g8l{OkUmEW>$AflJ0cQ)ABKB{Fnv%=II>xG}eY za!5zF22>u{Tw>;lA29Lu2;1t>ggb{6@(oS6CzK=Eo~!!`{1bc5=M@uSEuG0aDQV{B zz1L6Nk~8Er;QM839k?Y(sTGfJ&G)a@w&&0p;rMBow6q^`6qfc4WqY30&u&%+F`^Uv zhslo~NN2N3r;;I$=oa&v3Jy#SSTk0k6{0W_%RyOQa)UrNhsD#Yl(5O2?xi zMqHw$<7B0S)DR=CBERuW&D%pAXt#7Gt#lgOuZpBoX{Gbn_!xeQO6Lz>$o}j5<@PNU zh~e#si!NtsaQiPZ21(LMv(g!Ba%LpLA)s8L#N_o0XN_!!r*~Gw#;X0h2o%{KG6hw8z_}t8Sb%uw07dqBpti#+e*J6JEJ-_D4{)bmr^KMxnjF zs&x5+Q7)8XbONn(0w3~)J@Yd2H!+rhKQJ1p6wnYw4VV~pW%Pm0)FX?#VQS)zeZyaxa zK?-rfmrguhR706%GJf0+s*McRN0#c#y`a3(S;_I$$2ZzAW9S&9AjbwJ{)01w+n(;r zwJ1T$r1O}M)XBX1POWN%yrS`}_2n{=!b>{2x%r1DJvK6{^na!J=e#HUxc!t@I@P&G zy0Lrnr5}^2?Lxn$bDQ^kU27ibvAi!|DzDwCEjZ(oXxTrveRT^i=p+XJH)V(hx32{^ z6=nRFw&w>3CYI(NXT3`=RE_sQ&IjLW(Jx?c%zyFaHUN)pTfj@zXn zS0=7MSGbCcXrMBJ`+5m^juE`kfcguW+4a3hJP zBIj+$hedFw5N{=&Z+w2-h+IAOF}j_ieHVsi4)@~{)0|nuRXk@@OfeUE8RR(E_cAjI zr4>K9%;0D4W!&>C5I^Gv-egqP!ZFXX{4P7KYNlTI3PoY!I9G4SwYZ7~|K9ski~G0Z zGOwb6g8f^{hqUANBZrlA#`W@~UL%%8WOP88;zO9Z-0Q2*1-xbc4W_AqC|$+{mZC+Q zxYIX4_H!?vfSl!+#~@-~u5kxTVICgQ-1|~kdS*1&^BS{_xy3Df%tSg%hi{+QsNS8_ zv4t%vbanP3ha(-w{Ylwid(EIFujEW>2X5+h#+HiObRCmcI)FRg?@P7$3v=dRKZs$Z zOH9Gc;oQ(JaX2iwq#H~fu?OzVGHwqw_FtMlyNroqws7srpkDpX!ldoEV(5mt!|j)& zWun206HWd{XKqm$lqQ|$ZBP)Rf9ua>0Z2)9flvE=sOM7^TW zS~~OlONXASYd0s}{58^Ia@u9MRxp;#4lei>)7<)S58)nd{ws^Mhsx$Ek%9aiR{Wqi zZaT{Ml#UJe+ZYk|FfuqtOo4_=2Z-wjrcT^#yFZE75bvV@=FD$1Dyx6a$|q=UEgdmF ze{M;gfoVI9Py#KX7;so*Jk7CfZrsq@P_kf>a*ufKI9PEC@_Q!qCIUaz9#O$W$|ojp zrz#L#yZ7unzf>emST5oY9}n3qSxw`N7kAD>LEP9xjU%+IHz-$ ziDa&FF?V5Hx48j#Vf&(YrzY;c%bbzNCUFz*VF!VsExm_E^iJZ8?}Oemo)QOz`L%0SQD@>fp5)x&D7LGDdK}0W+rzFP58~Tt?OtAJ)a6r z5pJ`>);dQI+A@Nsv*?q;Q#j{`P|#v7;UPM+o*M=t59!a%hEy*2qh<#9#s%|6@JcoH zpz;6Lj)`tb@H|wQ-B!|p>a%w5i`ZeUh!XpaF8#~A|DDTf#w9#v{6#+nPx2H#P2Mz> ztM&x#g@gAa+9H)pe}WN{+~U8~{x7~IQr;$&Q$J<;Sa0bhJY9_I8E)isYy|FnBzK|T znLF?lrAZE^ik-B4CfLWIXRw>#bnY;ywRBqhAZHAmFfcz#`Ye8s$ov# z^8~Z8^pZ|&XD>e0*?;iIdR@lt|EcR}W8)~U*%v4AcVcq(#f~q&^PQcVbiDUr`)t>C zYzYwrgwLYTP?E0i=FXe!?H;>(x!6<;Us)|2F zq5=ug<`1eWMJ9>Oj}-c5?>62$Q~&VId-LY)o0<2u^KNwR**E!%QpK~LmJdHY_=o8U zkm%*y{kx}xZ>>-&;QfeulQH$)zaKpNCUK`EcZ}rx|6{*h!q(5}5ZC*`_kjog^4Z{< zpOa)B_f7w*lm$0k!Q3@z7GJ$4#ZSFJIB^pFqw&$dNhjOCtS{L;OK%T5ssFFnaQX+A z7q7lTu&5ENrGIi^=t6hub%J*g{9eIMpOAm}QGMOvIbtqeKt6ut$zL3LJ>2~w!Qy$# z!AIJ^3XDWQ`87d;!MhVjAKrgr^27RK;>|ctUYGXt+@!S?3D}jZJHP*r@een}uT*C9 z#$hzCOLNUxo>2>mMwc`2{p(WXwzRk~ky+rGz6zoP-gpndz|bdGYX6cmxw`Qg5I_<)f!X z!j%9-LcYgRw+|wADOVx;YQ!O;8kmjX8xKQtXv10(;Rc-8Vl1Q~f%iNLt@ueAVoe2A zClj$V3kc&-YShdUqtfVtySw=IozRHCor6~A!Z>^(wOY1G8_3FP)?UDKld!j0V2ZSd zmWuCALbR!DDpl~aNq7wZD8tMau`CJvuMBf|e+pt}`k(<{O+uuF7mQ;nDSn=x#HUjb z#7~p38?6-l6pwrh{*FJBp%2e0g!@z`%k1u_RyqZ{a3&6ia5)6McqtBVV`2(emr!?$ zSw*Ex!sK;DBc)euJbi$umZo6Z`Dg^5m+(;?y2#YUqG7lNTE~5wNo(eVNR>q0w@#5Q zPMTqw%Ay#(yUVZR!o*y2ES`A`_PE^luj6Rph<^?2J|Vf`5uUx5Ocm$8lzK7J0uQ5%m?A)5)25Mwty!f5v&V48>8+I#-Jy#?mxuT$_t8J&g1YP^zE;-S;-Wdy$&$< zAW9HxMpm&FhAqRi=NHR-Ud?L4MV;WLr5ZZ^vlV)WHlQuRte(~)y(NDXZ4p%!A`l<= z)Lk$T^eQHV^qOR(6>Evs2tX7yFj+U9>EIokVYXA072KV(7mM7IIjJe<&W|_42NEPw zxO^Y<<7^NDc(4ol>Ef=3Xvdek;Px8CZyKN(@7)SP|G=3V5*o7=-w#3)z7>R!uPcD^ zE@;EPT@dkM+vzee?7%;7gOHzR0H19nK6@G=vH{(Mry8Nxk9H;9ivMXO>3-e~d+PbO z;A(e`EbVx9Ga3B@J<#LPUfn^@3+#l^9$$o^W%cw*1RPwMgMqQHiArLFDm4>-ta4qf z8$~o#!;5QD#J#~t#G>}Xl6W}>(IE9zLYvq_ugy}fRd!UqC_z1yMiuRh=74Vg6;%o! zuDd!vLx%m_Z7|`ylZW{R#r^IDjdDMkI8jds4ak!@h}~BT3ndCWtl}Fim0X33EpRi> zt8I}Tm?fQwga3+S%c;VV=)6q6)OCsEytelHv78?HHMFNjVXtsI-Pq0`)>*At5N)+3 z1jNX9Ai9GBHOuMLQ!PZ`SI1#65NoZQ6n5 zBt%0si$Mf6@EHyE;V)w_hDT=L$b|QW7$WnUEae3|;!KHwVp8;^RnrZV@-20VyO0Qe zKhK{UiipJ9C{m9VzNiL=-+c&%f?gGedc7u1FoEYgAhMmJA>rvibH5*i9a9iywK<#MT9d^2 ztbo!ud~HpNk?*2}&bHR|-VakGNDhx;p$A^so)+^FNu{mKYdnQ}cf%2UW;Yze10&Gp zZ107%gwZyNrrQotK#bo7U3jhy4m(N+9^B$w>W3?m^KlFgZo||!;j)utFbvHUv&joG zPmi4^6EGyN{Njexft@`NM!rggu|M6EBKX3p)Q`)u^!)z-{mP(t delta 42414 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 diff --git a/package.json b/package.json index fbd80fd..4c43ba9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@thilawyn/zod-schema-class", - "version": "0.1.2", + "version": "0.1.3", "type": "module", "publishConfig": { "registry": "https://git.jvalver.de/api/packages/thilawyn/npm/" @@ -8,11 +8,12 @@ "files": [ "./dist" ], + "types": "./dist/lib.d.ts", "exports": { ".": { "import": { - "types": "./dist/lib.d.mts", - "default": "./dist/lib.mjs" + "types": "./dist/lib.d.ts", + "default": "./dist/lib.js" }, "require": { "types": "./dist/lib.d.cts", @@ -21,42 +22,45 @@ }, "./schema": { "import": { - "types": "./dist/schema.d.mts", - "default": "./dist/schema.mjs" + "types": "./dist/schema/lib.d.ts", + "default": "./dist/schema/lib.js" }, "require": { - "types": "./dist/schema.d.cts", - "default": "./dist/schema.cjs" + "types": "./dist/schema/lib.d.cts", + "default": "./dist/schema/lib.cjs" } } }, "scripts": { - "build": "rollup -c rollup.config.ts", + "build": "tsup", "lint:tsc": "tsc --noEmit", "clean:cache": "rm -f tsconfig.tsbuildinfo", "clean:dist": "rm -rf dist", "clean:node": "rm -rf node_modules" }, "dependencies": { - "@thilawyn/traitify-ts": "^0.1.15", - "decimal.js": "^10.4.3", - "effect": "^2.4.3", + "@thilawyn/traitify-ts": "^0.1.19", "lodash-es": "^4.17.21", - "mobx": "^6.12.0", - "type-fest": "^4.12.0", + "type-fest": "^4.14.0", "zod": "^3.22.4" }, + "peerDependencies": { + "mobx": "^6.12.1", + "decimal.js": "^10.4.3", + "effect": "^2.4.11" + }, + "peerDependenciesMeta": { + "mobx": { "optional": true }, + "decimal.js": { "optional": true }, + "effect": { "optional": true } + }, "devDependencies": { - "@rollup/plugin-node-resolve": "^15.2.3", "@types/lodash-es": "^4.17.12", "bun-types": "latest", - "npm-check-updates": "^16.14.15", + "npm-check-updates": "^16.14.17", "npm-sort": "^0.0.4", - "rollup": "^4.12.1", - "rollup-plugin-cleanup": "^3.2.1", - "rollup-plugin-ts": "^3.4.5", - "ts-functional-pipe": "^3.1.2", + "tsup": "^8.0.2", "tsx": "^4.7.1", - "typescript": "^5.4.2" + "typescript": "^5.4.3" } } diff --git a/rollup.config.ts b/rollup.config.ts deleted file mode 100644 index 566206a..0000000 --- a/rollup.config.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { nodeResolve } from "@rollup/plugin-node-resolve" -import { defineConfig } from "rollup" -import cleanup from "rollup-plugin-cleanup" -import ts from "rollup-plugin-ts" -import pkg from "./package.json" assert { type: "json" } - - -export const createBundleConfig = ( - input: string, - name: keyof typeof pkg.exports, -) => - defineConfig({ - input, - - output: [ - { - file: pkg.exports[name].import.default, - format: "esm", - }, - { - file: pkg.exports[name].require.default, - format: "cjs", - }, - ], - - external: id => !/^[./]/.test(id), - - plugins: [ - nodeResolve(), - ts(), - - cleanup({ - comments: "jsdoc", - extensions: ["ts"], - }), - ], - }) - - -export default [ - createBundleConfig("src/lib.ts", "."), - createBundleConfig("src/schema/lib.ts", "./schema"), -] diff --git a/src/ExtendZodSchemaClass.ts b/src/ExtendZodSchemaClass.ts new file mode 100644 index 0000000..e65ee3d --- /dev/null +++ b/src/ExtendZodSchemaClass.ts @@ -0,0 +1,56 @@ +import { TraitInstance, TraitStaticMembers, expression } from "@thilawyn/traitify-ts" +import { AbstractClass } from "type-fest" +import { z } from "zod" +import { ZodSchemaObject, ZodSchemaObjectTrait } from "./traits/ZodSchemaObject" +import { Extend, StaticMembers } from "./util" + + +export function ExtendZodSchemaClass< + Self extends ( + AbstractClass< + Values & TraitInstance>, + [values: Values] + > & + TraitStaticMembers> + ), + + T extends z.ZodRawShape, + Catchall extends z.ZodTypeAny, + Values extends object, + PartialValues extends Partial, + + ExtendedT extends z.ZodRawShape, + ExtendedCatchall extends z.ZodTypeAny, + ExtendedValues extends Values, + ExtendedPartialValues extends Partial, +>( + class_: Self | ( + AbstractClass< + Values & TraitInstance>, + [values: Values] + > & + TraitStaticMembers> + ), + + schemaWithDefaults: ( + schemaWithDefaults: z.ZodObject + ) => z.ZodObject, +) { + return expression + .extends( + class_ as ( + AbstractClass< + Omit< + Extend<[InstanceType, ExtendedValues]>, + keyof TraitInstance> + >, + [values: ExtendedValues] + > & + Omit< + StaticMembers, + keyof TraitStaticMembers> + > + ) + ) + .expresses(ZodSchemaObject(schemaWithDefaults((class_ as Self).schemaWithDefaults))) +} diff --git a/src/JsonifiedZodSchemaClass.ts b/src/JsonifiedZodSchemaClass.ts new file mode 100644 index 0000000..289a66b --- /dev/null +++ b/src/JsonifiedZodSchemaClass.ts @@ -0,0 +1,42 @@ +import { expression } from "@thilawyn/traitify-ts" +import { Class, Jsonifiable } from "type-fest" +import { z } from "zod" +import { JsonifiedZodSchemaObject, OfClass, OfClassInstance } from "./traits/JsonifiedZodSchemaObject" + + +export function JsonifiedZodSchemaClass< + Of extends OfClass, + OfInstance extends OfClassInstance, + T extends z.ZodRawShape, + Catchall extends z.ZodTypeAny, + Values extends object, + PartialValues extends Partial, + + JsonifyT extends z.ZodRawShape, + JsonifyCatchall extends z.ZodTypeAny, + DejsonifyT extends z.ZodRawShape, + DejsonifyCatchall extends z.ZodTypeAny, + JsonifiedValues extends object & Jsonifiable, +>( + of: Of | OfClass, + + props: { + jsonifySchema: ( + schema: typeof of.schema + ) => z.ZodObject, + + dejsonifySchema: ( + schema: typeof of.schema + ) => z.ZodObject, + }, +) { + return expression + .extends( + class JsonifiedZodSchemaObjectConstructor { + constructor(values: JsonifiedValues) { + Object.assign(this, values) + } + } as Class + ) + .expresses(JsonifiedZodSchemaObject(of as Of, props)) +} diff --git a/src/ZodSchemaClass.ts b/src/ZodSchemaClass.ts new file mode 100644 index 0000000..1b4b9a1 --- /dev/null +++ b/src/ZodSchemaClass.ts @@ -0,0 +1,24 @@ +import { expression } from "@thilawyn/traitify-ts" +import { Class } from "type-fest" +import { z } from "zod" +import { ZodSchemaObject } from "./traits/ZodSchemaObject" + + +export function ZodSchemaClass< + T extends z.ZodRawShape, + Catchall extends z.ZodTypeAny, + Values extends object, + PartialValues extends Partial, +>( + schemaWithDefaults: z.ZodObject +) { + return expression + .extends( + class ZodSchemaObjectConstructor { + constructor(values: Values) { + Object.assign(this, values) + } + } as Class + ) + .expresses(ZodSchemaObject(schemaWithDefaults)) +} diff --git a/src/builders/ZodSchemaClassBuilder.ts b/src/builders/ZodSchemaClassBuilder.ts deleted file mode 100644 index a16ed6f..0000000 --- a/src/builders/ZodSchemaClassBuilder.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { Trait, TraitExpressionBuilder, expression } from "@thilawyn/traitify-ts" -import { AbstractClass } from "type-fest" -import { EmptyObject } from "type-fest/source/empty-object" -import { JsonifiableObject } from "type-fest/source/jsonifiable" -import { z } from "zod" -import { JsonifiableZodSchemaObject } from "../traits/JsonifiableZodSchemaObject" -import { ZodSchemaObject } from "../traits/ZodSchemaObject" - - -export class ZodSchemaClassBuilder< - Superclass extends AbstractClass, - const Traits extends readonly Trait[], - Schemas extends object, -> { - declare ["constructor"]: typeof ZodSchemaClassBuilder - - constructor( - protected readonly expression: TraitExpressionBuilder, - protected readonly schemas: Schemas, - ) {} - - - schema< - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - - Values extends object, - PartialValues extends Partial, - >( - this: ZodSchemaClassBuilder, - - props: { - schema: z.ZodObject - - schemaWithDefaultValues: ( - schema: z.ZodObject - ) => z.ZodObject - }, - ) { - const schema = props.schema - const schemaWithDefaultValues = props.schemaWithDefaultValues(props.schema) - - abstract class ZodSchemaObjectConstructor { - constructor(values: Values) { - Object.assign(this, values) - } - } - - return new this.constructor( - this.expression - .extends(ZodSchemaObjectConstructor as AbstractClass) - .expresses(ZodSchemaObject(schema, schemaWithDefaultValues)), - - { schema, schemaWithDefaultValues } as const, - ) - } - - jsonifiable< - S extends { - readonly schema: z.ZodObject, - readonly schemaWithDefaultValues: z.ZodObject, - jsonifySchema?: never - dejsonifySchema?: never - }, - - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - - Values extends object, - PartialValues extends Partial, - - JsonifySchemaT extends z.ZodRawShape, - JsonifySchemaUnknownKeys extends z.UnknownKeysParam, - JsonifySchemaCatchall extends z.ZodTypeAny, - - DejsonifySchemaT extends z.ZodRawShape, - DejsonifySchemaUnknownKeys extends z.UnknownKeysParam, - DejsonifySchemaCatchall extends z.ZodTypeAny, - - JsonifiedValues extends JsonifiableObject, - >( - this: ZodSchemaClassBuilder, - readonly schemaWithDefaultValues: z.ZodObject, - jsonifySchema?: never - dejsonifySchema?: never - }>, - - props: { - jsonifySchema: ( - schema: z.ZodObject - ) => z.ZodObject - - dejsonifySchema: ( - schema: z.ZodObject - ) => z.ZodObject - }, - ) { - const jsonifySchema = props.jsonifySchema(this.schemas.schema) - const dejsonifySchema = props.dejsonifySchema(this.schemas.schema) - - return new this.constructor( - this.expression.expresses( - JsonifiableZodSchemaObject( - this.schemas.schema, - this.schemas.schemaWithDefaultValues, - jsonifySchema, - dejsonifySchema, - ) - ), - - { ...this.schemas as S, jsonifySchema, dejsonifySchema } as const, - ) - } - - - toExpression() { - return this.expression - } -} - - -export const zodSchemaClass = new ZodSchemaClassBuilder(expression, {}) diff --git a/src/builders/ZodSchemaClassExtender.ts b/src/builders/ZodSchemaClassExtender.ts deleted file mode 100644 index d78a3c4..0000000 --- a/src/builders/ZodSchemaClassExtender.ts +++ /dev/null @@ -1,196 +0,0 @@ -// import { expression } from "@thilawyn/traitify-ts" -// import { AbstractClass, Simplify } from "type-fest" -// import { JsonifiableObject } from "type-fest/source/jsonifiable" -// import { z } from "zod" -// import { JsonifiableZodSchemaAbstractClass } from "../shapes/JsonifiableZodSchemaClass" -// import { ZodSchemaAbstractClass } from "../shapes/ZodSchemaClass" -// import { Extend, Override, StaticMembers } from "../util" - - -// export class ZodSchemaClassExtender< -// Superclass extends AbstractClass, -// Subclass extends AbstractClass, -// > { -// declare ["constructor"]: typeof ZodSchemaClassExtender - -// constructor( -// readonly superclass: Superclass, -// readonly subclass: Subclass, -// ) {} - - -// schema< -// Super extends ZodSchemaAbstractClass, - -// SuperSchemaT extends z.ZodRawShape, -// SuperSchemaUnknownKeys extends z.UnknownKeysParam, -// SuperSchemaCatchall extends z.ZodTypeAny, - -// SuperValues extends object, -// SuperDefaultValues extends Partial, - -// SchemaT extends z.ZodRawShape, -// SchemaUnknownKeys extends z.UnknownKeysParam, -// SchemaCatchall extends z.ZodTypeAny, - -// Values extends SuperValues, -// DefaultValues extends Partial, -// >( -// this: ZodSchemaClassExtender< -// Super | ZodSchemaAbstractClass, -// any -// >, - -// props: { -// schema: (schema: Super["schema"]) => z.ZodObject -// defaultValues: (defaultValues: SuperDefaultValues) => DefaultValues -// }, -// ) { -// const schema = props.schema(this.superclass.schema) -// const defaultValues = props.defaultValues(this.superclass.defaultValues) - -// class Schemas extends (this.superclass as AbstractClass) { -// static readonly schema = schema -// static readonly defaultValues = defaultValues -// } - -// return new this.constructor( -// this.superclass as Super, - -// Schemas as unknown as AbstractClass< -// Simplify< -// Extend<[InstanceType, Values]> -// >, - -// [values: Values] -// > & -// Simplify< -// Override<[ -// StaticMembers, -// StaticMembers, -// ]> -// > -// ) -// } - -// jsonifiable< -// /** Superclass jsonifiable schemas */ -// Super extends JsonifiableZodSchemaAbstractClass< -// any, - -// SuperJsonifySchemaT, -// SuperJsonifySchemaUnknownKeys, -// SuperJsonifySchemaCatchall, - -// SuperDejsonifySchemaT, -// SuperDejsonifySchemaUnknownKeys, -// SuperDejsonifySchemaCatchall, - -// SuperJsonifiedValues, -// SuperValues -// >, - -// SuperJsonifySchemaT extends z.ZodRawShape, -// SuperJsonifySchemaUnknownKeys extends z.UnknownKeysParam, -// SuperJsonifySchemaCatchall extends z.ZodTypeAny, - -// SuperDejsonifySchemaT extends z.ZodRawShape, -// SuperDejsonifySchemaUnknownKeys extends z.UnknownKeysParam, -// SuperDejsonifySchemaCatchall extends z.ZodTypeAny, - -// SuperJsonifiedValues extends JsonifiableObject, -// SuperValues extends object, - -// /** New schemas */ -// Self extends ZodSchemaAbstractClass, - -// SelfSchemaT extends z.ZodRawShape, -// SelfSchemaUnknownKeys extends z.UnknownKeysParam, -// SelfSchemaCatchall extends z.ZodTypeAny, - -// SelfValues extends object, -// SelfDefaultValues extends Partial, - -// /* New jsonifiable schemas */ -// JsonifySchemaT extends z.ZodRawShape, -// JsonifySchemaUnknownKeys extends z.UnknownKeysParam, -// JsonifySchemaCatchall extends z.ZodTypeAny, - -// DejsonifySchemaT extends z.ZodRawShape, -// DejsonifySchemaUnknownKeys extends z.UnknownKeysParam, -// DejsonifySchemaCatchall extends z.ZodTypeAny, - -// JsonifiedValues extends SuperJsonifiedValues, -// Values extends SelfValues, -// >( -// this: ZodSchemaClassExtender< -// Super | JsonifiableZodSchemaAbstractClass< -// any, - -// SuperJsonifySchemaT, -// SuperJsonifySchemaUnknownKeys, -// SuperJsonifySchemaCatchall, - -// SuperDejsonifySchemaT, -// SuperDejsonifySchemaUnknownKeys, -// SuperDejsonifySchemaCatchall, - -// SuperJsonifiedValues, -// SuperValues -// >, - -// Self | ZodSchemaAbstractClass -// >, - -// props: { -// jsonifySchema: ( -// schema: Self["schema"], -// jsonifySchema: Super["jsonifySchema"], -// ) => z.ZodObject - -// dejsonifySchema: ( -// schema: Self["schema"], -// dejsonifySchema: Super["dejsonifySchema"], -// ) => z.ZodObject -// }, -// ) { -// const jsonifySchema = props.jsonifySchema(this.subclass.schema, this.superclass.jsonifySchema) -// const dejsonifySchema = props.dejsonifySchema(this.subclass.schema, this.superclass.dejsonifySchema) - -// class JsonifiableSchemas extends (this.subclass as AbstractClass) { -// static readonly jsonifySchema = jsonifySchema -// readonly jsonifySchema = jsonifySchema -// static readonly dejsonifySchema = dejsonifySchema -// readonly dejsonifySchema = dejsonifySchema -// } - -// return new this.constructor( -// this.superclass as Super, - -// JsonifiableSchemas as unknown as AbstractClass< -// Simplify< -// Override<[InstanceType, JsonifiableSchemas]> -// >, - -// ConstructorParameters< -// ZodSchemaAbstractClass -// > -// > & -// Simplify< -// Override<[ -// StaticMembers, -// StaticMembers, -// ]> -// >, -// ) -// } - - -// toClass() { -// return this.subclass -// } - -// toExpressionBuilder() { -// return expression.extends(this.subclass) -// } -// } diff --git a/src/lib.ts b/src/lib.ts index ef4a60b..b7d4fe2 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -1,4 +1,6 @@ -export { ZodSchemaClassBuilder, zodSchemaClass } from "./builders/ZodSchemaClassBuilder" -export { JsonifiableZodSchemaObject } from "./traits/JsonifiableZodSchemaObject" +export { ExtendZodSchemaClass } from "./ExtendZodSchemaClass" +export { JsonifiedZodSchemaClass } from "./JsonifiedZodSchemaClass" +export { ZodSchemaClass } from "./ZodSchemaClass" +export { JsonifiedZodSchemaObject } from "./traits/JsonifiedZodSchemaObject" export { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" export { ZodSchemaObject, ZodSchemaObjectTrait } from "./traits/ZodSchemaObject" diff --git a/src/schema/bigint.ts b/src/schema/bigint.ts new file mode 100644 index 0000000..079f598 --- /dev/null +++ b/src/schema/bigint.ts @@ -0,0 +1,19 @@ +import { z } from "zod" + + +type JsonifiedBigIntBrand = "@thilawyn/zod-schema-class/JsonifiedBigInt" + + +export function jsonify>(schema: S) { + return schema + .transform(v => v.toString()) + .brand() +} + +export function dejsonify>(schema: S) { + return z + .custom>() + .pipe(z.string()) + .pipe(z.coerce.bigint()) + .pipe(schema) +} diff --git a/src/schema/date.ts b/src/schema/date.ts new file mode 100644 index 0000000..287121e --- /dev/null +++ b/src/schema/date.ts @@ -0,0 +1,19 @@ +import { z } from "zod" + + +type JsonifiedDateBrand = "@thilawyn/zod-schema-class/JsonifiedDate" + + +export function jsonify>(schema: S) { + return schema + .transform(v => v.toString()) + .brand() +} + +export function dejsonify>(schema: S) { + return z + .custom>() + .pipe(z.string()) + .pipe(z.coerce.date()) + .pipe(schema) +} diff --git a/src/schema/decimal.ts b/src/schema/decimal.ts new file mode 100644 index 0000000..5f946b7 --- /dev/null +++ b/src/schema/decimal.ts @@ -0,0 +1,36 @@ +import Decimal from "decimal.js" +import { z } from "zod" + + +type JsonifiedDecimalBrand = "@thilawyn/zod-schema-class/JsonifiedDecimal" + + +export function decimal() { + return z.custom(v => Decimal.isDecimal(v)) +} + +export module decimal { + export function jsonifyDecimalSchema>(schema: S) { + return schema + .transform(v => v.toJSON()) + .brand() + } + + export function dejsonifyDecimalSchema>(schema: S) { + return z + .custom>() + .pipe( + z + .string() + .transform(v => { + try { + return new Decimal(v) + } + catch (e) { + return v + } + }) + ) + .pipe(schema) + } +} diff --git a/src/schema/effect/index.ts b/src/schema/effect/index.ts index 904b057..720a9ef 100644 --- a/src/schema/effect/index.ts +++ b/src/schema/effect/index.ts @@ -1,6 +1 @@ -import { option } from "./option" - - -export const effect = { - option, -} as const +export { option } from "./option" diff --git a/src/schema/effect/option.ts b/src/schema/effect/option.ts index 53b6abf..8908d0c 100644 --- a/src/schema/effect/option.ts +++ b/src/schema/effect/option.ts @@ -3,19 +3,144 @@ import { identity } from "lodash-es" import { z } from "zod" -export const option = { - option: (schema: S) => - z.union([option.some(schema), option.none(schema)]), +type JsonifiedEffectOptionSomeBrand = "@thilawyn/zod-schema-class/JsonifiedEffectOptionSome" - some: (schema: S) => z - .custom>>(v => Option.isOption(v) && Option.isSome(v), "Not an Option") - .pipe(z.object({ value: schema }).passthrough()) - .transform>>(identity), - none: (_schema?: S) => - z.custom - : unknown - >>(v => Option.isOption(v) && Option.isNone(v), "Not an Option"), -} as const +export function option(schema: InnerS) { + return z.union([option.some(schema), option.none(schema)]) +} + +export module option { + export type Option = ReturnType> + + function getSomeSchema(schema: Option): some.Some { + return schema.options[0] + } + function getNoneSchema(schema: Option): none.None { + return schema.options[1] + } + + + export function jsonify< + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, + >( + schema: Option, + jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, + ) { + return z.union([ + some.jsonify(getSomeSchema(schema), jsonifySchema), + none.jsonify(getNoneSchema(schema), jsonifySchema), + ]) + } + + export function dejsonify< + InnerS extends z.ZodTypeAny, + DejsonifiedInnerS extends z.ZodTypeAny = InnerS, + >( + schema: Option, + dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity, + ) { + return z.union([ + some.dejsonify(getSomeSchema(schema), dejsonifySchema), + none.dejsonify(getNoneSchema(schema), dejsonifySchema), + ]) + } + + + export function some< + InnerS extends z.ZodTypeAny + >( + schema: InnerS + ) { + return z + .custom>>( + v => Option.isOption(v) && Option.isSome(v), + "Not an Option.Some", + ) + .pipe(z.object({ value: schema }).passthrough()) + .transform(v => Option.some>(v.value)) + } + + export module some { + export type Some = ReturnType> + + function getInnerSchema(schema: Some): InnerS { + return schema._def.schema._def.out.shape.value + } + + + export function jsonify< + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, + >( + schema: Some, + jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, + ) { + return schema + .transform(v => Option.getOrThrow(v)) + .pipe(jsonifySchema(getInnerSchema(schema))) + .brand() + } + + export function dejsonify< + InnerS extends z.ZodTypeAny, + DejsonifiedInnerS extends z.ZodTypeAny = InnerS, + >( + schema: Some, + dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity, + ) { + return z + .custom & z.BRAND>() + .pipe(dejsonifySchema(getInnerSchema(schema))) + .transform(v => Option.some>(v)) + .pipe(schema) + } + } + + + export function none< + InnerS extends z.ZodTypeAny | unknown = unknown + >( + _schema?: InnerS + ) { + return z.custom< + Option.None< + InnerS extends z.ZodTypeAny + ? z.output + : unknown + > + >( + v => Option.isOption(v) && Option.isNone(v), + "Not an Option.None", + ) + } + + export module none { + export type None = ReturnType> + + + export function jsonify< + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, + >( + schema: None, + _jsonifySchema?: (schema: InnerS) => JsonifiedInnerS, + ) { + return schema.transform(() => null) + } + + export function dejsonify< + InnerS extends z.ZodTypeAny, + DejsonifiedInnerS extends z.ZodTypeAny = InnerS, + >( + schema: None, + _dejsonifySchema?: (schema: InnerS) => DejsonifiedInnerS, + ) { + return z + .null() + .transform(() => Option.none>()) + .pipe(schema) + } + } +} diff --git a/src/schema/jsonifiable/bigint.ts b/src/schema/jsonifiable/bigint.ts deleted file mode 100644 index b6d02d0..0000000 --- a/src/schema/jsonifiable/bigint.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { identity } from "lodash-es" -import { Opaque } from "type-fest" -import { z } from "zod" - - -export type JsonifiedBigInt = Opaque - - -export function jsonifyBigIntSchema(schema: S) { - return schema.transform(v => v.toString() as JsonifiedBigInt) -} - -export function dejsonifyBigIntSchema(schema: S) { - return z - .custom(identity) - .pipe(z - .string() - .transform(v => { - try { - return BigInt(v) - } - catch (e) { - return v - } - }) - .pipe(schema) - ) -} diff --git a/src/schema/jsonifiable/date.ts b/src/schema/jsonifiable/date.ts deleted file mode 100644 index e147a5d..0000000 --- a/src/schema/jsonifiable/date.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { identity } from "lodash-es" -import { Opaque } from "type-fest" -import { z } from "zod" - - -export type JsonifiedDate = Opaque - - -export function jsonifyDateSchema(schema: S) { - return schema.transform(v => v.toString() as JsonifiedDate) -} - -export function dejsonifyDateSchema(schema: S) { - return z - .custom(identity) - .pipe(z - .string() - .transform(v => { - try { - return new Date(v) - } - catch (e) { - return v - } - }) - .pipe(schema) - ) -} diff --git a/src/schema/jsonifiable/decimal.ts b/src/schema/jsonifiable/decimal.ts deleted file mode 100644 index ca87662..0000000 --- a/src/schema/jsonifiable/decimal.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Decimal } from "decimal.js" -import { identity } from "lodash-es" -import { Opaque } from "type-fest" -import { z } from "zod" - - -export type JsonifiedDecimal = Opaque - - -export function jsonifyDecimalSchema< - S extends z.ZodType ->(schema: S) { - return schema.transform(v => v.toJSON() as JsonifiedDecimal) -} - -export function dejsonifyDecimalSchema< - S extends z.ZodType ->(schema: S) { - return z - .custom(identity) - .pipe(z - .string() - .transform(v => { - try { - return new Decimal(v) - } - catch (e) { - return v - } - }) - .pipe(schema) - ) -} diff --git a/src/schema/jsonifiable/index.ts b/src/schema/jsonifiable/index.ts deleted file mode 100644 index 6bff7ae..0000000 --- a/src/schema/jsonifiable/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { dejsonifyBigIntSchema, jsonifyBigIntSchema } from "./bigint" -import { dejsonifyDateSchema, jsonifyDateSchema } from "./date" -import { dejsonifyDecimalSchema, jsonifyDecimalSchema } from "./decimal" - - -export const jsonify = { - bigint: jsonifyBigIntSchema, - date: jsonifyDateSchema, - decimal: jsonifyDecimalSchema, -} as const - -export const dejsonify = { - bigint: dejsonifyBigIntSchema, - date: dejsonifyDateSchema, - decimal: dejsonifyDecimalSchema, -} as const diff --git a/src/schema/lib.ts b/src/schema/lib.ts index 9339106..1208dd9 100644 --- a/src/schema/lib.ts +++ b/src/schema/lib.ts @@ -1,2 +1,12 @@ -export * from "./effect" -export * from "./jsonifiable" +import * as bigint from "./bigint" +import * as date from "./date" +import { decimal } from "./decimal" +import * as effect from "./effect" + + +export const s = { + bigint, + date, + decimal, + effect, +} as const diff --git a/src/shapes/JsonifiableZodSchemaClass.ts b/src/shapes/JsonifiableZodSchemaClass.ts deleted file mode 100644 index 2f35971..0000000 --- a/src/shapes/JsonifiableZodSchemaClass.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { AbstractClass, Class } from "type-fest" -import { JsonifiableObject } from "type-fest/source/jsonifiable" -import { z } from "zod" - - -export type JsonifiableZodSchemaClass< - Instance extends Values, - - JsonifySchemaT extends z.ZodRawShape, - JsonifySchemaUnknownKeys extends z.UnknownKeysParam, - JsonifySchemaCatchall extends z.ZodTypeAny, - - DejsonifySchemaT extends z.ZodRawShape, - DejsonifySchemaUnknownKeys extends z.UnknownKeysParam, - DejsonifySchemaCatchall extends z.ZodTypeAny, - - JsonifiedValues extends JsonifiableObject, - Values extends object, -> = ( - Class & - JsonifiableZodSchemas< - JsonifySchemaT, - JsonifySchemaUnknownKeys, - JsonifySchemaCatchall, - - DejsonifySchemaT, - DejsonifySchemaUnknownKeys, - DejsonifySchemaCatchall, - - JsonifiedValues, - Values - > -) - -export type JsonifiableZodSchemaAbstractClass< - Instance extends Values, - - JsonifySchemaT extends z.ZodRawShape, - JsonifySchemaUnknownKeys extends z.UnknownKeysParam, - JsonifySchemaCatchall extends z.ZodTypeAny, - - DejsonifySchemaT extends z.ZodRawShape, - DejsonifySchemaUnknownKeys extends z.UnknownKeysParam, - DejsonifySchemaCatchall extends z.ZodTypeAny, - - JsonifiedValues extends JsonifiableObject, - Values extends object, -> = ( - AbstractClass & - JsonifiableZodSchemas< - JsonifySchemaT, - JsonifySchemaUnknownKeys, - JsonifySchemaCatchall, - - DejsonifySchemaT, - DejsonifySchemaUnknownKeys, - DejsonifySchemaCatchall, - - JsonifiedValues, - Values - > -) - -export type JsonifiableZodSchemas< - JsonifySchemaT extends z.ZodRawShape, - JsonifySchemaUnknownKeys extends z.UnknownKeysParam, - JsonifySchemaCatchall extends z.ZodTypeAny, - - DejsonifySchemaT extends z.ZodRawShape, - DejsonifySchemaUnknownKeys extends z.UnknownKeysParam, - DejsonifySchemaCatchall extends z.ZodTypeAny, - - JsonifiedValues extends JsonifiableObject, - Values extends object, -> = { - readonly jsonifySchema: z.ZodObject - readonly dejsonifySchema: z.ZodObject -} diff --git a/src/shapes/ZodSchemaClass.ts b/src/shapes/ZodSchemaClass.ts deleted file mode 100644 index 680c59a..0000000 --- a/src/shapes/ZodSchemaClass.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { AbstractClass, Class } from "type-fest" -import { z } from "zod" - - -export type ZodSchemaClass< - Instance extends Values, - - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - - Values extends object, - PartialValues extends Partial, -> = ( - Class & - ZodSchemas -) - -export type ZodSchemaAbstractClass< - Instance extends Values, - - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - - Values extends object, - PartialValues extends Partial, -> = ( - AbstractClass & - ZodSchemas -) - -export type ZodSchemas< - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - - Values extends object, - PartialValues extends Partial, -> = { - readonly schema: z.ZodObject - readonly schemaWithDefaultValues: z.ZodObject -} diff --git a/src/tests.ts b/src/tests.ts index dff7e44..d73750e 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,64 +1,60 @@ import { Implements } from "@thilawyn/traitify-ts" +import { Option } from "effect" import { z } from "zod" -import { zodSchemaClass } from "./builders/ZodSchemaClassBuilder" -import { dejsonify, jsonify } from "./schema/jsonifiable" +import { ExtendZodSchemaClass } from "./ExtendZodSchemaClass" +import { JsonifiedZodSchemaClass } from "./JsonifiedZodSchemaClass" +import { ZodSchemaClass } from "./ZodSchemaClass" +import { s } from "./schema/lib" import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject" -const exp = zodSchemaClass - .schema({ - schema: z.object({ - /** User ID */ - id: z.bigint(), +const userExp = ZodSchemaClass( + z.object({ + /** User ID */ + id: s.effect.option(z.bigint()).default(Option.none()), - /** Username */ - name: z.string(), - }), + /** Username */ + name: z.string(), - schemaWithDefaultValues: s => s.extend({ - id: s.shape.id.default(-1n), - }), + /** Role */ + role: z.enum(["User", "Moderator", "Admin"]).default("User"), }) - .jsonifiable({ - jsonifySchema: s => s.extend({ - id: jsonify.bigint(s.shape.id) - }), - - dejsonifySchema: s => s.extend({ - id: dejsonify.bigint(s.shape.id) - }), - }) - .toExpression() +) .expresses(MobXObservableZodSchemaObject) .build() +@userExp.staticImplements +class User extends userExp.extends implements Implements {} -@exp.staticImplements -class User extends exp.extends implements Implements {} - -const inst = User.create({ id: 1n, name: "User" }) -// console.log(inst.name) -const instEffect = User.createEffect({ id: 1n, name: "User" }) - -const jsonifiedUser = await inst.jsonifyPromise() -const dejsonifiedInst = await User.dejsonifyPromise(jsonifiedUser) +const userInst = User.create({ id: Option.some(1n), name: "User" }) +const userInstEffect = User.createEffect({ id: Option.some(1n), name: "User" }) -// const AdminUserProto = User.extend() -// .schema({ -// schema: s => s.extend({ -// name: z.literal("Admin"), -// prout: z.string(), -// }), -// defaultValues: v => ({ ...v, name: "Admin" as const }), -// }) -// .jsonifiable({ -// jsonifySchema: (s, json) => json.extend({ -// prout: s.shape.prout -// }) -// }) +const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { + jsonifySchema: schema => schema.extend({ + id: s.effect.option.jsonify(schema.shape.id, s.bigint.jsonify) + }), + + dejsonifySchema: schema => schema.extend({ + id: s.effect.option.dejsonify(schema.shape.id, s.bigint.dejsonify) + }), +}).build() + +@jsonifiedUserExp.staticImplements +class JsonifiedUser extends jsonifiedUserExp.extends implements Implements {} + +const jsonifiedUserInst = JsonifiedUser.jsonify(userInst) +// console.log(JSON.stringify(jsonifiedUserInst)) +console.log(jsonifiedUserInst.dejsonify().id) -// class AdminUser extends AdminUserProto.toClass() {} -// const subInst = await AdminUser.createPromise({ id: 2n, prout: "" }) -// console.log(subInst) +const adminUserExp = ExtendZodSchemaClass(User, + schema => schema.extend({ + role: z.literal("Admin").default("Admin") + }) +).build() + +@adminUserExp.staticImplements +class AdminUser extends adminUserExp.extends implements Implements {} + +const admin = AdminUser.create({ id: Option.some(2n), name: "Admin" }) diff --git a/src/tests2.ts b/src/tests2.ts new file mode 100644 index 0000000..b61c281 --- /dev/null +++ b/src/tests2.ts @@ -0,0 +1,20 @@ +import { Option } from "effect" +import { z } from "zod" +import { s } from "./schema/lib" + + +const schema = z.object({ + id: s.effect.option(z.bigint()) +}) + +const jsonifySchema = schema.extend({ + id: s.effect.option.jsonify(schema.shape.id, s.bigint.jsonify) +}) + +const dejsonifySchema = schema.extend({ + id: s.effect.option.dejsonify(schema.shape.id, s.bigint.dejsonify) +}) + + +const jsonified = jsonifySchema.parse({ id: Option.some(1n) }) +console.log(dejsonifySchema.parse(jsonified)) diff --git a/src/traits/ExtendableZodSchemaObject.ts b/src/traits/ExtendableZodSchemaObject.ts index 0fc0891..d8d271b 100644 --- a/src/traits/ExtendableZodSchemaObject.ts +++ b/src/traits/ExtendableZodSchemaObject.ts @@ -1,16 +1,51 @@ -// import { trait } from "@thilawyn/traitify-ts" -// import { ZodSchemaClassExtender } from "../builders/ZodSchemaClassExtender" -// import { ZodSchemaClass } from "../shapes/ZodSchemaClass" +import { ImplStatic, expression, implStaticThis } from "@thilawyn/traitify-ts" +import { AbstractClass } from "type-fest" +import { z } from "zod" +import { Extend, StaticMembers } from "../util" +import { ZodSchemaObject } from "./ZodSchemaObject" -// export const ExtendableZodSchemaObject = trait -// .implement(Super => class ExtendableZodSchemaObject extends Super { -// static extend< -// Self extends ZodSchemaClass, -// >( -// this: Self -// ) { -// return new ZodSchemaClassExtender(this, this) -// } -// }) -// .build() +export const ExtendableZodSchemaObject = < + T extends z.ZodRawShape, + Catchall extends z.ZodTypeAny, + Values extends object, + PartialValues extends Partial, +>( + schemaWithDefaults: z.ZodObject, +) => expression + .expresses(ZodSchemaObject(schemaWithDefaults)) + .build() + .subtrait() + .implement(Super => class ExtendableZodSchemaObjectImpl extends Super { + static extend< + Self extends AbstractClass, + + ExtendedT extends z.ZodRawShape, + ExtendedCatchall extends z.ZodTypeAny, + ExtendedValues extends Values, + ExtendedPartialValues extends Partial, + >( + this: Self, + + schemaWithDefaults: ( + schemaWithDefaults: z.ZodObject + ) => z.ZodObject, + ) { + const t = implStaticThis(ExtendableZodSchemaObjectImpl, this) + return expression + .extends( + t as unknown as ( + AbstractClass< + Omit< + Extend<[InstanceType, ExtendedValues]>, + keyof ExtendableZodSchemaObjectImpl + >, + [values: ExtendedValues] + > & + Omit, keyof ImplStatic> + ) + ) + .expresses(ExtendableZodSchemaObject(schemaWithDefaults(t.schemaWithDefaults))) + } + }) + .build() diff --git a/src/traits/JsonifiableZodSchemaObject.ts b/src/traits/JsonifiableZodSchemaObject.ts deleted file mode 100644 index c747a8b..0000000 --- a/src/traits/JsonifiableZodSchemaObject.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { ImplStatic, expression } from "@thilawyn/traitify-ts" -import { Class } from "type-fest" -import { JsonifiableObject } from "type-fest/source/jsonifiable" -import { z } from "zod" -import { parseZodSchemaEffect } from "../util" -import { ZodSchemaObject } from "./ZodSchemaObject" - - -export const JsonifiableZodSchemaObject = < - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - - Values extends object, - PartialValues extends Partial, - - JsonifySchemaT extends z.ZodRawShape, - JsonifySchemaUnknownKeys extends z.UnknownKeysParam, - JsonifySchemaCatchall extends z.ZodTypeAny, - - DejsonifySchemaT extends z.ZodRawShape, - DejsonifySchemaUnknownKeys extends z.UnknownKeysParam, - DejsonifySchemaCatchall extends z.ZodTypeAny, - - JsonifiedValues extends JsonifiableObject, ->( - schema: z.ZodObject, - schemaWithDefaultValues: z.ZodObject, - jsonifySchema: z.ZodObject, - dejsonifySchema: z.ZodObject, -) => expression - .expresses(ZodSchemaObject(schema, schemaWithDefaultValues)) - .build() - .subtrait() - .implement(Super => class JsonifiableZodSchemaObject extends Super { - declare ["constructor"]: typeof JsonifiableZodSchemaObject - - static readonly jsonifySchema = jsonifySchema - static readonly dejsonifySchema = dejsonifySchema - - - jsonify(params?: Partial) { - return this.constructor.jsonifySchema.parse(this, params) - } - - jsonifyPromise(params?: Partial) { - return this.constructor.jsonifySchema.parseAsync(this, params) - } - - jsonifyEffect(params?: Partial) { - return parseZodSchemaEffect( - this.constructor.jsonifySchema, - this, - params, - ) - } - - - static dejsonify< - Instance extends Values - >( - this: ( - Class & - ImplStatic - ), - values: JsonifiedValues, - params?: Partial, - ) { - return this - .transform(this.dejsonifySchema) - .parse(values, params) - } - - static dejsonifyPromise< - Instance extends Values - >( - this: ( - Class & - ImplStatic - ), - values: JsonifiedValues, - params?: Partial, - ) { - return this - .transform(this.dejsonifySchema) - .parseAsync(values, params) - } - - static dejsonifyEffect< - Instance extends Values - >( - this: ( - Class & - ImplStatic - ), - values: JsonifiedValues, - params?: Partial, - ) { - return parseZodSchemaEffect( - this.transform(this.dejsonifySchema), - values, - params, - ) - } - }) - .build() diff --git a/src/traits/JsonifiedZodSchemaObject.ts b/src/traits/JsonifiedZodSchemaObject.ts new file mode 100644 index 0000000..34ee1c3 --- /dev/null +++ b/src/traits/JsonifiedZodSchemaObject.ts @@ -0,0 +1,174 @@ +import { TraitInstance, TraitStaticMembers, implStaticInstantiableThis, trait } from "@thilawyn/traitify-ts" +import { Class, Jsonifiable } from "type-fest" +import { z } from "zod" +import { parseZodSchemaEffect } from "../util" +import { ZodSchemaObjectTrait } from "./ZodSchemaObject" + + +export type OfClass< + Instance extends OfClassInstance, + + T extends z.ZodRawShape, + Catchall extends z.ZodTypeAny, + Values extends object, + PartialValues extends Partial, +> = ( + Class & + TraitStaticMembers> +) + +export type OfClassInstance< + T extends z.ZodRawShape, + Catchall extends z.ZodTypeAny, + Values extends object, + PartialValues extends Partial, +> = ( + Values & TraitInstance> +) + + +export const JsonifiedZodSchemaObject = < + Of extends OfClass, + OfInstance extends OfClassInstance, + T extends z.ZodRawShape, + Catchall extends z.ZodTypeAny, + Values extends object, + PartialValues extends Partial, + + JsonifyT extends z.ZodRawShape, + JsonifyCatchall extends z.ZodTypeAny, + DejsonifyT extends z.ZodRawShape, + DejsonifyCatchall extends z.ZodTypeAny, + JsonifiedValues extends object & Jsonifiable, +>( + of: Of | OfClass, + + props: { + jsonifySchema: ( + schema: typeof of.schema + ) => z.ZodObject, + + dejsonifySchema: ( + schema: typeof of.schema + ) => z.ZodObject, + }, +) => trait + .implement(Super => class JsonifiedZodSchemaObjectImpl extends Super { + declare ["constructor"]: typeof JsonifiedZodSchemaObjectImpl + + static readonly of = of as Of + static readonly jsonifySchema = props.jsonifySchema(of.schema) + static readonly dejsonifySchema = props.dejsonifySchema(of.schema) + + + static pipeSchemaIntoInstance< + Instance extends JsonifiedValues, + + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, + SchemaOutput extends JsonifiedValues, + SchemaInput, + >( + this: Class, + schema: z.ZodObject, + ) { + return schema.transform(values => new this(values)) + } + + + static jsonify< + Instance extends JsonifiedValues + >( + this: Class, + values: Values, + params?: Partial, + ) { + const t = implStaticInstantiableThis(JsonifiedZodSchemaObjectImpl, this) + + return t + .pipeSchemaIntoInstance(t.jsonifySchema) + .parse(values, params) + } + + static jsonifyPromise< + Instance extends JsonifiedValues + >( + this: Class, + values: Values, + params?: Partial, + ) { + const t = implStaticInstantiableThis(JsonifiedZodSchemaObjectImpl, this) + + return t + .pipeSchemaIntoInstance(t.jsonifySchema) + .parseAsync(values, params) + } + + static jsonifyEffect< + Instance extends JsonifiedValues + >( + this: Class, + values: Values, + params?: Partial, + ) { + const t = implStaticInstantiableThis(JsonifiedZodSchemaObjectImpl, this) + + return parseZodSchemaEffect( + t.pipeSchemaIntoInstance(t.jsonifySchema), + values, + params, + ) + } + + + static dejsonify( + values: JsonifiedValues, + params?: Partial, + ) { + return this.of + .pipeSchemaIntoInstance(this.dejsonifySchema) + .parse(values, params) + } + + static dejsonifyPromise( + values: JsonifiedValues, + params?: Partial, + ) { + return this.of + .pipeSchemaIntoInstance(this.dejsonifySchema) + .parseAsync(values, params) + } + + static dejsonifyEffect( + values: JsonifiedValues, + params?: Partial, + ) { + return parseZodSchemaEffect( + this.of.pipeSchemaIntoInstance(this.dejsonifySchema), + values, + params, + ) + } + + dejsonify(params?: Partial) { + return this.constructor.of.pipeSchemaIntoInstance( + this.constructor.dejsonifySchema + ).parse(this, params) + } + + dejsonifyPromise(params?: Partial) { + return this.constructor.of.pipeSchemaIntoInstance( + this.constructor.dejsonifySchema + ).parseAsync(this, params) + } + + dejsonifyEffect(params?: Partial) { + return parseZodSchemaEffect( + this.constructor.of.pipeSchemaIntoInstance(this.constructor.dejsonifySchema), + this, + params, + ) + } + }) + .build() diff --git a/src/traits/MobXObservableZodSchemaObject.ts b/src/traits/MobXObservableZodSchemaObject.ts index c9913da..9c3a409 100644 --- a/src/traits/MobXObservableZodSchemaObject.ts +++ b/src/traits/MobXObservableZodSchemaObject.ts @@ -8,13 +8,15 @@ export const MobXObservableZodSchemaObject = trait .staticAbstract(Super => class extends Super { declare readonly schema: z.ZodObject }) - .implement(Super => class ObservableZodSchemaObject extends Super { + .implement(Super => class MobXObservableZodSchemaObjectImpl extends Super { + declare ["constructor"]: typeof MobXObservableZodSchemaObjectImpl + constructor(...args: any[]) { super(...args) makeObservable(this, mapValues( - (this.constructor as typeof ObservableZodSchemaObject).schema.shape, + this.constructor.schema.shape, () => observable, ) ) diff --git a/src/traits/ZodSchemaObject.ts b/src/traits/ZodSchemaObject.ts index e866fdf..2efca03 100644 --- a/src/traits/ZodSchemaObject.ts +++ b/src/traits/ZodSchemaObject.ts @@ -1,7 +1,7 @@ -import { ImplStatic, trait } from "@thilawyn/traitify-ts" +import { implStaticInstantiableThis, trait } from "@thilawyn/traitify-ts" import { Class, HasRequiredKeys } from "type-fest" import { z } from "zod" -import { parseZodSchemaEffect } from "../util" +import { parseZodSchemaEffect, stripZodObjectDefaults } from "../util" type CreateArgs = ( @@ -12,111 +12,104 @@ type CreateArgs = ( export const ZodSchemaObject = < - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - - Values extends object, - PartialValues extends Partial, + T extends z.ZodRawShape, + Catchall extends z.ZodTypeAny, + Values extends object, + PartialValues extends Partial, >( - schema: z.ZodObject, - schemaWithDefaultValues: z.ZodObject, + schemaWithDefaults: z.ZodObject, ) => trait - .implement(Super => class ZodSchemaObject extends Super { - static readonly schema = schema - static readonly schemaWithDefaultValues = schemaWithDefaultValues + .implement(Super => { + class ZodSchemaObjectImpl extends Super { + static readonly schema = stripZodObjectDefaults(schemaWithDefaults) + static readonly schemaWithDefaults = schemaWithDefaults - static transform< - Instance extends Values, - T extends z.ZodRawShape, - UnknownKeys extends z.UnknownKeysParam, - Catchall extends z.ZodTypeAny, - Output extends Values, - Input, - >( - this: Class, - schema: z.ZodObject, - ) { - return schema.transform(values => new this(values)) + static pipeSchemaIntoInstance< + Instance extends Values, + + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, + SchemaOutput extends Values, + SchemaInput, + >( + this: Class, + schema: z.ZodObject, + ) { + return schema.transform(values => new this(values)) + } + + static pipeInstanceIntoSchema< + Self extends Class, + + SchemaT extends z.ZodRawShape, + SchemaUnknownKeys extends z.UnknownKeysParam, + SchemaCatchall extends z.ZodTypeAny, + SchemaOutput, + SchemaInput extends Values, + >( + this: Self, + schema: z.ZodObject, + ) { + return z.instanceof(this).pipe(schema) + } + + + static create< + Instance extends Values + >( + this: Class, + ...[values, params]: CreateArgs + ) { + const t = implStaticInstantiableThis(ZodSchemaObjectImpl, this) + + return t + .pipeSchemaIntoInstance(t.schemaWithDefaults) + .parse(values, params) + } + + static createPromise< + Instance extends Values + >( + this: Class, + ...[values, params]: CreateArgs + ) { + const t = implStaticInstantiableThis(ZodSchemaObjectImpl, this) + + return t + .pipeSchemaIntoInstance(t.schemaWithDefaults) + .parseAsync(values, params) + } + + static createEffect< + Instance extends Values + >( + this: Class, + ...[values, params]: CreateArgs + ) { + const t = implStaticInstantiableThis(ZodSchemaObjectImpl, this) + + return parseZodSchemaEffect( + t.pipeSchemaIntoInstance(t.schemaWithDefaults), + values, + params, + ) + } } - - static create< - Instance extends Values - >( - this: ( - Class & - ImplStatic - ), - ...[values, params]: CreateArgs - ) { - return this - .transform(this.schemaWithDefaultValues) - .parse(values, params) - } - - static createPromise< - Instance extends Values - >( - this: ( - Class & - ImplStatic - ), - ...[values, params]: CreateArgs - ) { - return this - .transform(this.schemaWithDefaultValues) - .parseAsync(values, params) - } - - static createEffect< - Instance extends Values - >( - this: ( - Class & - ImplStatic - ), - ...[values, params]: CreateArgs - ) { - return parseZodSchemaEffect( - this.transform(this.schemaWithDefaultValues), - values, - params, - ) - } + return ZodSchemaObjectImpl }) .build() export type ZodSchemaObjectTrait< - SchemaT extends z.ZodRawShape, - SchemaUnknownKeys extends z.UnknownKeysParam, - SchemaCatchall extends z.ZodTypeAny, - - SchemaWithDefaultValuesT extends z.ZodRawShape, - SchemaWithDefaultValuesUnknownKeys extends z.UnknownKeysParam, - SchemaWithDefaultValuesCatchall extends z.ZodTypeAny, - - Values extends object, - PartialValues extends Partial, + T extends z.ZodRawShape, + Catchall extends z.ZodTypeAny, + Values extends object, + PartialValues extends Partial, > = ( ReturnType< - typeof ZodSchemaObject< - SchemaT, - SchemaUnknownKeys, - SchemaCatchall, - - SchemaWithDefaultValuesT, - SchemaWithDefaultValuesUnknownKeys, - SchemaWithDefaultValuesCatchall, - - Values, - PartialValues - > + typeof ZodSchemaObject > ) diff --git a/src/util/class.ts b/src/util/class.ts index 616f709..a228590 100644 --- a/src/util/class.ts +++ b/src/util/class.ts @@ -1,69 +1,6 @@ -import { AbstractClass, Class as ConcreteClass } from "type-fest" +import { AbstractClass } from "type-fest" -/** - * Represents the possible types of a class. - */ -export type ClassType = "AbstractClass" | "Class" - -/** - * Represents a class based on the specified type. - * @template Type - The type of the class ("AbstractClass" or "Class"). - * @template T - The type parameter of the class. - * @template Arguments - The type of arguments the class constructor takes. - */ -export type Class< - Type extends ClassType, - T, - Arguments extends unknown[] = any[], -> = ( - Type extends "AbstractClass" - ? AbstractClass - : Type extends "Class" - ? ConcreteClass - : never -) - -/** - * Gets the type of a class (either "Class" or "AbstractClass"). - * @template C - The class type to determine. - */ -export type GetClassType = ( - C extends ConcreteClass - ? "Class" - : C extends AbstractClass - ? "AbstractClass" - : never -) - -/** - * Represents an array of instances corresponding to the provided classes. - * @template Classes - An array of classes extending AbstractClass. - */ -export type ClassesInstances[]> = ( - Classes extends [infer Class, ...infer Rest] - ? Class extends AbstractClass - ? Rest extends AbstractClass[] - ? [InstanceType, ...ClassesInstances] - : never - : never - : [] -) - -/** - * Represents an intersection of instances of the provided classes. - * @template Classes - An array of classes extending AbstractClass. - */ -export type ClassesInstancesIntersection[]> = ( - Classes extends [infer Class, ...infer Rest] - ? Class extends AbstractClass - ? Rest extends AbstractClass[] - ? InstanceType & ClassesInstancesIntersection - : never - : never - : {} -) - /** * Represents the static members of a class. * @template Class - A class extending AbstractClass. @@ -71,31 +8,3 @@ export type ClassesInstancesIntersection> = ( Omit ) - -/** - * Represents an array of static members corresponding to the provided classes. - * @template Classes - An array of classes extending AbstractClass. - */ -export type ClassesStaticMembers[]> = ( - Classes extends [infer Class, ...infer Rest] - ? Class extends AbstractClass - ? Rest extends AbstractClass[] - ? [StaticMembers, ...ClassesStaticMembers] - : never - : never - : [] -) - -/** - * Represents an intersection of static members of the provided classes. - * @template Classes - An array of classes extending AbstractClass. - */ -export type ClassesStaticMembersIntersection[]> = ( - Classes extends [infer Class, ...infer Rest] - ? Class extends AbstractClass - ? Rest extends AbstractClass[] - ? StaticMembers & ClassesStaticMembersIntersection - : never - : never - : {} -) diff --git a/src/util/index.ts b/src/util/index.ts index 7bc5968..bdefda8 100644 --- a/src/util/index.ts +++ b/src/util/index.ts @@ -1,4 +1,4 @@ export * from "./class" export * from "./effect" export * from "./extend" -export * from "./misc" +export * from "./zod" diff --git a/src/util/misc.ts b/src/util/misc.ts deleted file mode 100644 index f381be2..0000000 --- a/src/util/misc.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function identity(value: T) { - return value -} diff --git a/src/util/zod.ts b/src/util/zod.ts new file mode 100644 index 0000000..efcf26c --- /dev/null +++ b/src/util/zod.ts @@ -0,0 +1,25 @@ +import { mapValues } from "lodash-es" +import { z } from "zod" + + +export function stripZodObjectDefaults< + T extends z.ZodRawShape, + UnknownKeys extends z.UnknownKeysParam, + Catchall extends z.ZodTypeAny, + Output, + Input, +>( + schema: z.ZodObject +) { + return schema.extend( + mapValues(schema.shape, v => + v instanceof z.ZodDefault + ? v.removeDefault() + : v + ) as { + [K in keyof T]: T[K] extends z.ZodDefault + ? ReturnType + : T[K] + } + ) +} diff --git a/tsconfig.json b/tsconfig.json index 5470793..c8b2ea9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,7 +8,7 @@ // "allowImportingTsExtensions": true, // "noEmit": true, "declaration": true, - "composite": true, + // "composite": true, "strict": true, "downlevelIteration": true, "skipLibCheck": true, diff --git a/tsup.config.ts b/tsup.config.ts new file mode 100644 index 0000000..ed2a957 --- /dev/null +++ b/tsup.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from "tsup" + + +export default defineConfig({ + entry: ["src/lib.ts", "src/schema/lib.ts"], + format: ["esm", "cjs"], + dts: true, + splitting: false, + sourcemap: true, + clean: true, +})