From a90a491b0fe08a3938d5599c54795758bbe51a7d Mon Sep 17 00:00:00 2001 From: Andrew Zolotukhin Date: Wed, 30 Sep 2026 15:45:47 +0000 Subject: [PATCH 1/3] feat: add projection-aware reads and inferred synchronous mapping --- .../projection-aware-synchronous-mapping.md | 14 + docs/assets/projection-read-schemas.png | Bin 0 -> 153082 bytes docs/assets/projection-sync-mapper.png | Bin 0 -> 139024 bytes libs/benchmarks/src/mapper.bench.ts | 44 + libs/knex-schema/READ-SCHEMAS.md | 217 +++++ libs/knex-schema/README.md | 18 + libs/knex-schema/integration/queries.test.ts | 197 ++++ .../integration/read-graphs.test.ts | 278 ++++++ libs/knex-schema/package.json | 3 +- libs/knex-schema/src/AliasedReadQuery.ts | 234 +++++ libs/knex-schema/src/PolymorphicReadQuery.ts | 564 +++++++++++ libs/knex-schema/src/SchemaQueryBuilder.ts | 10 + libs/knex-schema/src/SchemaReadQuery.ts | 885 ++++++++++++++++++ libs/knex-schema/src/aliased-query.ts | 44 +- libs/knex-schema/src/entity.ts | 136 ++- libs/knex-schema/src/expressions.ts | 6 +- libs/knex-schema/src/extension.ts | 1 + libs/knex-schema/src/index.ts | 35 + .../src/operations/composite-cursor.ts | 25 +- libs/knex-schema/src/operations/state.ts | 2 + libs/knex-schema/src/read-entity.ts | 72 ++ libs/knex-schema/src/read-graph.test-d.ts | 94 ++ libs/knex-schema/src/read-mapping.test.ts | 76 ++ libs/knex-schema/src/read-projection.ts | 87 ++ libs/knex-schema/src/read-schema.test-d.ts | 85 ++ libs/knex-schema/src/read-schema.test.ts | 163 ++++ libs/knex-schema/src/read-schema.ts | 305 ++++++ libs/knex-schema/src/read-storage.test-d.ts | 29 + libs/knex-schema/src/read-storage.ts | 105 +++ libs/knex-schema/src/types.ts | 5 + libs/knex-schema/tsconfig.typecheck.json | 2 +- libs/knex-schema/vitest.config.mts | 2 +- libs/mapper/README.md | 26 + libs/mapper/src/MappingRegistry.ts | 411 ++++++-- libs/mapper/src/index.ts | 5 +- libs/mapper/src/sync.test.ts | 156 +++ libs/mapper/vitest.config.mts | 12 + libs/orm/README.md | 21 + libs/orm/src/dbset.ts | 18 +- websites/docs/app/knex-schema/page.tsx | 31 + websites/docs/app/mapper/page.tsx | 32 + websites/docs/app/orm/page.tsx | 31 + websites/docs/public/llms.txt | 17 + websites/schema/app/mapper/page.tsx | 22 + 44 files changed, 4415 insertions(+), 105 deletions(-) create mode 100644 .changeset/projection-aware-synchronous-mapping.md create mode 100644 docs/assets/projection-read-schemas.png create mode 100644 docs/assets/projection-sync-mapper.png create mode 100644 libs/benchmarks/src/mapper.bench.ts create mode 100644 libs/knex-schema/READ-SCHEMAS.md create mode 100644 libs/knex-schema/integration/read-graphs.test.ts create mode 100644 libs/knex-schema/src/AliasedReadQuery.ts create mode 100644 libs/knex-schema/src/PolymorphicReadQuery.ts create mode 100644 libs/knex-schema/src/SchemaReadQuery.ts create mode 100644 libs/knex-schema/src/read-entity.ts create mode 100644 libs/knex-schema/src/read-graph.test-d.ts create mode 100644 libs/knex-schema/src/read-mapping.test.ts create mode 100644 libs/knex-schema/src/read-projection.ts create mode 100644 libs/knex-schema/src/read-schema.test-d.ts create mode 100644 libs/knex-schema/src/read-schema.test.ts create mode 100644 libs/knex-schema/src/read-schema.ts create mode 100644 libs/knex-schema/src/read-storage.test-d.ts create mode 100644 libs/knex-schema/src/read-storage.ts create mode 100644 libs/mapper/src/sync.test.ts create mode 100644 libs/mapper/vitest.config.mts diff --git a/.changeset/projection-aware-synchronous-mapping.md b/.changeset/projection-aware-synchronous-mapping.md new file mode 100644 index 00000000..58b463a4 --- /dev/null +++ b/.changeset/projection-aware-synchronous-mapping.md @@ -0,0 +1,14 @@ +--- +"@cleverbrush/mapper": minor +"@cleverbrush/knex-schema": minor +"@cleverbrush/orm": minor +--- + +Add opt-in immutable, detached PostgreSQL reads with projection-aware runtime +schemas, precise decimal/bigint decoding, nested relation graphs and explicit +STI/CTI branch schemas. Reuse result schemas directly in separately defined +application mappings without duplicating projection schemas. + +Add `getSyncMapper()` with synchronous eligibility inferred through the existing +`configure()` API, completeness checks, nested mapping propagation and runtime +thenable guards. Existing queries and asynchronous mapping behavior are unchanged. diff --git a/docs/assets/projection-read-schemas.png b/docs/assets/projection-read-schemas.png new file mode 100644 index 0000000000000000000000000000000000000000..4258257a9f7ef48fe95744a6bf0899c3ef3cc3ef GIT binary patch literal 153082 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/F_E#$(bJ8LR0feVlsnX&R@|S09C|{ z(ZJ17jM*Lh!L(jpykN9yhs~LbMy^;K%5kbhhK>6MBj6xqLe!tu@v}$QoP;G0>&1b> zNkMg^yP9Xb^&ueLlq*#WcVzD-o9xefeBGbtRux#1`~(QNn`b@z9td;vnz*` z4hFL@L^@R7Qw#3x*$!0ZzHR6)eCJrZFYx0UuR1rSXgH~yNuIoG7r2oOo~}Kotz$du z8^s7!Wy>4(a{!Du)W&0oJ3k=f zpLNPhyK4(oX+;CeP4J{ickc0f7f7`h=k+!*v*KV*+rUP_>{ic9b&NL?==I&VQ-}c+ z;`!?rpx6G|oWw$APS2isO_Ny|gl;IB$-b*~9yxQENElNfsEK$#8BW?$yh+GKj)0$U`bP_eGJf32f+xN_w)_++_xKf^=fcra z5?a4&`v~cOT|eAg69ex{q*)yvyQJkJ`Dee2XMOZ`yQ`#UfU8?l+J6drBcCs#TkE4bvO(u%2@L}-OZQa;YX^Xhj5xXPssqTZ3=#MpDWV)WOue3X9G;(nd11Ke2 zm)oKq^{1+aa=Xsh@eCS{nty$EQ{oYiP6cE1N+qGFlM$xyCa7{K{#yT&OCSg^O{dBbRpj@9m)qqz z4u87Fa3;-W&U@n@B3+pP`C1kR9*IApK{8^%<*-iob2kB{kKCG4%f{PV@Qj25@oYZ& zo9xBM=F{JI>2#K=%@(f#*3lOQ85-NB+mx|Z+EvC+5o=F_N(zI- zPk7Ui9k0USI!m}{a~RD;Md~hocO`j`>Lj`B)_sBbuK;JD7f8iN06Mza((|!?DNg*& z_GfOON0eR{kjFHe_YKjq0sB(Y;^uzjV<)pkvPZ(%Ms^T+8)i8Rq|L$Z9TpK*K{S%G z;TXrP##EqMl$%sO0&saaC@S8++_MshONuSN04VMkzO3^&p^=P5wWV8 zSXM#NCP z*WRY{FzF3oYERz$nBKWRVqGlJW-A`JlB~FXD$1 zX_J@}B~AN$b6q#5lVbzdGa!6Q=SF8dd+vC{n^I~Keu-GNK*hnAfK)0G&kYe&INK-E zjWRCOZ)F@nA+op=w3^;=ElO+Ulh5$-@*PC_2i2ef3sERg<_ z6~(=6Glf-4;}O4%JMFijmyV_tn!TZxJq>WuCrIyX?+oXrA0AFesHiv-aNarLi`v(Z zcb*n`@(kard?0ND@``L{RVH8DT;Vkzx}PDo*gmwJ29i5owq6Y!xQg16ttoT!Gv-TiV|QHy22<~lLgBjG6tG@GDNVSzS-H7VA+ zz{xi}M{Aox(mbTpUQyxg(%)$12J^`Hhk?2opeJSnzg7o4KVj>22~Niy@*H101vuPY zx$HR!Gfr5f4|5UvDj$ zpEVp~I|%^p4#^sz3?DDjik5tr<7pn| zx#v>dkoywYY`GPT2Z7@}DX&j*@iVP=!^3$aNDZAv$DP@tP%Bj?xu-$55)i1atmo8x z4L_7_<{+KVt4_4)5!#7oabKp@P(8oI$nbEXqqvw@X0vx{AeWd9`^`R&tQ{V6MGk|ey6UTr&Q~H4E1A1 z2pK$|gY#hGjbsXpSFrX|xD)Wh79-%by|E+$p3s`aE2IEE`$IK%mSc>DL_ohTo2yN9 zRV&d%PR*akH8?YojsntYw0Tg%tJ)!r4|YJa$nibSCnHg2;070t017le_()JBa6peJLe59`JNWW3dT zO#~r1b=+fZFF)!o#5?6$?1Hjk9-$%@^okGZ8tDl(>zExnnLOwLCh(#Oofa#?x>fly zLiAHOj{p7iUXI5wK=O~bCgn_4sr@vuPH|P}Y$!F6pi^Ur({6G&_g~vAT2d^hoFSlj z9{DDwnbYSLu*4*?>X;EQmcgncpUU8n`c_gx!6#M=Wl!chBiAF_Qp92MNY6<@41n5+ zqWgLM_gtj-vWN_K(0yF-TlcRf7i-n5IN*A#@Q=!dE3snWrQbz8=m=uYQV@9nh4REg z=Ode#zg<|x(^S(iW8{vM3ew)zl-p(ZJJ8iIq5~f9fYFNMiibtmNzgVtAH^!Ie+%hq5$aeM~i{(|(-fozSan9K7r5 zw47>82#tOGKKD+inSz|2M*(63IILERB`ou)fDx;=3K*(%87<~bt?*u%oU7Nrp#{&e$9oeAT)t=3+mw1DjUWTKt zahQL@el2_dkkPSU@RWmhDH;HdC7ZWAwPYf${d!ctQQhE{%%Z>A=vug%)Uo*B#raJM zw?SK+3@dZwPbr4Sw@kx21E*oW7TyTF(GcE?j$l@qC2A;hk7`w4joa|>2$J&%ef zY&(Thex!ZEJY{XUy#RzShxNezV1(cOzDA4WL;o{qZQC)bN9T;F)#Lm#U<>q}rsiIS zeG1*|z{Up%F5Y^pLcKO1`!e&sp+TT+vir_z>U&SD8Nven=l=Kmk@qz5zQnxaX+0N4 z{6HY*=Da<0i{`~*GWN3?m0}Hg5s<7-WeVE~(9=-3+2We6biO^2&#t%n_v{G5*c@fI zRLul3>cOJqdw_9nWpy2Ee%qI*aUL%_y@7Ai5&POdCa80oe{I9UU#zK?r8jxHeP@br*7(zZ^S3_--3P>CE0WsS6 zGkRyhxv(PU>3gB7X0a@sBIorh>rL$g>tC@pJ8NCp`*v49rs5iqKdHit z7OUaAKkIM)sV$_f)qe$2q^(`_W-izxC99LRKVsPZGyBzg`3&+Cv{vv@zsc~cIHucr zubYkK%_R7`Kih|Qx>OghDcY>TGMo6LPV-vtqQnlK+~>dx=Y7F)s~%;59k;M)%5x$l z#vUqylS8~S+C4c<7HsZHSUWcXP&K-M&qDtL`znVcl#iEJCk4WK$Jad_Whv(@BOThfGM4QV`I~?(EBFy*Ao~( z*{v3XM8YZkel>K_3{x2!0$b6*t~m0%yQ#$FT-}fPyrM#5)Swjz>2(34IVfz~y!JBC zHl!YCP+5F-uTtQi{m6qqJ$=`H$z2bF7~Cu1;cZ+xZm!Gz`hVlH1#j>Gvq@Yw#oo?ry3r0d_zyXA#HNy~a=y0~2`Stk2tM61}MZZ_g8T}!KbgTcu*1f+BN;~E8 za*a4P+v+e&c-a=NyoIcOj(+&30QLW$ji>*gHL%*<1}2fTcEJoX?^amN#P;S%@$vg^ zb;}nevkr4}aEZoN=TN^oL?}oEqaCPw3O-g*NJxl^-qo_G(KZIhQs6U&ZG=UReL_=P zo_A|&5A&5n`i`jidODrm(~|O#ua2!S-@Zokz5BukVDb+h9Mw)1Tq&Af&TiPeJi#L) zq6?UZ2d9N<)?br!C|4JBdvF-fX<|H!Sm*e{A~mF8p@~>A{LndV6LT8JTai$bzmM(x z8Ta@*(m!q}@m$7~R%v1P6n0@dZ|rls{+`v4?~0*6UFZ0~Ldui={ucI8{Zl*|m?)FS-AjTH{z^ z(vzTmPP-7F&2&i`vq4(RsZJIz*B7Cw6`8Bc*|RhDSf(%1K%hJir=ipBxNXm4HiwSR zts`UGNa9GZ8_Euf^j|nx8lUNUYW=jC+U5|2xPI!9!?DghhX4Eu~~nm zil#J(P*Os#wrO`K3k^}nVKh`P&V$96j-PDI!eAkVVdc7^nY=?8kI2r`o2!}9%g#s@ z&FJD~CVCT+Swpoh?nrUtjBz9tD?59{Cfmx?vVTCwKK1-olK$D$;I@h)d{L&Ot?Z%n zNKdz$zgeg1f|MK2>)vD)<_g<|E8YoY%{q4btK16z@;&lQZ zUXIC{tT`zkj@yB6Cunp~*199X){t8o&Z%pNzTz! z0_U)lY+t;u$D-GoOT{fYc}-afvJ+@+f%+9Wrnu0 z;hxrE=V_qbLiaD z5>;rLvd58fy^}^-g+WeyJgtQ5fB|t?;l4wAp8cA{L!WYN4)1%{lDrc#Z`U zoi^>l-R|zD@EQ|KI+4SA5la6-2qL%$^3hxEkLHR_+L`Mqc6UG=x~;4hT63;SE!J6E zQ)zq)O%#tkUdQykq(6cz{t85WY<8|LkW}{e_Ca_jc`NGcn=uydaAHsX{2Dn2{qD8j zvUT{4`voC1-^^?wCx85Nv1wkk(n4C3l7K*Pot5@vnf1zvfW!1|VdY^(D?B3ovldGz zZ@mT+K4_Q>C7H1Z){duTs;g6DqPB-h(j}bjN6v%!r(s$PttBoK)OeVrR5pwAm}NkL z@|y=zqQa`>Ekb2;cya_fl`2<7?{_W^@jnKGUHLQCU+I0J$1T&w_Bw~p0L``Sa+FQV z4fV=!L3dhX1up{SwjIvi^+Bq=sV=a$)=9~XiS=|3rA|ccxnF3G)RP2SyJ>K|nqpL1 zTvMB4Sf~aO*E<>X*v=QP;zu*^-xm~1#$^KQv~s;hnbkNb(IxO@O#Z#tvnPYLY8VGn z*N7novS$p;E`^ZYMf`&e>iwHUTsaRSZoCFtuhK(A?L?co0b~4+(9mDZ0k*tfW5a(^g>!>b^*?Y`+3cOqZsr`0KawnH!yMWa{uW;=@Yi7}L$BqDn( z6EWf!2d6%NeJha@p-f5AiurVd_XsrmM7zBfHORK3? zjWoZLv=nnRl2wHtO9i$E#EYJqWIrr{b@Xx4$Pd2D9 zQqfM@?}g5gF01`39K+>0;5=t!SmA{EniOTFdkn&L*n-!Z!L(gudgdq=%k3ci{p?a; zKr&5aqv;8AFApkfYk?(y_%5A9N*FOp^CEJ&-*7%RRc!!E`r0;w56Wqe^^q~|h})4Z zVsdE7*k;!zo>kNYJM|OY-yL>NYRE@wJ?ew%UQEP$e5q#1QnOKNS4XVWWU7s!YpM)2 zdL5Gy@@!+(?HKBACzJi1$!M91YCPye6Kg89ETw5oQffZGXfBf|_V@F2Y0&&(NuHx=`5PPi5K_v!Iy4aD2Lq2jL?`!j8pBO=I^4NQ)5-=W7* z43JgdU=o|iZ9>ag^7B|XMXhJvZ@k9T2)mx2>(JL?x;&QYyCHTs@byN7;F%z(kG5CH z9Nkn3z>-Fm?fxs6B>lx2te}?aS}fRnC=A^j^@$>PJt(qws?2!2G?)dFr!*j~FjuGT zQsZ3wZ5Ba99Oqz`ND-i3^rK09jzL4YAUZzr3)zZ{Fc*YWaDZ7~+G1|DMPJWUkGz>v zPCt#CVP?jaR*(*JK(Dm$bO2k+IqvJMp$y`)SRS)JwSX5H1w*;GaI6QngzM2^Hb-&P zup=UdQJ)}}gqj^#Hg~lhxf2OI3I|DRVyNPh#kJTxZJv}26Iix*Q$^TA23=L>Y_3WR z^Q>Rg;g>87Wu@ zd`Ze5BM<+n05|^j7@NuzZ`lG@x7hy>l?{g~cM+37j+lRBeEJ+BKL7Y?ek_ZFJmlmk zI`&tVG3Hv!gt%j>AaMEaNoKO>-;z-~%?au0 zEE>u4Q(B@ZN@bMzr>Z21fxQj-BM)ZKA+td+2p#WjHU-0Em-m%wkvF~S1;OSqA`W%9 z(#353a2Ao2swZzQ&a3=ruXlM%P zpH}ZCHMad2a@)I6Oi3N+wVB?p+?|D0RrR(gXuwP=i8uaO(F3>ctW(1*{2RP2{$wP% zj$%3u_IaQlpQKnY4xRq3G#c)+Omu$%dN(^dJ-d;Vcl5kg(v;r^^wZ~V$^K1u60Vy4 zr(LBIxK^OukmNsHfCgs%ZAjc9vhH&Lx)f`H2FV}QF+Ya>PpFZr(Xmem+T>lCX16}Q z){LkmNi&h?8tnVSJaP_sVFI;VZPzn$pKWFGE2M&U&!~aCa@uvmg*!yo^asM_5pM>Y ztZdj11q_Uk0A`}ev5sk8*Is4Mfgl{2orDCFIdV7E+SP?i_bU}aDr@!NFC9B26-W3o zTum8NX{0ynyly=LN@b0ZIH_T}wq7lBflq!h=1h7*^i zcdFCV90qGlZ6JaH07DOf+mG+v8Wb~c-BHneo*q|5Th&gJ@E}brS%=6j5#r${dc4$B`znn7l_p&mTb41Q_ z1H!g^V3NQ6I5uNXNhJ7Iqbvk1Kk(HRAxGu%Ue!zL0ZDd#AEuq@o{%t&yaMmr^;l|& z>Q7P%ZGM@Bz8~Q{AmV4Q`~ZJM?Ns9#L%1F^Z%(>e{q_Pl5QTzV!M}czr^7&r>{^@s zcoI_j4P?EniE+cM;tm5tUdyVsT$BKC|QB^itwYj+#>)!}R(@d5&W}EAp)(3x- z%Wp`y+%JE~@2qc_(5;AuR!68`SF72S9&_8`6#(BP&EvDn0-`Po9J=r>RBH9@vsLYS zMF{h3F(o2u<*lycNl~fn0N26(m8phzi=()R&TsTSVFSA7nM37RM8zLa{Woylg35c=27wKU)|^<*1z(bMGoUZlY(zS7?DdDv_Cv4j zJ=nZVuPU|)|GoA=Co}aQ6`EL(}5u6vBTLg-K&?%-sn*$WJ`WYS7O=5zUzr-p-M zfFw|eO&PjW;zz}nrugb=zjZPF9iZ~j-e*g3$o2TC&iOpE`X?aKb3B*(Fd-LgwuQ^x zN2?XW!mwexrBLISz(iG|5&W={vBO?Xt*3_?n%Y;QA+<9urBIL+KVrM)CR*j|Lt(Wf zeIiQRAH^3%TDv(^e^d80#0W`Y6pYlJYeFg?kwzJY+E6lj;0!n* zu~?CWF#_)A504{dyld%Hu`~lE1(z-P$2j2F^7E&D9(F2sq-IkT@A%+qdQ%m!_%>N> z=&i1j@&euuaZUJ-CWq!?_(n|+0S9@JXjnhv7H_=a{_Eu&ze=k6>lB$$dGR_!1bxT%8z zb}n|i++5VXy~%khD(sx7$g|%HSWeVaPJ+Uv1+C(P)azKkf%f8NO5cfnk{7S;obmIx zt=O8Y3>2HPm`!snsdHfg!AdwC$#J)Qz{<>%T}tAKD3Rs?;v1hN`V4-YwW0OSWva$Gk<)y@GC_g~~)ljiw(NPHTGn@p49P-`rH` z2tJ2I0Wz?Zxb>VF6e1N>EM|EL=AvTF10eFFv5~XA%NyXNCZBCK+ZN%b8;B#{nsPR^ zpa7pM(`%YlA}>E3J^F${}T`;EM-+jcJ-5BvE@vuH4ixzSa~ z*@52l^#`5e^M*Skk4x{-MlnUlLyOD1;4^*EEO%I>G9YBOiy*>^jP86UX>8mK*(vGU2y zC@L_p&e)0awW|bg+QYF;I1ueS54AfFlMT7(Y>l*x?~r-hjt_5KT}u`Y#ct1PwM*b4 z`Rxhs*BD^SUW?KCW|HTo6L#!Rm#6i={-b*(9Qr4w+qv+a348u2i6)b7sIT=SfaAw; ztCTWz4on)azr2o(G#p~cy&&CE5slM3xbXu~X3C`cx4Mz)KK6W|UwltV@!tPwi1Q(O z0f_yP%J_4BAq%0unmw)CWgrxTlwT$=E_)H;nfChc=q{#V&~)6ec`%-DY&yo;nN{jN z-u)8`m~V9Nf_OM^ULV)D0peMkwjlJMlu-=U%R_PjwXhGLfJj$*XF1?uczIDIx=vHA z*Ay4qZbg0h9a8)Rtpi8};d#o3rxJKhs*_>)5bT=k|GVH&;Gy-(T~FWPJAI)yZGeIR z!1{5c3yw`wK4d~{WEph*Pq^mA$?+&%;0gH&J&W4T&?X!#YMJ6MVdn7f;zLNabbqSF zev^k#{BrxsvJzJHIF$-+L@l+gxcXZ_=s&cCp2a;lAzwH_$n1yN+W+I1-xobMKVg63 z`%5MQ5Zp|g@bA3_7^ME4azuEihv5$y3D6g&1)_<|Ch-5vf#R|RP>X;uo83%%|4U-& zkK)nPZ^a`3r5V|CkNWRyBuw+vKn({cnXNfu15jV8;Ay5r6W0)`uqjdm$#niS4Hg7fzaAJe z!S?j*-|^vYKi3x-0nnyeN40(RuL~+<{mbMg8DF%$%*asT-MIG}898rLPf-vM7|Mga z{^lq?z{%1JB}wY0eCTzjkEFG}QLF{qzxcHc=?-27_RI`r#@Q-C5Zm4VTjmb7oJ;7nNFDaaqo zHTCK{)IMSreu}lxgUuKHq4dJ6!%GpFx7uN#p_kF2hSm$SdUH}L1_}O<_;##WjZ849 zkAjYy4<9ZpUR9h8%fAni#P#KNa^IoY(22L#4U+0P+vP@<#msjkoYTC5(PS;KmuZvs zOe8b_)i&ybd|SU3R>5^Bf5w!dHi8kkp?H5Gxwpn7>s=;)X^dRaZKHRj!YENtHImLi z90UyBLsYUo%WT&nV2CdhsXTWmn>DU-p-YDcX{?WmItb^0)SqL zYKH-Wbo)sUcI($rQ-_cCcO~EIu|F5L*^A{jp`zyb6s$xQ=$*K?Rk%wfA#0AE-K((4GFCHHc%Gy!qz7g7gyQOip|cEWPt-5L>}Z{29SAX=ect*(TY zQ2<3Pf%a}sv6BiNNj@KxU_1Uw89Kj$mlmoJ$q_|FNJR*OZ-Uxq37e?ZCBBcmPnpq9 zSN$Uu=vl=(kOD7xwIH;T9*plF3=3F!XaUK_yJ;S~gc@z>g;dgAun+EkI?JnuuL^gE z0*4Y=jw>CVrsJupyZHoAT-Q@LL;I#AGYpT@`=*@j}0i8mKLM6UTfWa@AH$EgC+vBm6C)2Kz(@2gJc0hf{z2v|XP;0jO7 zW}ln4`83_b)4#mAEJH*(X!9L)N6#Kiu{`ZbKw6NHKQ~@^Dfs{#g75E+ST%0^X4>># z>Iw`XiUL}Ci|MHI9T|GR67H|zXu)!DDeY;HNS@a3RF;P%1c#Wd(?OZxb)&R+!`y}Y z=N))f`S{39y=h=~V|+cWg@<%$PVswNg>ckC!jTZ^>GelJA*v9RP7yV>8LNMpg08q( zy4`xxL`tH>N%5)~_1-zM;+oeTSLPY37&@6hmFxF%02GDBNOzC;`bJkw48a`(3%aa& zv?wbh*Gmg6$e1RiBord^r>6n4Dnc4b9YY#crtzYLmeNw70*)%K@8OW(78)iCE=&fW z*fut@%FFdQIKrE`5-?sG$QSxrN5H9JWtjb`HY~hjDyF3jG7%fFWnLpwBYX65Ihh#* z*>d@_bE-t)Y2W{@vxYD!R#ugiII`NBaB_4}b1`ibok{*7@C^a=N816z(G0&Yc9fL< ziHRTf&|jX7wx?jn_{l;CzodW-X4v`D{3r!PBpAf3${Y7=hBPpYtT=r|7;N{`_ zW^HP37-n0%ydZ?+z*K$xZj^GroMhIQOWUkF`o#o0Z84MVR$kAr?PyJcCk%YJy&Bi1 zVHQ5v@`-p^1*TVb=I$$iNkQ(16KPkVrNzk-;mb8auP7-&yqXISfr?{2$iS*jA6GE&PpW78 z$9wunMJ34iSs6B9Mgj20`H$aIaj#gEX8YvH_;1_r z6|&{AI&^qHrC#L~uK4!|Kwwgfq(ecxEF7>6exi)>hLCX%-(Jt)k9m}Tdktm^@k&P@ zYEtOs?>MLr4T)%P+Q4?&dTGCOE+hQoIUobt(B_&Pk+u@R6y`=LvSlCjM(zpSn#=9{N!~((e;Uy$S{zhaUXccg z@(x5w!*z0n)R)rVY&HjhQhhAN<#L$FA@c1IY5?UO%W4eP{^}>gPWtl}V^i zL&@?-G^Y&IyRAg;i}uGUVt|`}TX%Ub>kfw!c~vuw3n@_h zv8l;s#oGi$vO*9=y0nQ$i6**KU?V{H?YPs&*0*(wbA_QvIF<`c1-$6&HoM%p5Bv#a z5-_zh+^MtR$J|hxLlGg^s0SOd$K>=<=F#x*{&mj>gK}osqJw+m4es@bN7CD+Jh~}F z8e&K_rk|H5It~`Admli0dK*{@)XNoGbB!{~5nrd#3rE{^X;@X|_Bjp@{Cqj+Q5Y5NZpQuSPOiqTtOfYT|sW$(PNxf7-Tw%zM>$-p-IZTlW<{GU|NT zxAY-WDc78oPrE0gi^_4Y@Sj*fv2y)vVC@t2UexJ5Ha`R5rt?#eJPYZ)^e{y%S=9OB zWv@!@AA=Z1@X3{4=ntwdB&YaA@Zll#wW^`mbi~ii!k@*TyYj#T1s6Baap{e};1AdA z&pMm|dQ1`2ky!C^{hHO1;1d}T_+ej35UBHy)}d_|T^?vysV3&yV^C>T@g&esg92m2 zC5KbylA#lcf0|DRS#6GN#{)+g8*al_TSh1mEt@ApTW>#Lw*MgRG>Xrt?~|b%;*{4S29hs|T3BFe$>q3w)y;Ve|D>+0*{TZncB zRRD}?G{titb+li6iIqks6oT)-&ZZ#^L4Xl&(aY|r^NH~(w>>2|7%7&W7x(evq#Ww5 z_SD=cs3QtOCEu)rKwor**u_;(FQYK?T|bXHmIO$qK8Xlp!O+}N%mZRuE}+kT=-GfG z@Z!8*0=Z9RZv$PFU5X;SOh?Rk0+%C#5zEdmqC{w*UTcC~*L|ERUy3~(IW<(}cHJ3D zPpF~%%QBS{ZY!7bEqJ}TBAH&UIHq@xFQLo>CRP3-r&{3m>y$da1y?qP`8+s%S-CDU zAOC_k7ukcI!{L&>SX05x)x;J7Mz;-9E(BC5EqgqqJE?W{tq&X;59hWrv zCYWd^&{Mi($?bMM8FyFf>YaStpPiKlJ=%LWwsjQdRRleF(tOQu6^8pBTquJwE|=Tk zVE)GzkV0rp#Cw)jW0LRkeF}YE=0$sM<3xuyec^t@iaDcW1Nocgxkk~JE!D{pk1>)1 z)~?*Q?(n)X251(`*cgSelzkXrsa&>l8+z$N_f@f@l5GAxL~betWu%YYqXI^xA?nRdD|;lhj%Z&TA4$L{$Kb<%yR{{EWnZ=Sc8r9GbFbabS{$8n%urqW%b)S$ zd5_&_tFJ!^E+IT#0R7*g3;j4bb;2KJC0f8X-o~oUaT6qe-A`Gee*SP z!{rGQ2J-N5*2j_%+=rjbw=iQRz&!lKHe6Q4NcuMWBZOGK6D|bn6u$<2{6NG|0bAwQ zrmNe{Yc^KnXFntP zHkw#00wSEu@s?;xR1z@ld%8(K+h%3yb@L~WPqMVcPc)8&vqO$1GHm1zB11{f#M9VD z3dIg&n9coQ!EGT(Y~pN?Ul7Wu->_35bXH! zoKvg=D7KUDbswRBKb0GsvaFGtc9b0+?1{V*>8tcL*^sM#&UhVj{aZHHq0ZrQt@qVV zs2p>k(dgZs`bJytA6>b39903JLC2G!L*m4c$ixRR>}fLXo7G+QZEH>&r*hf|mO{pU zutZ>Moy!mlQ6u4M65nI*-L@}uOu|p4!qB{(5#RNSa<;c$^l9EEx0)J!kHT7E(qdtd zv+Q=jp5Hr=jZj9E>*Vz9swcKY$O_n7dYHuFy-on@=HJ0~c}Tq-?Q;Gk5vuLJy3$$n zeZ*d~Dc^NQp+<6G+ZJKF|J&KbPc(X3RlpwF{{*dXa8AwzhSJLoy`TV04aJ%} zT-Lr;%Xz7G_u$Y0y5{&S-n;#h%$aXhB{UYqe>sj9IL7FW9jziyI(6z`bc} zMbdxQ*7b9ndvxUn8p@ZYK#L&Km*KBZIR*rm{C^OStx|fQ8;}=WCH#$pfZas4{q%V0 z&;J*)>T-WidSHlnG%0~Wa(xCGu0Qx`wk4s<;}}@piDkp9W0iZe!A{Tv-shi>r@?2k zy0I@pf>|B&0hMKM=4So62u2jbC|OYs>En0gJr|dyH+4u+;-xp+N1^}mbMXXSn+QIs z@MVn8g%{=LMIY#9ykNFd05^&%hCf>F7^P84ep^6Cdf#nL} zc|N-yEk*}ppx>Tmx=uv(ak&Jmsr&ef2n!3_@c1iRH$B%{Xad?k-+Ngs7bwl2;18^4 zS~6jd#ABLaW$X_bDn#eLA*ng0vb%_V{*rfcnmek!R;pNUg>_Ub*UWeC9H?Z|3N=6` zULhG1_Ym$YUDsHzP^=KMsJr&oK4v#Sw^JSo=-mU&`a4#J%1z{R_v1#p=W$CH)e<27uHQ2OTs9{UX4r9BAeS3qYyQ~e}+ z;^&C$f>wG*1$v|gqZtzG6O=-NgBO63zIh=AKq`-oP=I1B1J84k=mX!=nnnwzOhBzZ z?4Zp%L&d^4kzO(y%@7u8@P`F*1w2|ilU6iso!C!y=p~pO87tbBiRGzN6tRU0jh9nc zP889!*~h4)BEA*bO?@`o%lad)KGl>$ExMg-UaF_EP4@gbM%)nhfd-sJ;Ldk;0|6;> zNh}u0&emf;e?SY9LOvt!WLGAob>3xjvl88!ikcdJdvvM66w*oAn1(4_v`&z!O*~Qu z?gCdjBj~QEG?b;v+Whu=y=T#|vsao@t6aBvOY;hwwWKAGs!&47f=V^t zrntw$a?aUvC7Q{@yL*sDp=il$`Ul9I<&Z)#yZ>s*H=G9&0@{%>R z@vEY->Nz&IBMDH4-3`CJZO`ZPZD90NeycncVoF8Z=QH`(RIgNg;m5RZ%kzQFBspTJpjmvAbd>cG&aD9|!cba(z z%N#`^3m}u7jyS41&pgWqV59I>5Lv=aM}5-BYr)XxY+zD7Wo{#X?N*-SxwMPw_pf$Ch@c8FWM% zi=>fvE9J^;X#y_tam6m5v)FLY1V&TI`W~Z98xbk-@GSuC6mJgiA{r zXv4{jb_02SetqNbjPr5J+(y@4TPD~a|4J}O{HDr)f?@z0nqsw>7Q@|m@z7mpNI!SN z#{~#F{+=UY(C$NJ+=(@Zzyl=DO;GX+3?#*+Vf)DKEFDlK9Xx=gG=#HQx(_O>MWa#g zbtG1QnKNut;+6jTFaX)4`O=o=;4=#o4UN@(3avb6A1(gK(KvPs%F|V5pR`z!svZ&2u1bZO1`b9gy@|I;|6XmQlXD>8nM z?gPE;$kR$d_Id7SZbS?wVv#GVP3Nl)MY%o^$5I3tU zlKi{9=)v((px2SQkwvl2cH2}MpJ)xockPtnw+5ve0bx1|E32N;>gDQVll$plvAFO? zqbYd9LKZ?h!(7MVxn(aeFStzDgv59zbA|hd?0tna$Zt-1jpFZV>5WvhL8?;}Q6&=> zeg2hP>>kw<*N5Zy5?hEDA|b8M@r04Y;@K$QZ|?6sNE+RGnWX{?Bsl2!04k(8Zm(YfG{7+6$iu&IXO{a>u=K}iI?~c86_nD8a zB@)~Ii3Ox^n?mL5ar0Kd4T5Z+a+{Z8eG^hR-2he4rBY*&tI0x>?>liS-18lV#SBvr zhQs+@4TXX46de*S@kFMnFq&8H&t%nDUGz5YnEEvvg^5eyk!Z9VgET4H)wEtfy9)JtqheoUry8d1OgSZzJ-cLm7y;o0R} z01|<0U{$~-c@Aj3W&o87s&<5iZ~=ycnJ)H~6q*BR#-9B-1K243T~kwRD#JQ)4C-iG zX>U1^io_;Nk_xR-<&_auM6R-;8E8hN_Yefd#H{99Xq$Z-6ASH1lIG$A(0nH7%bbj# zaufGXBRt#Ee!XeqEM5LO*~I%euh>7VO~y(Tq(qt?H3uEXu zbyT~~(W(Yx1$#uxWbA|L&U*KIcTtnsG_7R7v5~J4q^p3# z<#tGcTkU{8W6W3oDZgY;d%%8jYR6kIrv*qPAi~2{S5$qyTUXpCxnu*g2M13g`Qq>% z2%Y;NmCpeMW+&mSkkDmqgQ35i!sSaumrC3 z5+%A6DQE~656wT4e|iWzBGzDqM4-g6?7-PtZ!qE6^k5>kw*w=B(wI3xiq&>~v7kFa z<~hQKiJM!C;{rv?o4k|7Vy@Epo?E&aRc}Ax*$~hbU`Q)+$Wf~+f(F>6P8Yo?t(V>3 zpj+>-0BaV^6Sr%kgP!JTkV8;!W1Wh6$R0;u8h}6?9!BlgbaW6_g(AOFl3q0e#3b^q z!VS(}!QbiG+c-WD#3d(3F&u}>jz&#cuU+5 z5_e%^p9L0qJA(*wL-?;ECB8$!x5KX$sFWkFPer$Tvfp^i6%cDrN0qN6T^2uNvW{tg z72J&8udO|1XEeBIWf?u*KwRDNKWCgAFVjLg)MUI~Q><#6_1L0Pug-UkU-$7MNy0}? z<>Ya{(<>){CTlZ`9xP~`%KXyabk{*t$@~}|{_p_8Dx9%SWi}>{MvY}REJmid9%=Sb zE|s$at?vTGf$gw!<-buPc+sa68ae@GD{4m**)`2Xox!ZNxR9llhd>#LbCdxShH)SS%foCL6&7s_Timj!i=q> z+%g=!(Mek0WNPdla~qGN#5iHKAv#HE-ON*@;BuhhIb-cMi`7R~ZkfQ6 zr(Q|_{NvPMP>mF@OQ9^*ZlaLa`?ty<`0P3V(^DSZ5d`3!z3FLRc3jGcPo8HS%%h*p z@yoe1gMs!9N@BD-Kl%x5I5#T+mqgkC;i*!?*SDBM7R%0_J=TD%V2Hnev3xTM2k0o1 zlyp?9!Et}NoFSIpSbS9Jb1W_Ba<%`Q135*3Ecrp-h6iB>JrV&IZIvfU7>Rm&C@_JY zi-KOR+*a!1eA|DiQO$;Ds6KF}_J}sF>p8mC*KY5`RulVcb9nJ*I?YZ+A?AJWOnTFv;iC8lJkOyZwKv4TV zc~mSxlf~s$hWAOk$c&e!P1B3M(5S<2%-9tH!T98L9gbw6f)Ljux< zDUbkb0(tOt}4LMX}!Kot^7jFVA{}F zzcrLXtnXt_9Ekpr&0W}cT1xctaM9(aYga;f^k8eWKsNhftTi{{$zpsnF;{YbCjV}w zVA!VI2Ka~i>s2__L6+i#R5tx@G;CHYE>)J-=|%Aj*xc?h6(tFK-jW?*IPRc^VtY98 z<4507(WrsG42QFe%=#UtK=ME)|BuS@M%+yft@&Ggh<-3}UNs6T|^E=2Kq> zhPqM3)cH`oh0f_rE!N{!^rx~@loPfZBSihdPI&(=U z=V0`iTDfkc1`VzDd>Tjx&k_iETUc5SXOjRcJaSN;-nMQyzVfui-QP$~c4c{5tJ}S! zNaS3&Iy9Btd zu;Dd9zG|J$^83J?^HQdD1)1y`GbN9w^{IpH8V7`UK8xjx@~i;kk^9hJBT=UUQ?2?# zacs^CGu)XCmsrE@S{#+WEIRN96Fx?~{b=Z@*y2CxJxW`5WZY=UtB@$Std^X0R{i>k zWHEo`Gv`^OUqS-$kEvYs`)o><@VN9;qQe{+Oumrk;iNkE!6RypD;|$qpNU4>Q~S%< zkHBuKMH0#7d{v-y8L*drxj#NW-LrLZJBaYCF5?s>rVo=}`t;tjYjaH>pnqv;&sW0S z24>uxd;mIioqlHo5TGbpsN!%cIY?BdU5zD{PnS&ol!Qt`JTTtgBH6E3h$h8i0QcBV zn0sJh+1EntIvc0!)^{g0WqMRq-XXF#7#3T)Orud_bvBDnrQ9FW2&iD`>gOKL*9o$w z;4Cm_Iwy%uq5+{O(;kxsMfekk?#`{m z%x{yhicau0(4hs-CyV@f9s!9Wibjhs)@(R}?$PgQsrnJ%rxHfq%U%;>u}4QIC53I& zu78T}0Yq>=;a!Z&AZw#yk#4jdduk^PVq>Zcie>m zwruE_C4Es(_o+x1SJL*jA@7LWiJQ?x+y)<8oIqf1I&h3PA5rrk=C^rZ=tZwSd?H~b zD$+VE0Jw8~T=U>e&Tn=HfkW{lR}<}T|IkxABt9yV*mes>LI~DnA-j@Pv%y`2@ ztuo49(XcA$T4uX`Q=(Yw%F!2(9E?6bjp(o2`H+3_7%t-RJs%Pr@uf{sm~cPBB@;vP zfS`!pZkxAo21r|y&=Y%GMg;j$65Av-pSF3`VE&0>>%7VONZsQ422NN(C*ohBYOp_O zjhFWRfBgMN6x`o})xUtQ9Egj+esAP|13Z6c6cSNaSGUWD>-d}Jh=XT*LiZQcC;)f6 znC$e0{_yuP@g{)%^H9P5r{8Zzw+E8ZM_2B`^{>nK$IDNX!fg(h2Pc(3+O~RWJ5#?j z?O6^E{;+*c{)zEtVuvrVslatnO*97?JSY#b=w6#^e3Jqd&-sR){ za^oL}49NOiINj}K?inKNao()ir5am5h!XVl5ZAHKO_6DfQiOk@DBO)y#x| z*qEl)#){>FEknDSedn{@E&#p1%_-ayc)HNJA!Q8ecT~;6Lf(*CTy6HE8-uri8 z$7X*xU+SHqpkU9hLX9HLPI$PAE{@QZh)^Iu+e^DLsrnB-VX}Xb~%&9)Wdehqi-`Qns0&bZtW^S1^;**9T;Kv!)V5%fLX zrz!8X2sTz|bZoT#hsj1ZaUwk|N(6M$#?bLi6Xny zv9-8fhvz`r8p@3R^I$*z#%#Sn2_!-mLYK#`090CmA^hg`P}cERx#%H$WwN*^VvKke zk)AzJiz=&B%4^4I98BfS7W9covDmwBvdJ@YI49lsv4h=Waxqb60Mej;V({^o`L0(< z_G(L#XpVkGWMU#Ymh^Xx_>`u*H`r)XdEemvCNXs`fP_t|WOW5}rJ=pKVyQ*z>*{_z zF?H}u2|=OWX18ZHGDZNW?h)a0OtajWpd&jEa;6UTTkYk=p z?!*g?k~LuA1K@_MQv{-O^415H?P}I&6=IgTq+>3(?RAr0&ZVTo6}MNb3IX=V{#X@) zw=(rH(mQIkA6r5~f^#RYQya)->~yXuJ(Z4~}r(3~0?KaYb_Mes-H#SAdy~tGhvR8C6${W6GC}aQ@%Y^a=z|+}5u`{v2z;8zbh%@T6 zAyoNRZebXUl#&=oW^?@k2vj=;?l_&z{&mvvucC@-aLV#OEwrV2)jDNF+9i>}(d=5% z@2NY$enJ6cfmb=4uX;ieS3keNs=?ymf7gWs4MY63$)5lL7Ae#wsK0yl|JXkKKeH{o z1Am9<3EtIh7cL7Q9~3C_xet_-kB4UW+x#o&niKwK^B;x?4-NQfetrrn>NaR-1Xx(% zDqZpLw$LIOnk4Vs;KLRc{IL%N2`2qHZ|Zsf!b8El{6dwXU?@cy**PMZrY@=oh2|C| zZ;egy;X^-nb&+W#32tq@X*Ycf6h^%)>^B7LF@%ZvKb!kdr%KuN=(cy#Bq6e2W&JKo z&s6-957QyT)gu*zh@|*}aRJNnnq`Gnl{!4ALkx@Y1*Q4I_Q;&j{&j@!rxxS$Qcz*5X ze(+iSt!8=CEu<=cJ^fbhNLPJB08nPS5rn+QG4gS)NO=>ip}b=Yg8{1TJXrnd_bOYsm&aO)K`WV& ziS6>T02~0rE*1%wqxfsL&t-zsoZV{O9Zf|MjcR$hL3U3y=5w{-Hn_X;^uv2J+Lh1c zj)kfSF{MjYg$mIm3r@J=S8DC}>GlNog&MWNcO?M)AZ+{py_E8Gp-Q=<`Nz^dZrq0m zsf5y%Kbho``6{smE&CWwQ>Jks7r#>kDI#5-iu{plP$_M_#7*S)@eIs!MI?h$mOnu* za0_XFvoC>dZZehAgUR8k0!V*de4w`)A3y>mi`l^BU;(3%q}M$J0r_6Nrn{#n=Z5^5 zkaRSf^3Xx=xu+m{;57yp2*}qxlmJ@nS$0lbHaY@8$W1hNN$MMS%oqEzXY2M~AoH5d zfq2UUKljNkDk({;Z^I+gjtdRm7c&jckjb#v?2bm`Nghg6NsiBJm8O-kCr=wBqnEe9 zPIM3!9hhT07-2fr=OHQ)`P{~xOkNfK(UvF2JGF9RrNtkfH9-z_NCL@5Iq z38Nu(G>rGfpUIw57#kH%34C}W|19?~ag(A*m(xA!c<;&j`mr~D*fLs8(@q5WD`J&s z?kA5b<&yprTHd4D^>pq%KjKteb6;h_t3W*ZMsmbv=|Tny_->%WTa7&A0kzYCE*NS% zLhxJW(|NDie6EgbtR_p$S&l(xLnDsicZM0}4|(9ep~=mT=T<;ScDBSqmEnC~Y#>c6 zg9}=yy;ZvI+IK#D`=&N;fD$@uzt3jl3V3!GhvRfW{OMvQN9d>Ge$Dw)Xll#OY>nw7 z`&6H1O_g%y9TSlr=$F2gA!jAP{1@IRSkC|YN?UtDMy;0jNrS7Q3g6={o>Vy`$I_+w z@@X}mkTP~aGQONlUO4n)@`7zY@!?{(IbSH~yMD@9H|nJ4;K(6}2k8N9KyOp?J;# z;YV^400(O7-*3lCMmq(a7goVbEE@Tm5^jPKszs3=9m1?X}2t zA$Uj28UA+i1|;msCf&m;YRqwPfOA*1*5P_R{vE^DIy*2|1gMi#nGGK_&|t!70v5T% zXDaoNO8}A6t{e;(q$IQAR+uPJNy$iiy6yw8(^P!&1!BZNvJSE;CO?mdl2X|PWA!?m z%M=t8SQ&Z8zJ@(lY4P7Dx=54z$YbSTvunUwfH41e!rUv1TN#Q+BZsh&ENEY^Y?Rm;rO0IxZr(V#l9GIC&~U9-Wl z(K&P8z;mui|GCvJ7I?nw+DA!1+DQ-MW@`yHo*~=!4x0TtnDo24hJc}Ap-!LKgXMQF zH=;@3AyihqW%e5T$d$8>lz&|`Yq$e?vhQ+6aJe1TlJ=Oc2w|`HW-19|v0YwcYggKA zclM6fX?Oe-8LikV^dMccy>E%c84aC&%eG_ElyWOuoq>CaK~ zq_MoJEGRHk|7f<3RRV!Qvo~&%25B^J=fgZZ+pIaR$K%yw*jO1~GyD6I)LaXHJ%e}L zu6vyC+Po1qP33A~a_O-Ez2nu5ZBN_mCMD~63{(^|L(|iX?!sxQJv*=+2#6cx?XLct zp?KokGm7F60#Ja-?yx$~nn2^;59M_2v>avwSFKi8X${whM_3tT91aHa_A^Yy!R`KN zfmPIsE?^roylMNW?{oP!P{=^_kjH``HX+RNb_K5UXwgM-ywPUg9oW|*xV+CM36mFo z#BWS-9a^-y^XNRra1lk2Zvs%FAe`~gKaq}`;;-*%%G~c$WFw88Eaq5+Naq*G(d&Q! zl*uvttJmq4TZkW%%`Po@M2YUS0*T8caDi-{JwCmZGMT#GfkC#0%oXb1 zKxU>spp2aUZkINfBErZ>JExHQ#x04-;}$@a7)gJuwq2@mK~8z`aa!L4aV&>GBS*7I zs!Z`x%nj_u{TOQBUXHsj$ZP5NT9W!%?0d?+PpDk&#odl^~ zc-_hvTzBC6y~P%2)1|_hW6|u0hg;5DNKOT0_o9WS#;Spx1RiS|SeHfu?=v~C*y3f4 zs?RMqH!6`v)&Il-y!6EY8mC;*bXNd=^2NrnO13$xz0ibjVzwUu8Dd0=C;||)xq@N9 z_`Kz=5ElX=6gFPr%oUirQJN2SKNqtwFiP>8E;cvkBpe-UdPg({lE}H#fy#-f8K1-ZzMJt18=Ti*TtGRk?@NeX zs=~L;M5}A32k?!u?JDxg|R?;3ZA{h<^tU8tr@p14J^i({`-yj|8%$ z<6YJ&96F4{h3t19$e(Z_=N)i<<{?dpeO^DNX1rU9_2=@MBn4uguK2hAOYym3}`c6SrT#%u{S2l8T_+w%&Xb_+cZkX)^3d$!(H`*YH4 zV-54`X4ig07(3YSnSLmv=47%`V&8KF*&CADtWctGS})%-JFhbN#$>$@oRJ`*-UI|B z*L*Jbdk_vPx&xQpPrg1?R1*iFV$a_Pnx<=zm(JGJ#m&y1Wd{N~4d4GQIK8H;Nw3eG zCvPeGZ1qwIb~AaqO6ydG?vKQr^xp=dtrkPm9}wl{A^`E=@#QJ=8z>+qj_B zn?C^2VR!f7i^pqR^_Qc&C#s$j?+OHOg5}y)+Afopm2!aru zh~7J^M2i-^B_Vq6QKFZ%k?6hm=)J8K-RdmMV%<&q?sxC}vHQHwvpe(7oHA$5obx*b zc4iZ3T!9{ZtH@t-3*x!LlvOp`>P+_>4O`LjIxMV{7(U zZK0oG*68>B8)n@TZ0kpG=hv&`v&oC;`(8XGi7bW&u8$UCqQS}366~Hkp%%znTHcH3a_rhpPVTUkyx0c&+fl|)D{{V z_G566q+0GEWBNATeQI+q zk~na3*7eEPH(!rrm$o62e|MPu^0oZL;hXvbrX@^=(yP}PgVGf2;o?tPu#_dZI7vG? z2JIc{6I*QVBFTUKA>TQkhNMU{m616fp#AhI^OoTaL1eZjaa;d1e-PHV{ghft3(WCb zYGhk@+w=NHA3nVM;eV23$#QrGhJl?Vm=iSNv}ble&-wE zCFMj1P`YPs%N@ZdlIZemIrL^`W^3Ea%gb9^Yb!AIdY2^GsC3J|SV`-1iDt|@T{j-V z98(H#A2%XN$sxv!3aE>qiPRj5qFofvNYOlvB7++A3uKZvXhXKuDb|3Yy;5Q zROAu1b_E?vOXA}6sEOWJd9pDj+Tey3)0^e+Zfj=Ot;K=$m9MH{V6gnc-9HWtc`+#| zGBoV6&qwTUx;b2aM;MHxD?Zp?1L4hYPhp8{H?cu8-Q7&Atf7-m_V%194=m4_2$hS_ zVS1|WlwunPBut7h(es$HS5%m(6Y8x5^%)W2d_oD~8JV`oKqcbGRKIU~V$}uc6WHFp zzi0WqvWET?^enS|d!`vJ$;#n4Ut^KYZ`}_+V|0gm`61zK=rYm&Y=iFho1(MrJvJI~hfm7oJ5jtQ)wOq^oSLlMlw{E#W zBS0WKB*C_mVe3-kD`=LO5B`ITk6N4#goF7!MRqbz_QE2Pdb-2dNXyEey1K@tQOX6F zb4LFbwB<&5JAW1Pny~UbxsKuXi-X^bQD$uF`NY z+tO?^X5K>Q`{Komdb+@_N@eD}&o%Z-8KOE_>{=ifWFDMFizjME^2Dia{Ar*=NsgZ0 zcTOE_2{5upQi3+EhuHN^dK@tIirgwA#TVtbliYEqb&TVj}l^ZoT_>8n<2#euFUnQ`o)fA+V`m(1!;EVf! z(lmLbff|#LH~qDu0QGQ~21iCJN~5nEFIY29KHxzw<#`v6F|GqUBTpdCB+tTBnXLs8 zQA`Y-gg@#k;A|NCSs^HDb#qvmJiq3jL~J&C%`&!oIg`_}psMr9>FJi5;+lDNnTT*d z6LqCMrM=0P@~|%M2*#RQdQb4@5-yg~5)3VpMfs)qNN=DCo2N^NET8@T`kRw1SLXC} z8sPV2uxbt_(+44kr2$5|!VY*w7$hqVgK+S=%pO>{$owL9p&!RUSmU;0+QYsi0;fM& z*gUuVY^?8a8k7w7k@HpPc?)V-TC-R1tyMg5<`9D>5p)uRF&KpUi;<9eS6ql~d~`|NIQ$&13qDpNcG-r4M+EK((p3JwULUL+HKjm(;qGc_~e(l2ij z0C0?5-}YcnS1M%Jw$MQ>nO;bHsZ^_fC(!G9viif^G}s`VoGU#svCEh;EG+D<)6>yt z#=D*KV`4N%nZ!PNtZC0-wW;qW(N&MEnk8rm=)`@`(Gaj7iRi?yn$Ch(@HR{to&g01 z78iL;KuLJhU~F9~WaIOlW^4WSt*x!Q;(JC$(1w5;asI)!Agn%G3I9iE=moo^+S=Mi zpCL#iLRv;fVN$h3y`ZlzG_&z6nL|f~|4S{f8k?P0nQqF3#=0C zB9?pL{P$x~*HHE2Y2VBWUV)*iUj~1s_@}}HGBQq{r&>ag;m@Dj%w-}9^7HR=4a!uM zAGqP-;tqM5o3FgbC5nuuD>NeGQimg>c7k^)`Hr;I@T5pIR6^mT47aEfSj#-9Y-nd% zF;+quqM!cxX!Um6ko%r!PC>#W64oDF)@+G zDkUO|Nf=GQ%|q$KhHYA`(m!~3kx+0^?llesLwEwp^hKH?pkL;kXgKkD+X z3w_kulZnDZrcFGikvpb&wQ`kh*O!QK^$B?_{)zj-E}H7<<3dp1)gM3F8IF#Qh-k&1 zu%id4Vwlfd>U`{-K^_|RQLdXWNy^4W+FmwygQHhyrs_Xy#t`j^>H;d4#PT9lXAGHw z!n&WMOc}8_{c2f-Kx~8gIhF@R5|KbydmEEdvZXJvjtM)Lpj@ zrq?dx8M|pFt}i40lHwOpHVv9W4f|9%*qWh-ZSlMoB%I)$mV2ZGtQvzMC~}8 z{aU3FA*ifr8d7_kTM=6_=ujE3vvltTBCPj&G8gEpS}IduSTH_?QIqF4v(6ASQz<@n zAmN-3Hl#0tP>L~bhju@5E>>jjDqty2PoI==TgYDiC8ECxkUi33c%3s$0I0X?Pff>| zZjQ*8S4f+moqf!IvEO*Gy0U^i-PzpUPD@Gx!Y@7>^o{#-YCML9ywDRIOki z{`>=85An;Y1P$S$(8JKgL^3OJaT?$7*#%r2BRnD^A*ej-sn!q{IS|hF{BIFmDsfsC>6Gd@l#mJS*!*z!Ad)V z4)F;IN{OuP#-Z0YyF~bnNpW%X36#$WN}sXuhP~~=6ZJNDkcwndD-D^I_zvjo__vXl z-5WEU)W_lc=bF;=g@@WsvbD8!t$%BQ0b#9Z?LjPw)kdBwD<3~UA(%_MEL91Zg0`?3 zFV_6;g)W&a&6ZxihgTR9J&)`=YD6bNs-}f%M}~vdrqGnryv% z(bmHmS-h^~9FeSqRV3RzT27%o_e~|4LX!R~Y&_4i#fVG_A{-Z06=Ee)Gcl%(WX{(5 zNiAAvrant{;u6uKnYS|K{Rg*;<8>@7bg37C-tQpFfF|tBw`A?QuK1P91Yegp2Hn2A zb-bl3OZBvB+xJf-)mK2SdQu{W6>~8OhJvY*R1$_@Gw~z6D96Qx#*1b87uVN3PaB_# z3JWU?!tB>6qqZJq!_4SbV~)}D zWvbLyp#^Ju_=^+?KfJd7&w#%k3jC5I#y>duwB$%*uTgIlypAa4tvZ7gz7%qtC!wNB zPfA)}Sy6BC_44uYvBK1h#M4+2Lhna{&?+xbGIEF`Kc@9LObFRAO3iE)*gs(D0(AVI zaK68u^uH7PJE%~%j*jEurG&=;PXrE(!mivz;Fd1pER=XiYvp>{K-N(C?}!=0kRPoO7asNR}*{!$4I)=qd`>eT88X^5!M>vJ$i zOHtGgS6*Z3=h(U?=5$ zGtEV9K%Gq_%4u-Mf~BlOvS}Guz4To7-!}WM0#@$6|9A`|IVO(a@x+*gqJ^*-7}M6) z76Su?fkM?f$t`I(r>qPQbEBuJRjTQ*wmnxI$6{+GSrjDg*|OJVgJA?!Wy~IHX!0)S zn#l9fQpsIJHMbGJd#F)r6_nMP70~$K9m3?HI5056x*(j`=%WIR3@j7tRLs}*u7UFX zIVg28dEL{FXqqB{mst~?%mmtS0u%6 z4Hx0UF0kdoSHxlf3120ejNIs%{?+hiT%+m7luiQ(i9T!NLtGyLV#a$Vrpo0lYa8Vl z@OLHtgy*MM**O0WFpbHDHLXB<+mu++q}PL)&73f)i=iM4Cg3BEHTc9og5X~}?I)>5 zHlJcmhf!kcjuIEVGYzSj`W`XGY*ZIZUu+#TJpkax63hLsY4_mBH!)_Edh6kqECdX*D!#TYg`GZjh;7p)6pTxa*6%7#7DN#(BA*p)M z++C%ern`r~^?FCOQmVdU2Q$&S2>Td#oejKtCYw z{ck`-z%=029Rt2wjnAnYtP4FHgc8rE42syQw{M-&>gLc}Kl?h+efj%<69^149-0m< zu?T!Q0)>_8H8+1g?Gd1O3AOma>;dO_@|blnzo1A6zOP#FwvwJ9!0NZf-9(k;9yGmR zt9MhSj6^=;w=nvgmd5b$^b4QZwL$9IH&a53z<~P_?w!++wJMuwDy^Jk2lO%N8p zy4Go@WF691&Qpg@0dv&{kA?U2g-rN15h76wOk!T8^Nfd~nVDQZIHUYt@HI46H`W)( z?Q0>Jney%`-n|TVQ60Gb@>r?NguVcX|K!M^*?GLmYYl#JHDMA!)z2A-!O%nd)Hgok zg5Q5{6y>M=k6|{v3Tyjv`qWivCxy+53&GniB~;{lCcj%gE)g4k)E*v^cD6c~OH+Egs{$*t5p9jKz6>HdAn z)z`|6iil8u!hg<#t&(3_jCdOYaE)5B(9=j*cjKUq&n2xvj~I9wA2`=&E; zx;$#)|B2=wPZ@sC%V9sHs6VXfU=g_VQj8^v+NisL1nXirI6@dvkTxSqpiBFyc8~Jp zgv>e4*cE9|Yuihg;J-CrkM)a+Ur8cwn@YMMIhuiWPo|<$J0h4|@YC*3w=66A2kW(r zH5utpYzh&AnVb!}mX@4;(CIsu7YYvu@@^~WdRj)ooQ}F9Qock0F?ozguW@5?53Vl* zFB!AuIIPywhZ2fLMg|8TL3?D?Ccyer14$ViTApMyN|@)csMxA1c!Kqn#E$TJIk1wo z8f{{`&@YqBq3?OeqRiSlLSHFoJay+rP*3|bN;cQVWQx$e<%lN_Kp34%HYPifarB_s zDRAcgpf^zF8B1W)fYFQ048oxcdt}|4_O=5?%F~zSTsQrn%#Pl%V`XGpYko0I6ZmdT zt$+DM*sH6S)NNHII(o{G0~%iU0<{hjlEElr^Ty&4Q@X1`Nz18K@u6`6bT7jPCCq0w z@L(UYzvKmTC_bvScn)lLk$dc-9r_8g+|FaU`O za256uk44Cro7A2q3q)+S=9Pc+U5C_s4>-DWbSDgjk)mIH_zOA;^0yH_P{4#tP&q*liOI>b;-qLzU83VZNG9U zwYG!7AYd^fBUdKkoDQm1w&gm1+CQ zE0bvv9Sr*o+Rpp4IWNoiGxzKr3WR1vQE%6XNNe{*o)0J9v1stv?wc%iU!6AEyyh`# zq)d;`&@Xr7YN*Nf*t4;-$a5FiBInetfGv+{xRp>(mrpeMuz=&fpoPAmu<+X=Mw_=@ zt5@&ror#Onxf-+Wu~lp48{TYkw9u_X;Fr-5-K+);?~Rcgox}r=zH0T(H2TbxsfZO4CS0+UAyt%Qc(})Q?gz=gS%Y2 zpY#}cpz5x9ELu_PwR$WghM#*|CgdFC2vG4Tkm2#>{9Ypwiu&|xmYjn~wPU7e=uLo? zm6Zde{-A3cpW^)&^h1kQ^|8-V)aBU)UF#>OWDhC9IftYHfI7WN(ff0G6~VM2kj&Q4E*!~a8Lw-4k%{4N_Ke!|s@k7gSh9Xa@S%sP zbtB?a0>BEE^WG3(GB5=25geU<#xd=fC1OF07%{$`FQGo1=!{&;t1$%7Nw{ahWZe!GbGb>WmWo7qJ(odG?U<581UOW=0Hscg> z)D04n+HzW-2SZ~XJYD`iBI>u8g}-dUGJKP3vTLHI}T4B6n{&o+gQ7z zc7M~G^g)#h3s1f)Q{qj;}xDZKdtlS647c=9Eyy{;sBMmgUaAA7TF$RdU(2! zcOaCGRZ8?gTp@t*Wco{Lo`AztYPSD^$Ky>}8WC^UR#+t{`CQNkF=z9}8E`0iOQcg{ zr|kn&OW4<&c;iCF6BLer$Fv33dfv5kEeC0)>!v^}-Q~fHw#-i{5xvi&*d$Oe4s99S z=K&lu_Ifp@r6-^6g%Dn?9MD|mS*)Uj-L8(OsNHua!^3=1e$W2bq_C^9e4fq}CcV%fX`u^{O5*FeH>{0!gYlu|I~C8}4$XfT|kc zt_6Cp#uHflKKk}1z})0r$-$gP4P>@f4WdnLC6y>R1qA{+iqUL)q^4{SZHJEScTsIc z%6~zJmRLc;>+^%QD@L<7xN~X6@oo>)+c{~uoBd)g?GAhtLHt-Z#Xt7m0qp(o?hZTw zW?iLQbqcGu7V9ZpIOy5JN^Su*;Q^?xeoFg?xBXUJ#gv;aRs6u-&zgeYweZ%Pas5xdQdH>T2Zsj+kPr|0bp)%koU=bUqf{4Ip4??Kk4W=Guw1`3 z31l+d| z38vQ7V~f6}TZYw2Lgpt}VhSYufgK%AJi1qlKY~BV#v;M`bM+NUGPF5L^mkd;L$LxC z;$Zt6;=InIq1o~-2{+fpl3eKmV}?q((Nx69v;Fy8Jr(VXA9<-VN;fO0YU*}$`S(E&qpeWra7 zbQe&H&Wlj*hFw~xM*ctg=oN*H26KzK)vzD1xZ~N4US3C0I8OU(zP3bHkQzjQk@MXZ zXyzSTx139aZ#=e^Q3hMLV)j80O!%8rhojg_?EE}6}!w5D+ZZFMNb$Mwv@5m~9Ty=3JYpq|1h ze9xM<<5l(kAfdQQ*8@q2i3;8w{LQ&x+0z|+UEyp*rP!PEu0Uc5zEjPH#NadAned$( zG{{k{?fTFpTiwIcY8OtU_~Cb!{ZiE*I8Y&-AzCL(oaOOmW8c0FEx6|qoS`H9m#G!?*eR|HJR*LJUzAwr z3SlWrSG^`hGj6U9n$Q=OmgeILXndHH{gxHwj>M>Z0_(7q(zsb~T!4hna?*fVUJo?J zyLg_0ZMNLohDO2LyQjuo$y4ITQG#`Rsx{R$KKV_3v|ZEOL{F{bTx5y0^A7ytc|*4~ z4|WK&MX7)7l}J^Aom503wz%)^(GmdOg%*kz{FcBi+}=^*%T4bO}Aj=_N*{vs)&8!XEU+Hxv+oS6<)GnxUw~ z3HR)*2Mu3;x#QZ5=Yu5DM)z#h8yH|DBQ}s-QqPzq$A`T)H6cn8fBVH}x}cAGA$A{%>1KGj!R zcemz!_9IBS$h}DN%;B!f9p=a}T7>I^=c|C<$nnbQ=<)IBG4Iv*IK+G(!vT+?n#?6q zlGGT5%fEU!zt!v~7k0}p0guN|AA=+S@;~+&KvhoXwR-sY_+0*S8w&BxgJhN3h-NGA zL;TN`hvTTEqyzu}tgNU`4vvm8)6>~(=4DewVO8>R%8}f7h3dnVYMz&;(n@s5lDcGJ;EPCdgYSVyNd34kgA(a{>Pov#P4R!~>pmqR z*atFK)MU*5XExuj0A(j9rz9`xI;bmi9j*J`9iJo_gY@)?&hLBW!Zldc^{u~WL_%TH zRM?QTS+FbDB$#~uQG_ZL86F-^@*36&z+8=_Oz!T~0gMcd`KKT>WH7?rga{^TO%Aix z?g6UX=QM7=%QroITl)Tw>bb{HQDR_D`!foI`dns^S$q@02>nm83U4!aOp)H_{YSAp zxB9vQR?Jd%Sm)u7wbTl2t=6;cUwZ#h51=SGx_hM6#6Jc(IqPJA0s%Fh~Xk==rZz_gSJ~RER zQ%d7vqY8qE)lg?LQm~w8RX!s1rXlHpN{4)Iungs!zR&lCt5h}q`{o5@C|jVM5i>$w zNEJ0dL`me;5;qEhpDp@f8#yNp6-|8SMB!{oo7QCgzSD5Pz11hmHCQ!rFi!tTVub+)!oL%>T0k@Dfo#Ecc0}FuQqHYB4&S`~ zSb%c!yUEo-5%f=`fRgb-_W*FW*9{F?#9)45VJ{W!87++yhKNccG}wgFXQ}?Y=|hi2 zX+moKW`#fg-32QnVRwo-|Mu%YYjx7am@v9j&6xup)& z4)fXj>}1=EbNpuimGa(dBOws!$;i&$2`(Y)B?kjmhQ;b_u4 zfdVnJjZH)7wQqag{C~&F%0(?&FnfKR^$b1HjFOcy#6XLJ5<5Xdsrp!v99ou|S(qKqVjhF-VxY8m~TVvXEFF8-kyb0G6;^S$dfyn@v zo1i^v)t7jM>cl@LA3pqdiBE=5($ut~eIdZiB}S8a3~V6(Jh`y2+b9n3o2uFvyo^L- z8#p*RbUiw-o|SbLTloEvQ6#yzDmgm^UssW`8=JBnpO*NlCbTUtye6il!*r~ALviW` zO35u|QP4mTXR)RsMu|mEL|$HM-TlB=(9lEGB|(X0TfM4k;MW0{xu`upz7$~X8r9(X z^$a>tegcp~)15xSr$3k93R8j|Pz zE{FTU--Ays2d@W*2s%sOxw&!NZ)~OtGubp`tR6k)^-9;4o!;#q8r-+U?T zzhgsCkCxLbC`#p5qke)26O$4(OwFf9%aWsO+?NOF&+beTNQ_mO>z%9U##WY_0Y{Sw z-jT;#esg`L>Fmr6>*xC_ghh!W8XAkh#Jd1~zWwnG<>jW+8r`d07XOP^yEm`a4kx*= zkfdLEwXN6TTw!pJ&2+S0u2wZQ1{3z^{bWFcR&3@X4GA7xndp4d@@zN*-0bsvC)qkpu8qLe#MCoW^Zl7Zb@nf}&t`!7Sa5Ug@z$oT znbk0xA!3yD%b8d|MTttov7ycGLVi^s#EqPvESTUAdbpc^#<%`cVFQ8KTly-~7u1|K zv%DIfN`?I+cjBG`Gz$fsLB6P+-EY~gcxj0m2Zk1MbhQ%8^Ig8HTvbY%s!nu_1)T+1 zk8uyMVv+ElI0NhAKcxRG%ep>T85f)>QGWSksMqiAYo?@ot~G9OSmU&_>%8zH=HA<9 zw!4L;&b{j6%Da4czVCjE<#vq`CLUR{N=-p_Oh{U=3efv#Ud*;L7_CE;>(kB6QzDo_ zkX=x4JX)ERw{ehI^5Xw^D+fWAL@y(Whl9>8sc9n3l}V`_mU9&7T7*q#B^8T9N3urC zohE@zVEW{wrutJwIZ{Pgy4ql(-H-2TY+?EEkgwaV>V#Pv$}*@b*;7)L7?}?u%{CqU z%XX>QZ0{UCZh3ww%LWP$+ zJl@bU(4c-seArx2>nH0++5`1{Xj(yt?!v~CA|C6XQZFTGB}`0+Pv!wQaQO1kp*%1A zjF10-=}~C@sB04Jbvs5!;0l%+b&x|#L7i15BelqBMg92f1izZc;|akiy{OTMY+$Mo^`b(!$>z zAIz4+F8m<6ky%QBxOTALhW3*=N?9S4rB5KA35k&E1`kY+_6dUcmwQVDLnU2yd<3nu z!1sSv(Ue&vq1-Lc2CWkF&NY=mJ9$hz@tSz}Z@>Ene=iQkB`$JCAw^1O=`1Vqak;+$ zq^z)`Er!%m!or5dYIhWYA-jINo2WFjTd%9KtGMIy;**6Hwb=~`5=e)lHEz%~ZeDkV z{TlY_A3v&n40p00n^S4vSNGWpMooQHQq&}l)+>ol)YI2D+Uw;_aBYF^@z-uU@{cm8 z#8de)yWK0RNZ6xeJT*tD9cb$Edr=Zp6=kK>M#89qp2ea@tg*3BVSJ~-o5Kg$!mmSg z@boKDl8OugJZ(I6*qTM@sJS;F2NF}rB0sW<@>;B1fdpjnj~=-GeHWK5Y-EbCI$2tD zM9$&&(`F4}|6)nXT9fxvTMzO{>~BdzY*`)Fw>;uR5r7|XPD4T>uY{z?(erg-Z;yOb z2s4mtns9IO!kipu;?NhOiuMtruf9c%J`gRj zza_X2b($=f<<^!$(VpYQ`KCH3NI7y~rfY0~a2&7?`GFQ8pN*vX_@K>wG8tb{GfF_m z0|b2d!o?h~ zO*h)@Y*qb7$V>vbe9%obC)Vi;D?U(T41)<-#p;Om^=a` zVo$4i+*T{UM7%wlX(yAZQ;;+m?i%c$g%)!+HXrZpU-w+`t9n77k@{aB8a=uSzBR9Q zaG$K9%UX0XmpoAzWaTlwv^Tz9CkpKhGEipodvoZ8wzX}B`BOL~koAcUD2T(u0>wnl zl%i~HY?z%|WzKREg6;=zX};XA%ddAZP}5Z{jx;MEjAN0g1B=M znWVBhBc6Tr&f5x+V>{Az4mQ51j}A&w*laI+t4jvRpDB=6rk9Ax=wzH^M~27Yo8&&+ z6_6Mwj*QUouHv`xpciq|~`_52OGk!{) zoN+pZ;&B8KpN8~LitS=zz^_D0`@~UUMU*M*9qvg6)^b^yl96NDSx=7+3JOqfexS&9 z1vfZ*w}Yh5G9*b+T5<7{v#Ykcz9E1!-VfFKt7jQp=s&a@nk~JW)T^e zr1oXm^^#_~cZ<7IoOI~>0Zox&sAp8Ox!DP=%)o){$FKHP7a(ix94K=^g~d^&=t*Ah z?!tOxcKp;tqfCd{QPUmR^b0bwq*vnGsXNW$tjyxPwAgZRIPSc#VlUcA!IiMZS1!K};`J zT{_5zCxLn{CpCfiIU@fwBqBb)&^Jo{)b4<>O`V>It58?l$ zW71MaCp?9ApQ^~-qH^?zDzDke-{^3ZLCmk=xy_`Yf~b3=|>Tk#4w)b(jAv4^HDggf1b~!x8w7=pe3|L^NhG3GbqSa6lYnv54=W>b&Q}Vh`B7%u!NAn zAqf+k*9!Sf$Q>+ZIBUD*$kTV5q)hrcg^3afMIL-z>3>*(tKHAeXK)0ia${`#)?WC?ly z^=@dsVxjQzDvHn?a|Q9Ir~Od#)wkaJ$~*#hC+TsHb;5{W;~N%@GN8KAm-fr!n@mSo zSTmzdE8LcqNB5Veas#r>lH#4W^X-R&v~XnxsR_N`hd(jvGq|K>X!y0=PSL8d0}B1;cOkE2K#b>S8$(f5fE(a2`N(Pn)Rvt?FJNHsqwQ%Ldq&N} zJN@oxCMX(brISiZLEGzadO{cl&*uxiisZ}mVCh!2H-XQMovBg&&((|Hzn>>k2Xa7h zi7EQ(s-%&T)Zhk&?V7o=SrY~tbpI>6>1KQ__n@dtq&_eg=GS<$iq~;of2Ld*WK=KF z>`pvYUFG=(8E+97U$hjXsfc5Wa*XR%AOS%H2PAT}`q*sFWtP|wDxtwJ)BG`HfgREKW6aDEilS_x2TB4vK=Z{|TDlUps}QR@mqEb`|F z;DEz=b8$=lDjz|zf@ErUh=X;3EXzyY+k)AZLlJ}60Pa7lIub>e3**v z7@e$7=W>`B#s0SxCxy_W9aR_@Utiy@IUDwu27t{3pxeOr(NEU4C+IFE{u&6w{{ktA z)^SHAn6&tF-8Oavt(dVEeZAbU$*HS}pHy)DyIz&+W0Z zQ_tW}I#E!trSZ+@JC57iDl7vJ56^4oCE@G!*z(;=v-Rr6hc1v#ci+nB@ovkSf~0Km z_WH~Ex1`duRDV{_tpm^kAm0O1rTcmWlZ0X{Mxm7U%JCwCBsa6`xPp+2PEb#un%e11 zed@(--*$pei*Aopy)4rE-6$lil=)^3w$3&z1aTc!__B+~}toJ3LG?t_PAyt}xJ0;IMewIQNK5eGcv=V`+(w{#?3lps7ks_23D6 zi~*4vnNz>)^r14AZnx)v>&2Oz^GQB)ZbE=1E= z)}FD%acx4)?h*sfEiVM;0QYOww_}MyMOw;AVtH2k3ikoY$r?J6;%dH?sXlpit~5vu zE1kmfc31LkLVTYLYMM>)xLwI8=}1aSYIv;nY+8CPYXelgXUvGcTAG*%nf8jXNXCEhSGkzJmO@D@^Hdh&imicrpPmO00t_Z2xtx}g_ zfc^R{0euzmHo?2@esBR15rYQ2m&5v}NYb05>2|Xg`IAz7lHH*)J0I2(VbTIenu+GB z!#bICS{>E}yQ^PkVyeT16ErkTwL#cdCuOB-d?faQg)yb+ zn4Z}ProcNUwYgKY+H4e8R~vJ!waFJJR8HTd5Hj6mJy`2*Z!h;-YIs!Hscro7i=cd_ zBJ=*zb*k$;axo;b+3urnyUfmdzfD1@rm{+wh4x zhr#Z}m#3K@?r2W3l(RvePw6@>BtsVWlk_i7uD^as>bG3Ty1D(S@yC1KJW74Mb`o$W zDk{+3@#krGpSX1y;&>_K8uFHV^!08Aq2qz9j?5zKf>V1#F8n;(`Wv6ljW&nXN;)3f zB(Ee3%zJxOva>4NAKKH>zB{NrHVgOl{}u272$w8|951(&F%U0$Z=5bpttE5)Md&#z z;o;W4f8fkWJ7{ny+8;KrKmm2Rkx(&HM^*RKM6Kf1Jgp#&X*RHPGSnO|HO+2{WRbxc zmKF1P(T=Z-PWA|<#ASaMM4cnQz&)u)cbP|)?wIl8$}3k$v+wuO zZxE8!ntrybqMfrsDZH9SEqWd!miR&ki=Ytjv3d0wO0Ur{$l>yM{cK3=8#Xnz<+XU- zY7Hq$VW&eO6u27KVF0~e%3hvr>^kl}?@muE&-)}NC660i$163MgR1U>=n9)I2N)uw zWOSA!+hHT5sE#$vHJyx4$jtoqT2DNDJjG*rk~wGH zH`FDtmZTaA8oR+yQr1iqzVj*qu~kMQtNb|dRP=N}W=11RcbhT_SG%F5^z`fjTNjMI z-#Pfdie5m^J;O}uILVYXUzENYBSAM=%}uYU8Z#k9NE0itJBa9wo`f?b?uL(@*qi5R zXzAF|w&1smHYFF((9*N96MGl(t!}B)W#U3?DpIBRY#&Vk%UCHUaE}RvIs@t@^vwf<}+C?`Y#fysrC*{M6HL_Cv~(E!p9RPZTc zpVg`kR7T*rN`EkU7ia8c+varnkTx(PM#@-r8jgwzC9rOoSd3r1{yY zx=d~W6eNtSVQ`MzUbDtxaENij^i*`fKhQYR2gj$!3rd$*Fij8&hV}d{p;TEInuPh* z*djJJI}>-Xz%MV`@^Z~pVYewI7$3{YO?^}1mnoQ30zQ}E1Li}5DU(ofQ_dj~a27!^ zrW(3|m1GbfKvI?*DE+t0WQ#Da6K}GsKK}=ov>4EUL&42wA*R};=1}-`*}1u`jj2M^ z#rUttkYr27UkPW)th*yfKS2@(4<-=~v8liiKOP0j(b_L@WT41*RpYE%}8jBU# zx5w-!)?aJ=GofKX0`vX5GX1n%99sX;iWJkr?k{tqIN+k@{(*|6$V}7oibNpx@Gy0% zY_+4O#Vb@~hRttFR!!h$qXkeA$mv$xGpagS)er-0GaO|!QV`e#;$j+oE%K%b7vNh$ zkov5nC2gF4dn+y|=J!ED+)$1EwzE^X7)?i0r@T(}=u;YAWg`qBms`|$JtNEO!OJ%n z*U%Sl@9+@vmGjtkHx_0FP};BG`wU^z7aTCeQlH-iX8RaZ7hT@1xY*cu0+@Z3_4Z?g z^W$>UTNoHA)q4I+G#v+Sia~Yx-GVB4-qw!jLtxOjm{-Pk6^v{ZTSLCXEfEG;yyR%(x~<$LT$wJknKk<`k{ zNbOJHCfDZ1Mn+av45wsv&!Nn&Z0<(Q%RtnV=LYuc(KgddDQWtIF&ej`9dq>wL3DJz zJ(W0v_#AzwJ3x+R!bDgU7AGz?LKm-Gs*ew-RMX|fd~NiQRWmL(l|l)W&7I!KyAXpn zMt8$*CvSgZSXx6vS#Bt;uc%7t6{o(|R+yh?BIC@GANWBZrdq)g!@%u#LVM3>`~_nR zFc}t?IT02M2Q&*H%%qguEs!n2!Z?*P0*J0mmDkl%dCX*MO59naQVsF`ebz7u z+1CS7?QK0De7&FTFOD4A_;LP+1?&_DA~Qc%>)sgb^;X8!N?zvIo#u6*MKI^tGq@F` zO7J{xmlH_k`rkN9di1STy`^QS>eDtwNW>&|-HQA92?-i9@*L|Q_#!zw7yCs7`g${d zkfr7zrcQZfw*`-t&{2`~m$!+X5%_`LnogIZp+NNb@V95c8e1zwih+3^j>-(?ryC-Z zlBsGrqzb#Y7x2RheF@eLoyDl-8mu7lU-iDnl*!)!5EDZ`Bw62H} zkwL@ciP3Ggw-UoNP^X!v!(Za5GlS(Ey6j9&6}hZ=M@CF7NXB|=V1dOchesNF6s~y> zo@%tcBNg>gx!;Lx9=Da|BKezq;)27p7X@?PEhUFX{fI?}YJsH;n%s-rKG74MonBGm zr!0JJ{Yz9b8XAUx_ehjWxw@R4kr{cqF`by0R+Y&IS=aDLrt}5PyRv9sq=cY)=}bbt zd~Z1txu!=%8a8Ru5g>6YIVOu89(C$!v9(O<^ADDRY9JXO{z?UN++&|@*3ZNgvNr0! zRv*frOyD0dF;oAN^8JkQ78HMt5b0o%`2mvT#C|q2z}P3`ASDMMJ9v?j$otyV_J`1UNYv}7&ze@U{G}dFcPTD5NliSm-tebx0wSlCtJ{D9e`VEtu@`o`ua>Id#BPt4qew^^3p7WF@))v%U}33Al%vNY-ANsa=Z*%Lw>$~NzCnWfIPmo zn0UOe8UFeL)-qK+yb~xo zgd8?Hv$!};5iYJTj#fs{H-Nv?+87xX2xmhE(?r0*5_#auYh!s?1!*vY=clHI1ZwYo z4icKwNA5KM8WNEnit7cqk+K7e&BwogY>0mYz>2J)^2yZ2NwGtF$i&3TNO)d*4*>4T z>I!q&gXr<`>D4uMPX!MvnSaida=Dp2$&=uGIYbD(4%rT0#-7z!^nTX%Q(|(B(Zd@p zi;{}%!s%6YUT_Ijuu@9-1LHN3&aYK}8XTTkrv#kVf9#Ju@kWWkX7V`L=-w7beOj-# zZ!L#YoU`%sdh{|cF0NPryxu%baF!Y7@Y?tp8zZJW45=Ryte1ClvfQo3X!`2L8-|S;hX3oScjHI&bjc zz)<1UDjN-JsTZeda2sp6vZ^xqQyBsCl`=&v_AWsO)(BCx7kh{pg?>Bc{7O&XRCQ>V z+?B~U7;E0tVcr{Nt3h&V`s8WxRR#+ycdcgK!-Ls4>UxIw-SAm+X)i2f?|6|HZb)o& zXj%MpXw;&p1T&#ju{$DRLkg9cRf&|EuaEV^4#iKA}{Hde5N*K8V<1kyOWG!?NO1o+fop zEfv>LjpXyQ!W_Dz;xfY?EY$38Y>C5-){U!mcL&IcYb*P*MiON%;pD3?2rAecD%fi& zAPdA@eUFaya#6)t9j)vXv9O=2{SnQfWQB?ntAQC*kw}Md8B~Bq-Exh$;4saDPl%to zl+T`PtBBfxWD4(Aic>}2?(Sq`W#;$#mk*~rj<1zHcSkKEFwigFMOxBJJ!eHm-|2jP z&r*Gza9>3MzY;s|)y@dAG?tm~&7kY@(0;JRHdQ6)$U%s|F3(L@`Ozd?Z5~q3JT4&V zvI+{iOsVYag+nBZGAu)x(Pze?m$$x9F`bmwH84lj8LQLOr- zdMhJJKB>X#COSMI6j&9sP+?)*xjv@uC+3^GGO+Im9;-P9jyf8S_LhHz z2UyugPj4|07wbKtpwvW9Tl?>*L=hU@STvhYK_)itE+*DR_F(C~>dncviAc5|3p&ZX zk+F^O6eAs30{4emncBMYO=LtB6OsB@vJyVokx|#Fr3II4eB0{#aQN^6rS+emVUy^n zth9h;W~Re=CEccRI-_-+1u?Fsx`<>_YKpVFd_MCa9SIG;X+1Z<2k#esw;d*mmH=5+ zktY{p=iWt{B({R)Ddn_|MkOTHkEANw1qmZ zZ5Cf7-O>t0Dw1X!L;6hF6S*ikLmo0S(i>~7>GwowncibC1M=C0--jGe%zxJkz2xL_ zW;{#CXSrTnx&ooo5|;u|Pjv^RibpNY3`2!>Z*RK}WLiiKR?O@e)aEK$dciJz6lMKc zs<)Ge#~rlCRl-OtiFvi0G)OZMz3tA^m%l;BC5YSspH=Meb-bhr$CgnHVibn**0`cO z#59s=>Zz0{hUTPJ89!k9QG3|#(PgRmh&G zbt1Vv6;br3R5u=vtwMWW-AZd0g5x!>NQXOLg1$aMX#PKvf*x_>Ci7+|cbtuH?B4O14#@gS5E*j*jQK-f=aHd}t7gt&`) zsKajXLta~zc1$*HE}P;o(6q?p@&1+8=p7LL{5ffY+yOwBUL+W7pbGHqN@D0V(AM^& zpj98g^0RdkcU${Su%@dgxP3fZJF^&G3AI<0@-XiWbUR$jC*ZS-PE1(1Kk;aB~<@})JDjlP0Mk!Tomr^eC}{s zNP9epy80<9GP3Mq8ha%d1$~yY+SCZZTnd^1BL!kSa|qbJ9&dBm70E%y0?zfG=#_^^ z-X{1nF!3`BNapM@3d+jj)6*UO{FrX|L2phdEF`4l7TRnayCuOW2m8Lqri^7hM;wL1 zy@^sc$OIczB@_sM=I4otrKeHGGiTOEM5dkJT|d(8ZZ+qj>xkt*1Y5WIV`)RQXv(G- zEX-sI@;y#YO~r7wAB^ev;OW0fV;1w9)C#5+hlfX!60aW*vHNF1!0eqQA1oA=d^0o5 zDJHHW%Wn*qB)DgDM^wx1YZF6sGIDeg(G!V2&S}0|E!1RcJlt7%8P!+^s*fYZ4*<#2 zP?_{mkhi-`{aOQ3L^K0=n~ZQ*Z7nfZTL`|rU6qAh)r52Uk-6w7iF|okGbJfG@g{(~!#1p0Vp-k&YycM* zI|0>|%mi(wG)hE|FCqIq)nYc*YHB5m<20VVxv9DJD@J;zf#~#q@*84G#tRzL<5ahj z8pHR@#cknm#3Z`Vy{0AlD|CxPp{eL-Vx>JMS4KtW^a}mdELG8viBu+NNs0e#l%Z}d zExn&JJ%AD#xmhbK0&n2oyms1}V;Q$Ag#K?D>e}Y-DT9v7r_awl4>hBvAmt7TtnG&V z8lRiqGe3U(%Bl<%qecIN)|_g9hv{gb2*siiN!aIm&)p1#ls88I)6vmN+Ikj^9QrS^ zncPNW?RL#{I?Vtx@8g}eF8CNby}OS5{LN=E!f1T15K&iSWocz;$ggh{nf!(OGA3oAAA$EN2P3LqVs+}2W=g9Lf11WP2@xp-xQRl ziTwpCe?{&l)G(nlIUB|>SQYBxsU~Ng zPQ8`D^0DVh9PY72#N_kM4PFIkxU`Yq?ZUYbqJL;dc8L*XynyMuTvLdDxPD9bhXncixW#pMOFBL83*46U}Oz29|a&FWbLq8 zb48LOZS!#hUj<~!;Hr=|5Wl)V3WsJk#55%46_&gwgvu-aJh+UGWJ#sAlvzzlKpTHY zn?R{Kb5?`@!vf^tW2IrNRVyjE<#}6c6r<5{-Y)NtIC?F08CiM#Ajb@PdfHl=Y40&q z!}$>@^hZ{E01kd8bzL?@b=;X?5!CyKq{YbzG1b4rT<5SesgzRpf4@}f3 znk>z=Q~^UB-Q=h8Nj_X(lf8gJ_Pfg`zFtir7qSH5r;}Lp28(MlkyD8O_`qKQRt}Cw zyM83yWHwEsVr-UKhg^SOpAD#%ko)7GgP+Z%PFKp*ytMsxwV0d1>bK^{jeSKccdzbC z3j?>;=^p%e#>+9aUGStfGY=1oG1w=@*5wRn8sGxC>!P6Ksx-1hG^<~c4I7%B5fNnT zJ`7swf#P=sCWu;IaGz_<*98mgoSYoZ#lZ@ozME4M&n=IzM)0@yfNfd^VuuSmxScQC zdTY+c^YM|px_T@Ie?(q}L1v=#U~TMvBR`8|;F6Rk+%xqvzOk__@lIbt>ZiehzV9k| zxOhbamRV27O&drYr%KM?fd!E(Ao)QAbEA7n++fIz2I&z^dq?Bth0|Um%+1gNwmA(; zfz?b;me*tRJWjM@!po-ihA&Ry-a6q7Tt#+zF&(VD}Jn5BPJX)jAW?*{MNxc^~ve=g(O8=YT6YwOP4+|iKs(eBjgn1cC8SNs!r zAPVO6Bj{@L8xQ;I&0PJR|Lc4BGh9I)kHh%(*AVErE-dkT7Tuf93wqgs#y7vkq2;U9 z&>FwiYh1U}qbu`_^o(pyU;ZDAi{s6^cLsht%VL)WH-rMd4>M=}6F$2|b@5X)&iYyW zX2crnE|-=wE5gQU(Z3Qa*JQ;R+n*|j{QqMZ4VbTQ0N#h{r906C7Ec7(r0992eS3S~ zlu;ABqTeH=EH?E%2?^MX4ZUM|lFD)zKQR5~30Z7c!!|9!nQvhM=F(ELqPV`A4<^NT zu~wRupWiqU*(DmN+OGFZ*A!;1EEps=7r2n*IPojK<%D5`-y9xW+E$)j;-0W@m@U4STU*~(a{~AYR%8^~TrVvu-xo?=?;C0$p1BsYsRZ=BO4?8$GU67L_r4~ZQtM?R|$_`d$HcgF%ZlI6V=;*kB8&Mvxscj{- zf)JNRW=La#x&E@<9q4!I z?N6Pi?#@bGTN{#t(~|AAW+$T^9(O6IL@czsQ+iUP(J+c0;{FAI8n5KHBZ!lIXVLPg zq8_;2>1A!2VSaC4hW1j8Mog+X7|!LvWr)?+mv6c^YE4IupU>N)^4{yTxAIwIO*cJ- zTrVIWf~>#fSL^Yd7N2aQ1ghk%Kg$z98dw^(9VmvaL?*syGd+yS{NVWfY~TX(lZGf1g$W!3; zuAGj*ys7Bb?$+e<@{WA*4Z((m?9|+IrHq1PH5#sQagkDe7K>eJhRzrBd$qi8&4xp_ zXMo^m4ZHgKVbCKv9fQI10fp2T?$r+L@oba7f$c>?HLR0)lyr2%p*dD$4d(3-3jq;AgKp) zt4AQvoBR2>+8a;&)KpoOj#iVi^LOsS5^oK^7@?*+t4y7Y%Eyyv&?~>!sj;M%C+vfF zvpt{t?FPUvmYn+f?5OQc5z4zJxsT3XoNVB7B4@ew@bVAIpNEHj(_UNfv~5o-ed1sD zGVTC_x`(f{csRt5kf`_N*6HyejfXkLRLHkCcANOBd(*WJvFLj6YDuA!vtN@QnqW9v zt(a>p(?9EUfA`+l>3;d$7r&+08FAPH-$7)aMs}+syREUt_TG@iGe^AfgYjOG%ueV|Kp_D{wciCW-^Vv`>E;UvopKw3z~_zjPgk3|wgH{HiOI!z>SV2JkIWxx z5>Dx&Yzo0j6_eMxL7l?GTvFbX(PgEPi6s2<@iGfNk>hf8Fu`ecm5!AelfyelX9BGV z-}pT*RVu5|tgFI6{!yrD3dZ-{_(6-95S#MT3AOhwECUn0apl&KX7ETvd=1W;TY^aJ z;UtlrKQs~)tVyxN69G1WK~>s}&9ScW-4!WYrY1-}iItkO+^6{p<^Toa_fgG9vM zDGuN^V_)Bd?w;yw*I$iIYlu)2)U{9xvSOi@y=%_g!r3T*82&ZJH+CiYoVHr?m*!=m zyHX3rJo|}Vne_&%{F`s?xUjY5R;Zc*gzq1rVB!a%`S`2X;=f^h+$|PJwQP7!mxu`j zlKcWjW=6(lR^?p^Tsz;e-VvI8ObqRe^ucb34+|wT4M#3-*D}xCW$5!`9h3myhfzwZ zO#ocv^O+=;4?AO=E-TmI;?aWEKucka5Psz>vLO0L=zj=>mf7#r%{on6I+lXeSH@IZ zkZs*>?P=DJjD?lII(#*Z?}0Jir~*b74ETJs2%mp%!~DZeg2MSGCk4eKE!{7SA6Pwa zAOg3M4*zeHtn@ikVzsk|c{Qsx|I)#rpghjG)c>V>LCHaXGW>sC4qEbslOjc%QkRg> zsmI-Nnf_{zg`0@LR(uk zfv>et|M2#ppe)e@|35Atn46mZXNCUv`rQyy-PD8$|G#@)8VrmbnwtR(%l|$3znY}~ zn+g7ZtgDB@Y91-7TPLYVzenAdrTODaRNFvdW235pLGBFmPuMyKZMeE0Sn?x3u=;we zu=|2EIq8BmXMe;!M}$JlYy4)L`HI`4eoqViVTF>a{L5}~Boa-ZJEF)L#+tukO1APN zW803ApBRGwXEnnMl9s%7ol&2UYB|a+f0121QXO{fbKT7hk(&H%d_y*VZ|sl;cER)))c zo0o3ME8V|(*d)6N#do_(1+d8i732P5{%*?2;qTq*Q6*pacdjU&7Ir2L59l10IF#5p zmte@)C+m1g^i_rk4D&jgy`F6ySsx<+y5FOP1=bHIuRggLv{}#l3-zr&|Ok%iL$dkt)9WK3D zxEXnhvBm5(DNRMGhs~O=9F1amT%g^uDpeVH7wTStXrM;R29(n}B2om0Y1r&zE;-AK zRrE0H<=;&1bW_$eXww0oXVj%K$xAn_DxT?`vmnZkg9f)Ts`kAVZ9w3)lDEEV2`N10 zP&36G%$D`)xQ0xZEfrnO(Yy$)N74_+Iedl`PfMxDJi+28GDFyFr32&i-~G(_G+cY} zI!=m21NG-hevxewQ^R|qD=Z59;ysds;O~f4H?Z??+<;=Q6WN=Z++#j zhLzSi>H5ZW{59F8%F2bY#S-dg7g1_uHPrhiMWSV~x|Xp%oLXGUbjVu}-z{rx`3ByF z-x9@yg{<$?g@xQ#-}s5#0ThFoS@qkY`&aCBlenWvsxh6mr-F@M<9NEw*wdhd6-7$i z_ql?^RJJ9R({Hkc*DUr>jx0l};1%TVfZBw00O`Y-E{0gJS7~(vbG}+xhlG1RdlmeM z|3%@N_05y=T&SvckBv9bRash%e;cwVUq(g5Y)3@{jJ-6_ORsUQc$JL01iW%RCCMDl zSo6(3sW$Da0qSIz^{Z}5$5@go*1`mE@Jq|G%g$CN^OEKZZYD|XVwc>i_tp%_d z0R@66^4%*bf^WLL-mi@Us5_TfB9U0VI$NIc4W8^5+{aa9#sD2im#_e~$0gml``A0_b zW)7U;KHZq#ladCOCYl3~Z~xfNJPe4(@^^>FcJ4#7Ag8bJI6O_>@S5IB_?s0Hq+~Fp39_UAQa%h zG+90EQyt`APW=t4>xkTq%Oy4Ef2ET@Iji$zZOfyG$p2{_=VNiZZoDKsk}!wzj{sa& zAZAu~%#Iuk%0J>ss7Xx8_5&azG>80u#QnzA>0kB?{?+{=-kuP{ZTahc+?KfzY7$mH$tfa&cKsrR_c~y!MgL702MR9(y&i|v^rPHwrD{ZpO(}0cj zyCa=kGkBgEeTcFLTgbZD44RaV)A5;z8@=6lQ?7re`K(NbO2r6YU+1^Y0Ov#3T(b*1 zB8(&^JG|S~4&bXi6>$kpX%N9x=7(>87=#OT?gl4$}zwjEzil|u4v_&?Ey z$bpUV`gA8jn7U4_XQ`bk&2O+~VhV^cF8$%LwOPVKc{dt)=xmgc(L%1R`3C{vL#68|H&~ZC$JiW(}M*-U4ri z{(=1k`5fkS@a@*j9TXoQVqhgg+#8%`;4O(wI#I!VgVzrKcZW_9`;F6=R9Ar#HUIJy zpw>?M%PkAA;c$f)0szVn3&J9AmXria5;iO2tH})XPwLIhW?v`JECJgf97=kBP5};# z)tSD3pn-Q*v(7o-oYQJUNO>{1tSf=XM$W!k0WIWb&J?uewJO(+`4+sKplAX8p}44| zn7Ejkk?!7TXK7--4acH1{K|H6ax8-PJq<^(!cbTlpZE3o)%nmtUvKX@@q7ErnZnSL zpOFw-5wzE9*xNLMB(lX7q=84w+5q@&Kw4l!qSa7 zQTD`Uu&IQY)U`v~Sw06+>%NGxqM`;*=~(J7lKYFzYVgwY_lb-5^*Y<`yrT0ANp3nk zy0$o~*D1aDV28Ln*5fkSly2M_7#MuLy8~j>Y^2?JksK=NvB{`)?J}>_HF1{ge#$PU zA2Y$(c@%7!1~moP%@%xjrw|?X;f?lv zGK=&iTsa}5kzjbsCgr?7uW;+D?T}T*+e(A63@eJJ3%$~$B3Y@140lirT*+1E-Tg81 z2!BCm1q`IqH{mNiJ^k_CoZy77t?n1uhu|F#?ik#}T|_P?b3rgvuP9<#=Qk2-+O-otHM@6bVFxFou59H@s&}7I8Tc6 z10wwVN_BE}LDJ?6+;`Wnz$qKp)N=3mRIUcLZK6Mu;5;WT)9-R;BQKb(QBcaUIR@`P ztS9TpHMn#D_hhl~yt=CNA?tgi{&_g;;KqUzOc$Mu+nR(-^By?&rP$x?HkTuaz2{Fh z{bqOQ`-JrHy79ZP?>|p?CS$MzPtT^yGvS?!k&Ug^D*fSpd8b2 zXI|f$jEfXfyqPV5F9$g>kSaCOX1IPfomo7uc-yj8u$xeE`gmi1X?-C(J9)*V4LDW- z-3PzNtgo)Gn>f_v)n@9m7cV6yosvUKx+?-DiA?e@zOUuPI8J-J*qtyiFeu>Fl$MSJ z424Jy_4jtW#w3Lqjn7#RZH(8Aau`U6*Y!Ie)$SwHWEk?Sg+y!ei9cB!TmVLt(Slg= zT3_t#&GqTqz61AY-ldga@wjRjI~(FM9!8xf$&60%wKOusuug7?kVGyfmu8@_6u*Hz zK0?yHiK@C_QoVS<*!$(VqS&*bQ|0r88%-?$%u z4hs-4?nkFi-xb`g@bFQ9^4aUOP~#+01_M)UE*8sFkG}hbE+`jH?1$%>DbP?*7bAGf3^~YH6e57h7*m+qh{T>h zuO#Q^_x&JsFMyFEE-D_zFIwxr_L?`5%dz_^^d|`ftnB!qqQFqp@%!i)+Sv{*U6P;D z83VV&VS`=$jB@b7kMGrX_K$09lqbs5($W-)!xGd;4fMw<-&a*B-)vtVrT>TN3Vd`z zG3yE7qSP&vAF*H?Ub^!Dg;kIlk~-!qvb{ue^KwPCL^ zr1uwE&!;VV1m3u;{UnE*Jl+fOV81=?0_zj1`+e3nHO<({twFG}Dm})lm5ej8cQ!I| za{8#P{Y2SCF_8*)g^Kq6qQ0zr*6cG{Nfi_r_ur}{T&blr)x2R~ibx!gOS(MR? znC7**ZCrLkgNCxQa_(jIV9UwJh(kG#`w&pzvM`vn?ob=?e#(<%cAoMC0ggkd&4Knb z$QN^4S@)sGZMmHNWV68C`ZSXyAxBwZxvrQPz*B44<34{s@bFQ<%dv{NxbfvD$H`}v zRb`6K&MJ->?_@5=rqM_3tJuqsrXUc<R1g+bYAv=F#Ft6}=M?qSDtJ9`l`P(A$a6^w7Sc zh^{oTOV@A}R;IfU0tvGnWiwr;hO2xh`Z!;vr+#a$l$cqpX@YPU`0*y!!rkb&dYLcg z{$vD+QeKHUi;oz8M+eQvE+s%Gz=WysVk5u&{kBhu4GWn;Poe}qs(6D=3~jCv8dkEN z1qlm!fIk)~Cxe5Ex*-jEt)#X#G@WLs5#A}0VLHwD(Te*uWzAKfd0JyUOX5P$EU)6H zw-IN9y@Tw=6Ow1$1-rygdx8tqANg>VoqsfPhfeskJQyMv0FYkQ@}wC(;LUx$0M4Mz zsp%_eKt|8xq>sCiEfATTOBtD*O z-`yYedTiiFu!iKSFMwnJbhC-)EUrsKy$=p8F*o?tRn@vLZz>HGl#_$?eo!Ggovl<3 zfiHjMV`iv{@NyVlEV%>pjszYTzti$LMBciqnE2Q{E_i1lw|AE`5u523cfl3_37uf9 zO$GoN_2Zo`-g-MLqt(|YO}7?(``iw~XxLlhJ+l#y!SU4x_3m_`5pR~ex87fw?5wl{ zeIG&U(eF^}5Fv#x=FMeDrT;A@g$d8(LJ<}1I0S9GLFTLD+E2goM&4PJMU0_=zD;BA z*xW~nLf=jfkIKcdU!LruS%9-{PctNffU)$Cb|3&lG1bps^ERjcnwMb7dRr~~`sTKe zD#Ead{CXs-IR)oR!MVt%c6x_tXbm_7&#VW0_i%VgH9axEJl?jqlwQ+~JG`v$NCVKK zaac&8*^G^dcesq>R{*1;UNH?gCXGE-CdiIul2){7Mhn<P@p33L1!~Xb;>@f?}94JJE+j$gj?N6!> z-mR-L?Jk~$B+H1fwVds4l$(r!gwbHj_oqgUnk4{4kR4H9aN0Hx(cKkpu;?LVGg~z9 zlsBr+RuWZ3EJt6euvI^QS29FrlT}w&acQz=FyQ@ecoI~8Tt9yuqSfHMswMhC%{fch zq@Iz4*HAKXZGBm3bvwfy`#`JO=$h}&Go^V+_SnkWbiCSda+^s~7AC0sj`m>Y!cfN= z+QUNNecHwCmMa3URIIH}xM0MzJF8zS z&V~ARUdA@mbNy`oL~NJ)9ZKP-+ynIA3+tobVEzAFpL3AKCHkuNIj{E1@FEPrCkxs9 z=CckB1q}_I<$!_>1;}yruqQwxVpHkML;a6B$H+z6<>ot0+b7Yl;bQdo;M?2iWcPEL z^T4OcF;^@3Wb&MwNnF`Xb20A@c<;DV{rTCV!rT12MlF=e<~t;mUC(FLiWqacu8(bV z+8T_z>9wxfs=>E?g#;wCb2nZ=)bCO|<;xfz^T+seixDH%xL zFQr~pvXTU_vKa;jBmuFB9yf|5Mt!+n@5e=Qax@*@ z1GT81gv}AyQnB(m5d`wLCZJobtwJ+|FJ4&9ATH-;r=@+X5=spn!&1WrePCAn$_<|p z{(Kwi_7WlDZk`g4qW#=Yrh=9#dx zN%san9Sabf(U|u-OHR#;qwq-DI|Ravnil}dK|uKEFYa$=YrAV&=tQPW(3L(*CgsCG z|K`?W){EPrO<|0sai%(v$6dwn;OwUORoK?zfJ^b*L(21%rg=~TtGtLvvwNL0%U1hk z{_>O3tgOx^5+EBJqX+2^jhNwzaxVueRTpL}PGrA+2o&MoL}8K%kdd6O*m-Mabm4Tn zOPkm*TPo14V}G&cY6G;{?hks`+=eQnE|E(Qt<65qCeI1Wcy72Y%zWLy8_C-5npdJh0 zw$akk?rp3}3HD$`8E&qbO}l+BDynQ8Xdm&uK0DODg)q%E9b8nZ3zk0WvAt<-nx_sS z>2+7Dwp;X}L&N|jo(*-*Z@*BTcWqdR^+Hn=CK9m^B~pIBQa$Ql#ycLt8+)~)`v}7NsYEA-MIlz+lwlI#T*j6nb+B?+Py5+tTV@i2hhCjUDu}$$B-oFlc-?ch%Ia;7+5Och@~I*YD{2 zh&OdGVS88oPIFJZ7dia`Vq-lYhe64)tHSKJ@fZsai>Z&*mA)X~>W#)4U2wQ-1YLyn zCAF_crB2~1eIK2cpMDZEWt*a+j<%|*vDNiE5@XcwE5ZZiCRCh%eQI$}s{?Cadre*F z>82YfuD;F(MuTpEa&U8SXRnF(zBVUv$M|kC!F?A{cQVU_$wD8B^>q_WQO{!?d)TC%%AI5{?LABeSExl zcbaYR1C@@?Ls>>9#M-m+u)rFAyBDsBCVjE^=yQRfwVl&yu&_B}u)m#ZaKp{Fc{G`k zF&cLAp5f*%z3opFXdWB#_k8}|z2!*AbbCAIur<2YTUD-*pSBVXQ$JUjmgsYwS{RQN z_qozur*V4U1c%xx38}oK17B|~O1TK_i_BJ5?9X(#oMEg^sX_ztcgIUNDjMT4I>Mup zrpJmYeo@^fjoL)171pPQQFjh}!rF_ERuw}3$qe;)=9Z0fBB~7lQAc&cpWW2v}CxtYlR>DW&B12J;QCGI7 zDdpy9K5nHtY?$K_NaU-tN9D=~a~RoeTQpG8#70{R-V<$(MJ#V;2h0%vdRtykXKM=7 zbMi-tk;h+#mK7k#V|eHmC=2Rmd&#G+nfsc_q?$A3PkoyFzRc{izp>uDiPnQybDiKnxD zWh7lkn zO(^qHAd#i+b)Dc)5Xn26-sez1`7Swj-*v{b{*ImMeZ_hesKmHqDegnNi&tr@KTZ!g zbu2BUo8|6C>uNJi#;GW&v-J)1gNT?*Kr)Mvic?H(EP3VG(Ye6Y2Z|c?m$qLgC;af{ zAr+6gXYm!OVK7)uxddt^<7k@1d`+?YRaaFen-Mvn$TWLKO85FrRuWYrowC8#g0;DI z^+@+Op@6^=>r+J~rG@!wiugUrZ)4RFBG};I0>?li=H~Q7iIWX{2$B0;Atz*{+Gs?h zYEAZAt_-cZ^;++y;UYYH?NIqjj{()OaUBLv$U+9cmv5Ar$0< zxKCRM9zRXP;J;$$2mfT{4_eh|wAsfb%V z_xLe-t&9|7B5Zaso=F2UMIk3xVW(RATJTLBLjnD|we`+I`cBpE!PuJ-SDRU*19_@z9WptP_U$7_FNQ>0mmH~T|rFxf7e6qU} zsIb+)jsk|RqPs&dlY67<>KOnaIx)!veC)3mba7M4b?IvTo5j$yLXw(TZ3ScqDI(}* zo$Kl-Kjh{NZ#~vG)zIl3gwu%Paf|Ec(cdWSijf9G@JoFuFur$M(h}uPmsXj(Z(TSU z>p5T8r>Gdy7nP0kP_cQNcXbOks#lj~j?m>HM?UTOY`Dp&am)}D&%^JoqE5)n??k&U z$n{a`kz)g&q}jE_eKPmTHxA%5!)5MsQMZM8DrJ4|6;hvHWw!iCj)+KykOAq8BwS}w zFrPzjo*j43nhV8Ea{jIICVOO-F zq9}UARpQ!LbEDf^Lw*LA zgUTdL?h!^zWk8Wi(gWgqX1W;lm;~-}y)8y$4!w{^V`L=H3`*zSlP3#{Xt4jB2a?aq zr_1PKw+j{v4xb@MqxoeFS&ikgx&Y=-qiPQ(5Hzwtt=b#%WXGix=Q;iNf&>jHuWOAZ zBT;s?x#|}DtFW+lS=ngfb%+8%?5CP(ocAy{kDC+l_jW}Cl$8wom?H|*P;cDH{>kWs zT3c`8i~#$6ela*X)N4cr`P!C^nVHLScP_9eefp#zqr$XjmT6~OjPWhS$?^nmmwoYd zPq(N}Dedbwuk1t`d7&zSgfo*JxprW!CiZhY7|D58mu31EX;=tp5{K@fD@>x&9%n5({(eWM2dxB}by9{* zi_dMM1OJHyyo$%$GoN;w>TBGqmLMp#!haf+H-Wk{k=a(o+m(|pMshUUqMebO^A@-m zrW|!il$@zGBdBv^dIW^_xDwz@Q>SLg83qT8RkH^vag=VwW zqbC>O-_Sd4bbpkjDE`u7lN(-o`8ktgQ=00d2>(b40e`rtu8i&Fvrkxhmok`4&s@qx z%S?t!b0a>zRe$wahR`yjg^%x9jxQYSbCN^8x4&aHRWR)VfC{`6ajQKgoS=I6;k1qg zwlbHg<>G$E9yT$z1Yv#WTTUa`-NnwL(e+6**=v$Cs;_~7h8W!Ws$aF_bZ$K!0MoTI z5Pi;#p;$>~d7T`kQRLTLjN8YsS;c-xLYhid?rzw~b$$pziJ&%@+hs_8?w3>OjNhoR zFvF{`8YrQJdiP@jzRR|-6vQV=bVlFXdRuSm7bk*WOoR-s7%L2PBsc%u{>3G10cKAmbx}5-1D@cpF%9?vK3w(m56%t&x25lHZGB(J zO=@OfuqT~ya<*8CV!qoQI@8f702<;~dH1ofpdipyGVt-VpOBGA(097o@o4)o8*6K$ zXm{vrx`ddOn5Zf4G=9-F+L#P0m-*x<6mq#kcQ@Y&5<-)iT)%UPh#-XKl68Ko+b8>w z_#7&5Lc2Se-Uo$o_nb1@tMF%%%jRuuOLt}hDMF}TC~dlg@0l$gE)r&2L`y_?mr%MQ z_-?~A3UAk+XO_2@ico5(cQ92`92qkLn`|oJF4se5v5kgNo~GC=ej-v)em-(7{Amvn zAD{zCI75Jrvik*)kPAmcLGhu~1d8nE#pRhwk7)JR^(m2aCi7L)AfR_2Mb6Sln-*@0 zk)1C!n@FEWhkiK2hXw@{1o=xbr*n0-4z`K%IHB3+*7m1z9Y4Y7e>*hQp;gh77eUEaZG0lG)x>& z`x75=d_xg#7KK$HM99TGgZ99u!emD@@yolC5VDawX8{}-b*}7Dhwvz=l0$jJiUgLR zPyiFBwN-AeAKQX0W?ziP!c%LfKErRK{&6c(Y60f$y=>}(T6G;Dr0sD6>c`Oxl%pwY z2N+_ie5`J~yw7xn-J_jnDTyu|eNT6aD%8g9nttUl6|rp)_0hq`^EB$VUV`4{6jG2I ze@*GKXXuv_Jqq`8?;mb57B9Yfo#Q%6byH$Z@`(JMGFO#x&u3l?(d{sJNoEjUW<#ZB zpOz-KHF}6&?=EzkE@G4Kw96P>Gre9t-rwK)Djm6DMof!HOk&7XTixQk_0AK4>N5DREFH{F+71LU`bK;$1w( zLWW7@0UJ@z7~ff2?nXM=+d9e-5I2+>`@-n5^;K)Ys6Tj!*Jay9e)~nNQk221*LmHw zBarC(EdTWGkr;Ml)y)h-DdaPK_-sBl^Y}$GugNg*_!FWnYt->= zB{sK5$`8*ys%-a{m~~`}Z(7r$7z!e({bJ2?D7x?7*!?t8*SHF`_fT#0xz&^D>7z>l zO-o|K^PWvJnoToap479-Hrk&gDG(GzM=Q&221>b6wmpPH%GEcOM#Tb8OR~Lt2z#Vy zuCZbAvGpaQqbuB1RjWZlYcg(Mq0f7MG%pEXm`~5Fwz8l3DV)>`0oR-@Ie zrs`^R1L*dT2D)26!{{y*e^RQ-DbjEA_B+BUY88$#{I`_FeAQkq4ULYEMa-|W_+QbL z9`&%YxA0}Ij%Kl`TYO?>hBC#bQBTrOhIdH7e$Nbx;< zz*SZ)zyG{8;MeTo{H}UcK^!~Kv5$Cgk!FLp&?^J!7er4lXjgRlYYU;!hn#iOLfKAt9m6%|<5Qy# ztFY)SNQ`D#Xm-;=I?<$L9MLYL0!pBaWa8T$l3IlvO33q#@%ZrQgj|w|Xs6-s4Nnap zo!gaT>(6$vKXMeu^;L@&8i3H_?e`2t!V60qE69^@LCutlpUZjtV8AifnWk8M+b4ER z*=G!>x1VHZtGIA%);Yf~E6*{Dc4Hkgqe`T|#$8g#%!=FT)yUP>52rM8iAkIt?@~V- zjZ=@Iq0Xi?yR3YmlN+IO+P8g_H;;GW$?l1Ox+F%fj>*fWKR^ux0?40z)srOdg1zHl zOVtLH)Ky}{vZlgXvb_ztRqtlpYrc^lRv-KTpKm0Px|8$-KZy=~ch|VSOCwJRXc%>| zedgtv+HHYUNV@0drL8=La>R(iFLBmV+}pYi8st?JiJ#zscb0lUN*1SQmX&W=sF@=e zSnb+sMX$qe_<@k$3RIQiOS59{+tZk?WV9?pf6 zLxP@=DLc(JZd@N~t2x<=-tM0?J45D+tLwsrvL2Ks6pJ1>|9QIeVs`kE#?%i-jR8c)#RS=r$n7FIlu`*UT7 zoZo})fLwBQUYZj9LSd%Gm+<+JLI%)giKCd%p~Uf9-2BgNJshxcajZOjJ#1o@0&qb# zpn8{}W*pd>o_NxGz?ZfLMDu1!;7gO>0_~lMi0?_k3#$$8skOuwDhmZ%tsI8;=b8(F^?w9WEsUnw4t8m#wT>6wIus)$D{QR<~Zd1wq#?^KXi21~oH5+|D(*T)eB=XZvm05)yrZaWCwT z&8wGw5g57hzF%viWW}D`L2QBW8;Fc9!6*5PYn`r1v+<))%bE{WwRKE0D2BBYSun{1 z(B>m=8|%Yy4I86krarKZt5u&NdR@_hbi2IspNGO9zuSqsJ&86YcJrMXF&lg)jL8 zKGxYErL9!CEn1Z+DoD$tHAX03BXahOuZElIL{Y-hPsjat*XDLWeo!|IAw% zSa_@`o{0Mtp9!{VQlNxMvj|b9tNkWeNzcwVJv;x4|3X_Sc-LiBT#oFco@A?^&1ARs z_*{bpHW^`xn527XSnOvdCHLKaJb76~XH89FP$G;clSh`i>rDjZK#{^`@e!XP)BFv9 z7UiU>!_5(SF}m@4v;Eb`3720X>q=>(cMC|(#C)Qp&|SGxsSnD>6yGVELx`0RmnW5_ zJDrOmHjiB&G(q;aLneUO2`Wl;VV!zgXkzv9YS{7V#wck)Dm6X?>Y!5 zjP-g4CSJ?PChLaVR{mO;=Nhv)%1^$1!QGG?A)HSH++so1^;aiAjjF+E{@R%8)Y<5EH(@!G%uE1YfD> zwNF)TK8KOGaXZap2EDh2>Hs+aMl(e<5FjlvX)#S;%i(&{?Zy14r%MKuwU2WBc=RI7 zJ2<)V_^fL&=*7aK0O;=22Y5P=-$@3>P>$D!Cz)P#fDHJ@;KJQkx~sI30G=vq`)WRb zgKj4pM8@M@RFly@U5clvDJ%LtZVRIEjyA%B;{XHQFC&1JE@4#E~99!L3eg^reoyxD9a9rKK=NCntwOD?m-jDxV%$Z?PA_Lsk06z&HhxI5zP7!1(N{9@ohEHE8vvIPz zd=o&}wCRzAm8O}E{m%@GFYJyC77a&n*w{)tF1pF&&s z7e?dg7siR~0qM@%VkOKsix5RR_JW~mlNI<{lO8lHoeCQYODPProBbo zTQzPXgIHvc{LT)eZTzW~NAVh4he+d8#9!d=4^OJC) zrf$`{dl<^_T!rw+o0K5k{3c$vBr@(u)I81}4E{PgKJ}aPAM-#EFq(LG`D$GR!anFM>> zj2}dFVP>upG_rdakl7m13~FU29mQzF4WwRVZ`cyThL5@ai3J>kuJ%oc97xk}-uJu_ zDQwa_V}}umi;EMh&${1juZ-XA-CTn;DMznhr*4L~l2V@r7TwKIVdfmB{3;q6X~o5p z16?jazN<2>PsFw6%f17+7;e~R&K1V>^VuiNw5Eblig8dGkk_CI0A1erj$a2SFuxs6 zhOb=Eu15AlGG}RU(P=mFERwHWU!IJ}c$kH{rmZ$AyV&pb^WsC9qF6UK$(jT?elmI; zE9^g=spo!@)dyIQU1gMWw||uN#DA}!WF=a8h7Q63v3oV z-@mrYyQzu-(F~2t%VeS{AjY#Ayd4kFM3XsQM4Wg4V=Jv%*T5@t%FlA_K7QU2&qUc5 z-7uXgJP_oU=Ln=pjRUI%*W=@iKL!PwwtT5H9mtwD9oM<~6|R;Pv>0V7XGGbqca$wc*J84RqCK@vdqAQ}d^Hd1EY@sw{1++q?QYU++j$m*wiQ5@t#d9^lcu z=?4mY`;zI@tKeKNZ~+dh6H=wKt=3I2tNz^Kt%j!TYTJ=Vz=qkB`%*k;!gADZ1DHM% zc2Op(;`#&~pgS`7Zgt;gfzpTQNSl<@aE(0O zZ1pQ#t$mNcb3=fjAV_cB?_p6JA23#L(Z2#kV$j5Rp(ULNZgLvu5Z6_0I7J&}ft;)+ zA&eqS*E-!?FK1@zGc_EyU_286&~U;SHB75>?N~{o6he+k8O7DZQK38Y^P`()5^SRj z2o}e{TBm3N0qN~opbqN?J=|cOpWovRKzPQN(EMx@zBs@@#z1;Bq6~iYzD1dgDMe*a z>+J4i(X4**uAQ$j3sV*ZeG@f>RNBag-(pu~~9Ll>6BVCY0;+cn6^B5aRjU)mBtQj_Vtrz9Tazj}8?yt97La zHSJsd^w`qgl;No#<6?~)_v^qrMHj#?by23-%LOPo#z4^v5ACC#Tp|Zz=yc^+P76-+ z91z3=Tm&FYoInm2&yEjR4*b=@ys9Q)Z^dGsoyP0AvGWam82=RwNEV1 z4|_1qThq|d0~+RLn^-&y=(vfF!FbQhPUC-pJ?ix)y`J4V2$85&CcFpK-AVa&>BB@T z^v}cS00HXkjN01wgYnE_pD*~~mB7?%QpN{Rp03$%gs@6g8r&9-Osc;DB4K-G>Ogg~ z+3{5BZcK-Sho!OE=0w%NzBf%G@oseEIib@&kL3z&(;DQZ5vyCMy2s+ z6a$D(k{PT^CWF6A*OK8m-1^^{*d%3B7)3v|*=l#f&#m^Qqnd)W{{*9eU17^f!Zh2h z9`Gw+!)zsowzLV;IXt3d$wwv!8x33I+ZzVd_jKanr6=xXwlB~K-#FnRDI}t6Y8Hkl zC@TIjIEls%Yr4aQGK)J_X7jVw?@uz$flMS2iQ)uOkx!#~a<>6wDk?2?a%@QislN6; z?PsVDsWRDVUpqQ50dSmcojQSqd`B#HId)=AXf$Z5IJ;QaguC|j2OZ|b(U!KL+nM^R zM~!5ABZE#;o=K-;S&6>vdpvW~^&}|a$)J*h!xy9D02^aW2FL*V`N=RcF_CfWd|6E5 zi`pa6AP@AN}i)q=7!B!=2qsM>*R^`~?~ovt=Ct5ueyuSf`rqK4{B@ zmFwmMA&7AiLgJ@_wc2L-occGG7&Z~<*^HX!*rd!k9P6l>^Q}~i8w9w)FBXQf)3ZHf zyB8=7QP20J-$dfF1);RlWDQr!5VO@pDA$)A`*ZMJyy1l}16lu1nA;MU<+^uAK*C>5 zEynK979%8(ibSHd(z`w%kVsDn{VCI=B^D-~__nooG~uZSY=Z=!wjRaGuP2eaM!|Ty z0L>`&fKgr0!HaPqJ+bdsyq6&P`Sw1~!hG?w--NNpK;QSjoz_ptmF@THM5S*A?j7{S z(3#nyo37H`g1hr5>5m}06KuXa&OezK?k|v~Cb;uucsfWXnG+)_soph$KGv@XTa>to z)vOiB%x+~Txsyy-aMv7kzsQt3-JgiPjk)gP=Xn0&1*0l!$Q+Qmis0Zi268vvMk)(%zceMhc4sL!_nGfd5?7M__4%>c>Xb2n=74dO zlCH?qmQv(yzM-qQe3JkO7f<^(&S`>GO5@;pe4_x8hM8{O%$HS9`vEa{vso8b3YL1G z%Jo5b7f`O^aS26Mc&2-0wB?z^#B_BE-a}h(v0=xkl|Vap8l#gM$jIS$+@Tt6vu7wY zs`dqS`IRp;SzYg6JVD;Ne-H}3LDt$AwBq@O=*I`H8E!5YO#s&`dk{p%UP8nD<)&K@ zo>}er@<>BX?QCN%7k?wGVs>I$@E7KNzxeufiR26L4twlZN)C7V`Ee!ma0^JS5EP?? z8rqwadU#62Pc+Q7G*MmCuDP?C#o|RXS9pXFuD+Vx$UT`{@UW4#k+7M8fuG5LLS0x! zzCiwQx&u5(50@mm-M(k3=MEPKSG?6?%Tue2IsA;`GcAFHvw;$juxWuiANH0QPDaP zaly8B_DjIYdUhiGHLS9NqWOkRh|dndTmner-AMgnK{?{s)SAlVPs7r4YQ9$)WQAz) z>Z6LWwRh6o)j5v=5Vf1QS43)-_GBS~`xu}}(csyYMM*vNuc)jnU2zi~i;H`{E)LhH zrKitgC{|n#&!(0K1WjzF^J-DD1LqoCv%Wj2Rh0DhF*!ymk7Jh3o|7%QY_U?!PUXDl zQM{j3kvgmBpt{_V$}@z-O6o8Ks!}T@D1!4yFa13>9G6K$KTXD;4O(9=5lR* z;bJjJt|_iGQ1d}m&{+c`8T}Q2hl893(yJz)o=S#K z%l8#FRPfpyb^b6z1I5DTnin)x0~J7*0!AhH22b^q!c-a7Dgu42b=2{h&Z_{T%g=&2 z^7C|dQ~nDWlgaJnrNaFL`SlQDj&7TZD{b=96{aYKg|QAwIL6cUokhHtp`iX&M+k$mY2_{GWCH8;MCqC|1|trxI8_BBuyZ3H^ic| z%~Z?lS((LNnW&6bO{WOqvuNBWBnNxTS*&Z_G2e9!i!7f?R5}5Zbwn3-`r6Tzs`MGl zp({`eoD5KP!0v6ne<{!vDc8&;q}stwTzcTW%~2h-p(;o9*2XG)@`~g< zeYMW99#s26R7h>S1@M<@tyc$s3O0_il#k|T#8uau*kF`ij=_aJ&6x_NUCkhp1&@JFUKF2? z$j%Ny!4eJD6rqaDWWjNwG(n^{v;69Ox6pGS8qeR~!)v)#keh4OhaYaVyefjl<$l&X zOXk60;ON11d+3LeVVoRs=^jqcN5V@hpU0?vK@j(X@DMETdET0i{7r~N zeO69dnwahIoNZPmL+_f`a+f%Fg&ZCURv^KPINX6s8EwaE?H9F>p96>!ko@l)6*`t? z`{=N?mPy9v5p7QOyReSOn8x$ISj6nx;Wz~@I;UA0?9lGJTF^HXEiJ7-DlFdBN0jJblk8; z(X3akmnG5pgTKjG+wAhpghdq7e9FC~rse|(6!HOfGp&F-&a@g-%QQ8ka=>f7(LSAT z+yBRr?V{~V_De?{v+vud;6U1!rw9BtK&^4-0yO@C%UYDItlfOx#_&! zWz&=f0XY%4`82mj;q2|XNBtBd%1&l0lBE3xO0nd%!$}grz8VPw@^G*&@a?Kc;@R9* z2>2=p_h8LRn6^y>b1$0$GG7Bn_$UsRch-vMjdep)30wAdUfiRL@%-zL`s*IVg0?^&)iP5 zeO2#I0NfUcc0oU2$NAHqXf58;e_{du@psdn)QJCu_5c6R zf3Jy`d0{XR#>y!CN1Nfzn>SzSfZhUV6C8fT751qbE9ND1yZxhab6b92SbZ;fbK{Io zc3of9i5ywvq}CJckw^HMS^=uUZ^s$ z{$*vY$4{lNBP0LAQT+W6tAD1DB#9kjcJVw_mKTr?G9P{p-9hI>{x-(Phw9oi>W zKVCiQ^5Yzyy5DvrXfEW|Jl-L@*oBpj-ry_<2U?gErbkP zqC*cc>#sUQ5CUSC>Z6aB>nj?rxIi=kSUj&@RwvNW6DU*@Gu^Qp0}Y^YAr;jYz0VKa zZN7(zz_Mf{RJB+jAC@VbfqXgJ4V(n))}xvz=ap7#IknQ~WS{LXAp0p5Ftf(JR`G9AiF%b$W*N)4ocr(kJ(&Dfga6 zLKF~b@cEaPP>z?W7!q@A4mV%@zM(S~E6z#29NqjNxsaz^JKT&(_HgOPH$qt7 z-G@8$_nIUmgF?zF-o1aWtY=g%j?J__gp7d52G12uBWTzM)qH8oG6gZk?<%t{nhqa| zQM=(R3;uhpFux-Wii1*UaAlPn(s~sl7P!C02p~-I$3e)#V)_WS2r*C$>X16hmwphL z*DU|@vR6CsJ;5*Or3^hT?e%9YHhwQ>G=-F%7oW$|o#$7NIa8a8nl%Wb?u)B|1?rn% zT~wiA+WMWwRAzW>ivYffGwH>?Brp8-o2toXAwP<}9yPWM&J z!JSDD)?@hR&HF;q5?RHL4xQAn5_!1JF6O_TN6pR%1Fq!{A!fUgT4*=vW5RciXf^J# zYQng@M*QjpCcxm|dh^HN1&}=hn~kV+Fa&FLur+fV37C*MUVlL>LSrQ+OKa=xpmgiV zaG$1~(g|Rw`sc+AZf^I!v&Lp7c$1-*e4s9gzT@;^|+N9!hh`-Xn}pIFv)YZ@MnL7LTP^I zGYCcr0>2rq1eh>cLwZO&d8`BJ@0`KB9s+N?iKqCUip~AZ}rGgP<5LG;r-}tX<4T_j^1dNq)w5vS%b5k(` z)^tksf1$+4t@bqof>=5Yf-|-M{TifC^>VRhRCOVn0qu?nm$vs^cJIG) zs1it~Z(iH*4fqes+IM!yj#z2A)GD$>aM?gZn21mDz2M=Hwykzw%6zz@||3WR4_3KG7#eZ$3pLI6>}g_ zzBM*L+>vadC711?4RC8YfIn;z7a}*%6ip=VCH|-vupZ@A%dqE3=+>;Xx5UV6TSlY?!#T6I@oXbDaOS zJ-@z(G{Z_9*JVl*fTUjM|PX%bv8uY9ghC-B*X^nZX*Vsg2|Y zB7e+cxI~l@KmIc=hN6r+ez%GrN(|Ec7f+N6qjbf;-4r2-YIx5A7-aqqaleHXO$ad2 zTp*I)fhzp_g;kQYo+xC&-3{@7N&HE}A}97dMETD!fB>*7lox9}5!~}~iji~3|L#$K z7OVF{~Yr#)`>-&zy1;U->@}(&R?{^s*+Q$rKtD;OIKG{np=Qu-09+8F@iMt zvkAxfbJnAP1NUcsAO3b^Od>%mF;29K9|?HM_R$Xc*2C;F)v=AKo-S{`i+tFdvboUu z+79o2uBkb1Uu4EJKflrMxUf(~rA%hK#mB=076>o#WC3FS#9tk8@$sGPNqXme9g1Pr z7F}%8<|q$%`A;ydZBOm_OWZKg2p@m_?K-Q32Xthue?Zqh=L;B9n#(1A|>73T|?(E@LqfG=YD_p^L~E+s(`Fn*Sgkup2zV$ zg7PXy8xG0coO+GUJc?HEKLG})v;E>mQA1-jwQg8mzKvlE*d73)KEvS_Ns-2H5YUN9 zxGygcWDfxtPpzW@*+1hBguoCi0NJ&5(D{%SonGTTn4}0t|0=%6=;=MvcSKXwmc~-rozZM0nVh%QmgsCD^5(S6yaa?|!>c!#Swv z4aB)QrLRFuVX5{uHx#Swv-uG;J_UIN8SO4#k;PCe95W_1|JfMRgv>q$Y+Yq&O-0Fk zyTsF-NeTI=?!L{9zMjw@p^=$%AaS#a`ZPq1J!aa*<`mnmd`Zjq)}d>L$_G*G}Pt(@K=8;J+wwY0RJ zXa*YQ*yYDyuUntJ5g%#kk-Paz40K-SHPFN34h$H?q>_LeK;*pOfhILcpP7C%Ag**w zZ~FIa1}w?%2AQ8OlKkefaVU8YU}dOewfeDL1*l&jJCAvFWC#vtp0`aZ?6RG-?mXuz zz#h{~f}tV&g8Xef&ZJT?aY?r)VWMm%w_`(00C+gGqErWD^0b`3+@`d2W86vLP0u$C z_zvsKr@nCX^hHth1z>d$@p%0i+CDqjzV06zN`k%Wt{<<*Jb{5QU}6nMyUG-G1`iR=9uc{XglU4PZ=5HHnpL@MZZ#+wDX>py%}&TNmrXJ2Ym2-Ra#KAvk8 zq*RuY>b+S(1DyzxQs8dwn?BE$*6J_nx^ugp|B0w411+P!Y^bSuBkZ>h`(b=E>Fc5G zg$?)ETU2w`&=~n4?iBD;Q0_aH-svXF**BP@#oMXOrc82rcuWhT@&`Y#nA|{dL@PU7 z?)w0)(oc&mHluc_r!2p-*`eCPi&we7?$3#s1}19L#%4VM2$7zas)=7svJf0O_`vYb za6H<9;}YMbaO(LcFo3(cnrakXZMUH4AZoH|Kccy& zpY~m0#RJG4z{xD-pNZ-|U@^RT3M6ZUj<3bw+00cMo7pJSFB8)emkt=U#yJ7 z%x-g^4B)wuk(L1;t+j8`b=I)3U)i7mCgsWNOcBV}yaABOV-$HVl?lA+BI|nTZe?ih z@gS<@__^${AkEoE%SH|Kd_?(_{Us(X_I$QAtD&Y5zF$juS0>{3$P9OUKD~to7=5~Z zC|~kW1ouhaFlET5KyH3vCfQ;GOb! z%|7?(+YP$_yXta1Mq_CfE*)Z`%zfyd5F%x4RP{xgaK76%i8IOXq1{ozlTq{Xh}s{v zDq|A!)~vN~)L6iG<1nOC=L$;2P^TGd;&TMCVKubsROexRT))Iw4T#Vf%6fKqd`g-b zR{H!L)yWIQ9k@kF_4Sl3RI+vuk#>6>WKOOCDaKRVe>6V2s`|pL$TGq&lA_B+R@;=2`0KgzM`rBud-cn*Qke%llU}DQPLq z#Ql~6Yc-dqgEb%fCVgrPu1+;ZW3N58!AiiU3{Rj@o$O-v<548K1X;F8h9|_&k-Ie1|eC z)ll8=;4t`8t22PxTo$6txSh!QEI0CmF%a12x6AgxCqNf4*|c$GlWo$> z3Z$S4@)t`vO`w^uC-C`f7I8CmzO%JqhO;krl6j586R=VooN!~RJ=8o-G6dzPG35Gz zM`O4S5$8K~>29KXfhe!VAxce>n>ymz0&l0QomyOJ{D4ZwT}-iwq$Dz@ta^oUt4|vK z*OGBNPouncWTeyB1GhhU6D=(gUPdMX&uB2uz15z!hwBTM+`q%2}l>n*opQ zZnmEU4afw(DnFi7Ui;kN8=mMr^r9C82!dNRp2l}{^^-NwJB`ojBQORiqtR$9qPutep~7pRUz`&oHssjC>04J>frR*B?IMs&pRnHLzYXJpgd7; zyc>XeI=*=)ybENlL=$i2O&(qQa9I{!mrxb`iJfh?x3PZuX?$U0^6X$~`LQMA3P-fm z5Sz0cz|PRaA2yaQVNrfTeYgM`jv4OK-KNJjUI{>P@>xabIWl_XolO>6F^nU_BXc!b z!0>k$B%D<^8NV)`FFYXuAzWL9&LR}koxJoJ+x!prNxx`*%5g=L2VDG?0mXe@tUiw- z)E*fm&x&7$++ldE0dHnGCmthh20ORwL#*fhdGEz{p5RY=ofWK(1MRo#)u5-_{C_rg zyl5*g{9q}crWx((;Hl4i@V7-Qgtl33`eYgOg}hG%3O~!3%gVYJaE{foJPopN_|Es* zww1U1XAHR;+x=B*c`LSCJ*^OR7>NVC#bdr9;N8?-{DvjNPTr=W*KYZTTVvz1#Ww*- z9^?_ns!v%$o~{oVcmsQ96I_ax*p$n2x+nDOR>7$v&baR5^HXzK{$i0)tG<`b2bXdO zYKZgId+c(v#=?FJs&g6He{uetOh%%dUWtZj4!v&?)XLW%{Ue`eW!XnBOBYyI<<#LF zWJ$`i!bwCQn%snN^5%ngGj7$LVf}G-##{ z`Ga&1U0NHb&0+s(XK$p*(~7gECr^oaLX@sHy za1ObG%l^ip5)<>?A9yLQ-{aNCDvXkCyp$`BIe_hBc9;}L%5#5~(n2TO8cAkELX;-+ zrzc$MOGoDF03$C()->l*zI)0;LX!-ZRfuX>uPA%+6lUmb!oB5AdELEz>us>DBl3jkPg=HDcxB(kvdYUU=P0c2 zIq&Ug)#}CyyO<_)Wy3_AG_9VZgVb)SsF1;2*F$ncVr#|;>U$3nOX+sg+dwMdAGtXT zX-sS2zdU?OKI*2$P~TE9d(!~KT>z{tS{g2Qo1N|W`1lKr4wDQW{{$wY9|uLV?KfRI)yU$i;CD_YrjMT9yjM#ui;k4 zOS{tz$eM-otfC5EiA7s#peD@}Z~r+T>23djJK?)+SsnLZpgMg$%q15|rLh@I!n@U_ zJb!PQLsZ>BGW6>X^kty1*srWBW9DI{S|4rC@WqCqt>$aScv=k)h$F*pw(~C2Q|R)Z zco#zN@5k`^2Ri*eFhq--^rt`&E@+|EDpAF<7$I}h}-j1Q*;VMO!-;L{i z{ao^X`isge@vfh%5E0ORlSP+`ilpL~0K#$QwJe)PlXxYoY$6#3&(R>U5g5zecq__U9V zq3szF4o~w9WpzO4JImgfX`Cj1an*)qE}ae+SM5A2M263{qNTacthoe#q;hC}UY17} z!@YLee2~0wvw!SO0cN~WYp%sn z^GAK*z9o^++6^t*Ke;^&a=*yJ`6)>!zV?1B&)N6(Y)g}d3_t6YN0eoM`JJMyQi3Is z=uZz70YpAA#z5cOtD(V>R!>2`eWxN{SOczFb-D*@V?_NUY$?76!#HbXb#bNU5&<3) z3`OOpJ8iq>d}XRNn4S8|a}!@}3Y%85oSWV6mqRb!*6UbHki9_;-+=*wFZP>OB2p?| zXdnIEc?s~@2HL##!ztbXMi)gd7LH_Bl>D8Jp(CY5I{iXEIfB-|-_kj-8g_JRrPN|x zUCTth85VxAIQ!^H)R9~ooUILi;3oMxkMSiOz-}J0jzM4+6_M{5STbM_Xrj;6iQDMK zA8U#ui6^t#V~V~lw~o8D)(e;Md}p@6HuH4MuBODB#55sULhDU~T+Gb?ESe=}VgA6~#H#)a* z#yxS?*5JL41t_;?V~{1;!E^!N1Fv!6UX=l%7idxG=9fBxpsPo>19O#IF987o(MrP} zw(raemL6|jDFn;_@{GIE#LJ{5N3)f5U*@tBZE_X4Vrx+qMR_ex`SJ<{tl7lGVe!PC zfqmW8DoSln$%M&YCHw~@%5EnU0U`-;r52lb^GE|isrbQ!T0X7E5RARi^q;_kFIjF2 zzkih*U~)}K9|!t!@Sk3Q-WP^_K#O(hr)+)b98r}p|B6)p?NL#jWWEDN2HF}^Q=JbYO-_4x4*vWzk(mRR+jSE6p?-Ki|ONI>GqV4m4m;Hw8- zc<#?1_&EEGgXXts`p0zj^gW>a*BhI2@DgLKgtP?sJUfZlu(#Rg#zH~Z?q6wbB`;Ub z0q7vtZSWQ5Q>kWKpM|UlME|ZM2O z$Sa&#$_aMcV-Ow=88x-@mXddngv~t-+nz_~Aqs)yW}S+~x1eOY-awNrJD|VV7Er)W z_>OJObc1y&j z*8x5ubaRPPaB#5dCKJlO&3B@HGVIz{bqFPZ)7}DG>|uoD(-YJAy+l+*9XYh)r>PnVCACYo8Rk3Ka+S z>@QD@wSNHrep@qoPC1dIn>-#{-UMCMROPn*Qb%4#^hW4o3T z8X~P)MXzkKo|FuoEOv7Ec+dTh@VA*|M>a0%A~G+k?T{q+}c{tTVdSMb0V+TZ;_sv+PHu4EXGLw?BisrRd`0 z_FR6*Af61zj^bxgYRmmwH570e4D0E{VaH9YiA8COC^BU*u{e z7OOnAK3D+dE~Iir{#}^7nzk3~j4Pv>re;y#M5U;{|1g`CiNSH{syBVTihfJ5j<5Vi zNr@VA-&FDcJquneA0LdVkm@kF*1EeDE6BI=76g2+Ol)UrMTu8^zm2n-xAxK}JPC)0 z%{wK9q}QC|U@$Ad1doKgUvBPVqtpC?R`qUJUV1}g%>!sU3@=KzAD$*Xt6V0$8km&r zujQY~8)JBb9?|Z(Fj6@M)J3*#5{)dS5S}L`Oq0ri_^pxJhA&E#`=htS-yTGeK`XNX<4``y#(Ki(PF!yTRt70_I zQ|@KVBOuas+pUcv)JshpqTm6_VBgk6fTJx0z7S#}&>mq)ggaB+HUURpTkDzCZU-6o zc`xC)!mvGv)2HrmY<~8zWtz)sl6dt@mdB_49U5bXI-C=5VguG40)Hd$(=ZeoSx*Lu{Npb3n2C2#HA3a~Tmm(0WvF zp)Lqus3S1(x16g{zn-{@JpP26<=k$yt6G$*BECg)SvtE=5GINGRLPw-UkH}LF870^ z#c}|x4=>D>A8R^r5cKEo7s@2C>%!A>45zu5@9s)f)-2-g2b~o43pXVV zI_aHjlOWzCPX$|R~>5a%olGiQ~S z#L+kd_R~^r_OKs^V*JO0kHc;AIgLH0$wVAx;NM-p)Wd=ETFXFcUrx^?wCmIRUHjVd zGy}IkMKiJB$uo$k$MIEAPocyw8o(L4)Xa|qUGqKMuFmVQBM9(qY@o+>SZ=sn2PmMY zGQU*|muuUPnkFRs!ik5OAe^a=#tc)PkDZ`kLN2-lJv5_ zzJ8ISrKR(2Y6bh&k@4EeCLQuW(yBro^x3P8=(g_70p zU}0lPtk15uPZsgV6h?xb7n46S1ik-++Rpf0E~1|LH9bC*ivh6=PyQ{PPZyZ0v<3#c zB4Zi+y}#$bc{l^%11IXqS^ifyVQWv;{R7y=Ra^F+Mu$0FbCnOSL!sJ1#xReR}Tu7aG3L@)ALgI4go>saEg2nrTxca z?|oE(OdF^{k=F=F{%c#u>KL}}$NV{D*J>IoCtdfo@ga=`b5YD6qxvUL50Dv(RQHx24w$?n3W^`6AHbhZ6y`< zkNY_pf?%g5&-KL-F;agQPp^v`2bo3Bk|eZTKK(oZ64^?*tq2;!!+TOw~|*6!9c`J}LG(Mo(Y6tZC?tPs_+L z7MbCRK)}PJJ;uAzG_Qm0deD#^_6J7U>xc|$j;;ofJAa3Ba7oYXW8=xtsZMOL;#bwZ{n)sO7wZoU$NCeZ#D@tNGu(s@dYO>Nk0gjhm;ZX^(xKxkns ztZ#=Z{AF+`1$&lvtqV*b4^I|tLH`6RjmLLW>td1T*A^W0l2hQ0fS2;rjZ^vWf!+mo zdR@1XK_jz@+wfL1QTx+mNGIfYp&X+#IZn&{2hc%IpYNO~jJvIk5A`%eJC&(6YHV=i zsf6cippEtE-u#bz0jB2`ERD8`I7=PoDQP=mhTUwm`ziT92{hxsy9K)<@PYCdjo2di zzmzo4kgXSg|9Sm4b1XG|NV23;5mk^E^Z%`qXfG3m{dFctr%zyqdfxJr2qVmfiGUxBH*RhJy*WNV87DI2*ts0kt{5Z z_}>zep0&@?=>M~}v!S3NEm}RaT7L%-^;&`Y3-@sTGS-} zuUrI;l)ehV9#>mZ^Zv}KgPP%Cr~{eVVCuiumkbK_upro%M*sV}aQr`OAJi-kd?x>_ zy`{f5uSo_z{2ZJ8ztu~;V!VKo8CbLBaWihE@N=I3PdC-H;l%EQ{XyA-f4s_!8|!~* zD;)U@fWHCiiv17giT_*jv7U$=f!BsyCiNSgMzThv&A^a5L1Mz>hTOFG;l=;fxO5sn zo@4*JYa-3d@pK?Ki2sqI{i{lQ*0|Xd+d=_;1L}&J9mZ?iAzd&5C`Ix{uRd zbs+z}h5r4706cgc0+8HtR_AlsQwe#nN9K1zT_uBWrU91He zsCd?_0)7`rXkr-vPPz%O6{m_ozL%+({|VkR0a&>>9gK{u8<_$}4bV7+F^#P#NaKj# z)>e9(--wEwtUN#z$7zJ}|KWb|v=m@En?@Psw*gEEsBBnQ0lsy6V74msU=y-u?BTEp zxTXe9<`#zf7VY{w@VGO9tm^i7hs8hl8VBznH@pG6KW|0gu3M48e$B$5d%Ao2{DNYf z$GA!e32p`x41d7=;y^^bD1|2F5?Sp_)TZeqwqU-Nc%0OIc(RdH$U87cyZO}rVI>Q&oUGTq(qd|%5xk+)d9>}h3BHP3-m0Xka(^BK9Dc_RWh08=fDdiS zXPx%nb=#)8znw_xOi3k%)Ox6KNg^x5$`+_paiWBnrZ$0=up9G{5jH$4UVVhV;!)#QY^rYBh&wm zfRNx)q%pYXi$q3t^vi{w&yrBkl?M$(83s5=lfpFsZ`&Y94 z2N*u~7gA85z$Q?a0566p!-ytIg4@HTtbY0eMPlx=5g)c>VzTl(3vGVa|C=co+|cj8 zU+sCZ%+0R?PR{IbfgcD>*r8%whe-YY+x~Z=PQM|pzuSKH9y_o_G6`8MBzBThy>ogG zcAW+qQBrE6>&u%6KB&|#`~cwVjzU$M`oz@3e*g8*{fob#uWx&QedA_qEXz%WC`Q(A zMbvvgkfKdRr85$6vtQw$A8ahC&FIlCaZ>Iw`=8G2Fg;D=Dqc zI9b8{WAJ7#8E;EPUm#q9tHtB$FXu(yJtyz6ii~8H@pc$so^e|3xP7~2rf{^oEqRgr z@uKYjuca%C;4YnqXc;4OKb;bH_&wDyvqyg&u!z#Xq4Fx1b zNtJ6ic58{q*^vNLDeA3jjbCrc_ViU&QfI#aJe-La2`8iNFA7|HJG zQ38B|@}-*7(G}Qqc#D9bB8g~OnhKh-z$-hz@++dtPJiZf7ZKPxov215=-l^vm+<1I z5AaIo6Ay}86UI^wt@=jXhklW9T=k@7=ImQq@w}OK1z6%Kq7iz~dC=owdG`DlOVU`% z>Bgl?i%`b)H(It!ZAWK`D>6FecfWHISWYrK-Hw(_<^rzIk-!pVOD$2yacMgKJraB# zn~zVqd%&DHR6}A_}ju!-K=Gd-?%Q&A$9#CXb!0iPy|&J3kX0 z>vwfoAj)NJ>+35T4-dw<+aKQ|bAJG?DO>Yphw1SSz&0As4|%Rr2r@7kRgnAbprzk6-%>z zDqC;e79@mtZO-#Jf(u1OQ;jY*d9C|;>9hDio)4F~eNk`n827$6eaQpxRj%I%*qOev= z@w3{c1@Zxc#B+MkuIW@-h%|5fEY&mP;u@{yVhn<)%1<2M^FDaoZa~zvtTb2NHeWpg zHpyzP*Ku3Rs6+3~1fPt~=Q%Fkvmn2Ccg8tTNErp2ZGHpTe|vV+R1BU|qmop&769s__1;^>Hz3}BNS=$7Aoy>nc13}ekO#<} zLZnFN**M_15U{gKU^Y8x8cl5%fTB7$L|=#j`0R#@ ze8<9m0)q5oLo1$#dAMb9zvby#KM)>gN)|q?wB4S~ipECU2{T}Z^OGr=T(RLp7 z&#@;u1w4X9#iz{ki`vp&+Q5NbS<15(6~@9=>Edd4eK9O2|D$wL^IWH}pg1R5PeYQ3 z&stYhi&qw|v^Sl|)Vs?e$eWbFQRAA?>}~OszE{kxx@JCQCZl2${w=bxu{MR*|L23p zQ{7{Ggdp};>EGUU?ggCD(aANgduBCxYE_kEDU%bW698Qb#oFh0FlFmdT-4=# z1_<~nlLJW!NzcH$48T+IH{ZwSea}V1A|KZ{H=mj2)?Qy~ZpcyJ*fv#(QW&B9CjVo3 zVk#*B<~x*XB5I-cQ8iciC?bleUBL18x(Ktttru&27U0=yZ}CbMw4f#v+_D49e*Z{a z;-nd{UGr_{Qt;BIY|ZPf2#05Xr)cz^=W{l23{GX_Qy|U6H%~DT(kT5Ye89UeBs)I< zK?sxL0~(JVN1VTG`m0@k%QLaqisLyIk-({`so^}VYy05;Ik=r=?eNd+x1T@F85I=a zoOBT+5|C|KxuI-n+wLJY^}!8D#`!~RWaf#8?wNW-6pq~{s}W9kq>_t+BQN;VS`IS! zyf;=~ld&4`-Nz7gS>ibz9gEqe6Lo2(?;C3rek-vATut?Z0JFj@yRzR_Ra}$1H+|75 zZSq2FK{gnv4J+j0@cB3cRhK}CC@={sO`0dpfNOwHASf!@+KSuS+68?$hC;jgBm`*l zTU)n8Z?VggeA$RTo}uxd_S6mw3knKy33~1hAE%NY-J^X~d#MgufBoqTqNu2-M;I*9 z1cltRXHsub|L}@IB`c7{SGnuX^Clj5_C!C3u_ge9`*7TMA|p%W<+|rO zE1W+E6$#FThgXj)_WyoYHeV;2WubA-**a(>*pL{L=wWCh>N+h({Uwv&g@BQO?r1un z5G}LaLP$Gs5!=QOFU-k7K{eedb7kKY@;`unJ;G_GD=BG;pjgDwKZHLUA%VP{py%$q zIpj844lgT3{e;~fT0CLer9?`h9oy$aIE@q?fhhwlrMuk=X2D>IF9`|w{HMOK38t_p zoH~DEeB);L_VSGH$IR52SNwmGr?H!DcLn)7WD5AB7`)d)HSl`gyL!Ud#~kPAk~QDi zMIN7u)6h8;6868R2wx=}OF?KSdVD;6RCY!AvjKfmnBJzido-PB|JMQy@5&g2{x6H*J`m}X-Z_u(xnvD_UyR@po3f)nO10`%c1kO`mo@Qsp z^;l+$Ze@D?Rf;g@uVyOl0q)cE*YZRa@NZ#WvH{c1-+K{0)OIK`{- zpg(RbmY*){gYw>)J*CFAUkxz;5k>-}H(u{<@v`TPi})i4_<5Wo)Z_JieZBe9zJVM) zDr|$CWAu1r;E!>gS5n&EZMT1GxdA8MBHDloak#d@n!OqcL%~Cf`BukO`0&Bjvk{+f zTXfZ5)3~z)cV9}(rF@G@ioZuH1QH^b!2x{b=VoN$iOJq%CM{tPik&d~OW8lfnDs0p z5#8eY$P_F*_&G+QW9Jwz#bTTst=pbEhqCq0zU}p zlIKLkSXK8UhY3ej08EW|d@P;MA!Q}+_;@)&FtQq&HV-P-gx3e_n8<|E$d>+Nk58%D6x_O5~emj1P5{(2k=w z0Zw0bC*;(^zvm=HpF~S#yNbsH`)nw6OqFeY!BMv_`Sj)-Cu9JhkYFr>^EKlTk`f*_l9C3D&D9{gwa~eW|e_ZJO+1G1v>7 z$l5=pj0_Tft5rfyvKI1o(x=d!2mUDN*5XQ`DvenCm&Cv5WUw<@zz-MX0&m_UoGc}` z!?vYMUiH4Q;)h%ZI;C>=n@Vr(ryQ~8*DpI=#B)fR67JqLlU?bp5`2--7;cTPNkDr` zEikHD$!|Z}m5f+I@b#@HntmYe3)AXA>(PT1B4Xn-9iGaJ4mX@dXnE;wT=7R5f5%XG zA>@nH;lU?yXEdc%sL~I!1{~$_m+c@_} z5hDl)*;ff|zPN-d>?#2=Tv+Is6C%~dqn{ra9oE(`9x< z8Z7tfw+KfZ-`TI29Ech|Onw!A!PjN}YU-WvDZ-%P5$m;XpghyeD|uhs*rUxgd)kDk$}CN9sG&%HHYd;&${WTjCPJD6Og$< zFx6AwHeI zz&)*+Kr}e~YGh>ObmT+N&FRX{L;D{4_`zfjx6T;*RcJRB z%1hLQ2ZHQq$lWHk`=jaF+1V?Ep8C9|rmw}gm@(ghU^P>PT6ryGf#dFB9UmY#^H;i7 zHpO3(yitsjTJS(!$rn>WPVOO@$PGkVg!!djAlfck0UMHa=5}PT*TLjOm^mw5mJoy- z6Yu+=>u5Z#sXw zXZluOr>|~!c>XRg0i)n`E^jg`z!Z>@nm1|cqS5{>silN9Oc53qb_~+RwjvJjI$dCWpMMy?*RjdH&if!=O5xN)`XG4u6)#5%IA4z_v zYOHL15YoIcdX4Gc+P_A#%M=@8xdYzEy1S4!RQ;_u!D>83Wm zjj@$cLwDn3zeK7f123kAqornGsMXh)GE)VmCZwcbSxq+Bqm3%X*4uA)GdoNT+R1i8 z*P*6X*d^EpTl4Eib6>uG(Pl|kUgkditCZ30%u+lJ4BuG#5)=GQrSR6Ie92(4^7(!4 zA29`599d&+QjgyGFSPGhg#;KrcSI6qNC8(cXOX7pECk)%q$QR7B-m#G6g|WSJvX8v z8Q=!%fBnSdm{4BhrwuaGnm!Y+`qlaa<+30<`|UKJc^!%rXm)cX+A^8jv=ldd`|1## zaCE3Kvx~AQ21s(@w#`vtiwr)v^Y3R1x?t`frc6!?~-XF@yk(wYP{!H9owK|STj9# z*wp8gtpSx)g1nM~rbYEX+7$2m_^7n%FA{xstkD;WTUo;;BfV5T%I$=#{9e zTSy}B2O-j3Tw5OiDRR2pAnN)jUqKFjXg;|Rv5*7(GdDQUd7WA6D3=+)P2f^2P7dXom zF6qBX&bto{!GU^i4|}Q(n;NHJ;w>QLV_Uxg&HxJH*V>wzn8Fp*yjBT#M&()36631} zy;2mbPwY$bEofmWREgGohLQ-VD&ock1Val4cmNjDLJ}!Rxm2gOg(j@I1ry9iOclS=c7LRzvdHnkzQ|_16(>SRP11` zai)P(zjvrUs!C?2-G@}%EWrV|SHn_iR#ti4cKtk0rHQkIEF1d=&yTjlZnb& zpbBfIsdeRz)q%;f-(n+AE|KD|Xi{cX^owjcD!0n7zBAxXRBzMAOFzVatE#HI z8oR}nmH$?&ubiDX;Tcx#SXOU)7WMLwC}E9Hh-bXStIXt#IuqQ7f>ML0Te z!!MCfauNxEcfVtJhxKA4dwDXda<{sqq&Uc$FqO1LFF0gqGJdWCu>vOp)LdeAIgs0{ zEU$z-ML5XehF+&P+80F7q8Z(b!AWrW>Gd#D^pJz(TNL7$q=ZD^qAgL-{(P)FDSGzHys7Yb-EM#ECk(AJjZ6Oy6K zW!q7z@?}wp+PEnX#%22R=GeRXhN`?a`4 zj=}kd?uTb%9`X~L@O&;bYfjVms5fR0{sCiaemu^$2u6(d%j@)?I@xhCa2Q4xSt0s~$w}gh_UBZYMt;T|^0T%P^cE;tn8Ie1)=?lRe7Xs(ikWy1I zWMOLiz;V~l=pRKf805as{3uXURFcy%(D;}2D2s=5g zD{}h)@BP>tpSYFY4`l*8+wN+vue6L3%v4L!t_(nBEH16FVKc5KhV8&zkdgoohlYpP zNNH#T#DMIMrf|xyV6xk+HJ>YV3gPg&w?PsT z5;OUgHwn1Xp-XdYcc+gm7f!mezslrjz#g`@L)9feiwB2>Lgl+jvFqBo{c`!><335H zq&!hV`VQjOG-HG+dMPHhUQLJvRa{BXKoY#Z@jvqDdCAqRL5b!J?AbS6$s&S{Z91{> ze{EU#SkiJX!^-rzFKX!{qVb7ZUEmvoKS1jp><3&ne`H6ifcx<*wbmtej7&_hHn!WV zU6P0^Pvdr*HixXt4$IaIgjzV2>&Ao}d^iz3d8{Rzo2M>rnEbu=YBds-4mbQ`(wIqm zbONc!OKopZ%=l5z3k9ZXlm@9bhrp6o_c#!M;|&zOd;!pq{O0PA63(kw9`f>4fxq*} z`g>Q<^lMj{(OtBZ&}|HU6C~#Zaw51h<>%+KOQMkSrG( zlfx4Qs?kL0ma?Zb4quVvQ1Q71tdRzP zwa_hY3878tH)tw`ghWJG5#M}n2NMEd*kt~W!|}P$HsjQFP3Ta_!^5wf+iMK;@;=4FM5c0&)UEf9^*^^air4p68gMed|g{l_j=~PoF661(3@nhUdZ847B|AXZ2R7|^p@2P{F=uJQamuJc`4}WfM_cH$;#&i{RX$1_ zoz}Ey6L30O#Uq&^smM`%SIzw0@@wrEdfI%|`bh{MX$od6m8D{Di+Rd0k;_g*?a;kF zj*ar0*^w3&j;-*_>hzMxwc_xw3pabhkwBj}RW+-AXKrifKj>Jl5|~757JI|YcZIf* zOKE8?i8>sWiy91P@_e=@%;Pdb9i~1wsMHb$-W+X^y`=F?Uii{n1z?u-6dJ0)1D_3w z;#=Lbxf$N)fh;X;_C56<*7-8CI?Yn@TzjxZg#MpbCeSrTE6`1$Aht8GGFp z^s-=HXH!S3Fpk^!=tP&KZkjOW<6kaxzoT_Yji2@)mXOuSWRr|uLrfB*!5lay?M=r; zv(Pt`;0(8ZZ%tpAQ}Bi?3kChfJ@Pd|*$2yoaG=h;`;DJ(jeey^toVLlXws{MtwNND z1{Ea~(0uHEpEl_8< zoNW^{bW?Ang;tgpQr7j3(_=xG$~Bg>jXQ$g?pZWES#f($y&xMG2jAUI(OhiTdEjIr zRESVrj6e83JPG;U9Jc$a7*FwwIV-+%N-p5G`C}hZTpb``F0bj(oR38P3eMrLt*`(3 z#dr$AY2mA=ForVkm=|*cmjgbNdlO7XuO_Nr3Ft33ng$t37$}r0gwA?=B45%cCfjeT zXhUxa0W1xP+D4Q5X^k(V!tW`F7bjJdX2%RtNP4_E?qohPW&V)0_0~yAm3-l1Wi>PR zqosug$9(H`wk#&ubX@oVmG(wV^^CFAti*F^tBUql|Lp9l0kbuRA`N__UwVI@FL|@N z28#2ahVU!{5UH+MOkHqxX6MDy%=N=ezYvkb+`meVN4YGHB(`VM4Gzj<9n59yr>OEC zbiavuFh2V8a%0Ws5uFh?S#d-Ob8qYoa<2Q@>G5gtCN9%z*QeDU`e@d}XqMH^4vI|R z`cmSPm+Yfp!yH9upe#+wTvx`XbcOL4V^sT2Lg-ugcW1Ngsrp<3y;m1BLSZ94h0exx zunDe^!3rrr9w;^4vnS|(v+)DuRx|l$MsG%UV`8A^BL%*jcL96k+|)!WzbhZ@T2ER# z#$A4kHgI@@VvZKdY3A80mjjTdc)5KjIeTm49^T1v_})V?jI6V9v9Tj))7tI*snlA2 z{)F6o%E6uZZPfGcgRm&ztw<;Ra1|VwLQb%A0k8{ZUyf5W9`jf44fxEetie#(J6sf; zuL8|p4>t<5!#58%=0dGPQ7iX36h7k(B?YVnJic&$<4}nb7aP65T#<08gY!OrMX=Gz zm+U1i`k|m=V+!#R9t%;QLm7qlKhH#Jk~*oQQvJ7mK5aQohtG*2jFgm=Kwkm{=u3EE zdZa~>F77R6*vygxV7~AWtU6(r&9I`PDo;V6dEoc3OY+wnr|daHBdJ#}gyl!JbsR<5 zt&acVP{V!Bu4+{=Uh;Bu7R_CLNJ>d)_vpzK5f%ud+JBnjWfydsO8HSv(2@nrzHqWu zvV(F>w0;rzkQ_i~9dWWc664a)G9`aeXSF}PXQuV=?zda4Q&`94RoymK$75cNR(E8% zE>s?EjY9FGNrkYjpS5Kvrh;w>p5JCJXqPM_!XM?TP z=B4o6_bIgTk&;x!a;j{zRiEuTzbz5=QoAAsVeom7C%J7X&u$^x%8Jj~@L6}e>6fdk z1TGvhqEq#p%3RdcSK$fQOsiubJNSP;7=KDFOMgRb8bKx!sI*#dafC< zPty(cw)K>vWdJO*OV$L9V(0s1W401P`_AAH4!6(Dp(xz9OU!-akld6Q7Z=wHe7hs# zeN}fJ4nj>xI&0r~_jn?sQ)C_|jkCFoX29ZB!|8(Y$r9*dt{)f>_v1iyp7PdN$BZG9 zb2FdakhJBAJ12Fjttu0whU`IEl%gPH{kET*n?Mlql;F7cKTU(SHoslaFQn&#HDP8> zLQ;JuRgecwf7at~*oIB^sUH0duTC%Io?vGS1+&HHzdvXo6W`xwkXO1sKo~YP= z%}%SLZV^Ng`npi2#Sxu$F`OY=ZN>edKUzIqL`?C5-W0u%`5My*& z+HKzg0eW7q?2T=`Nr^qs4e%l2?_+i4+9JC(sk5C?udpU`rpTDCln7f$bqobB)~NtW zh_hpsE4Bt6@_;>wm0fnO+?TV;|Jebc0=MWE&-mHZZArZEiD29f|T7odD$Qh-?{!R z?056y`{q^mCN6K;Wh8wAXX``U$6u;Tsv=4^v77yV%N`Bo^S;@B!UFD2s3<7eEP#Uu zxi=YYW~sqighV$u!QpoIT_Nl8s?Yu#MHhJmIk8Gn&*L#|f`aNejmcZeP82YzVni_d z?`uyDVMl?_Xoqe4|LFyYkC{E&()gdimrC@u8eL|+_mxLYATJ$1TsfZTr;TO`#nzJS z;5JIqSBgoB+F!VY@wXUR^V&`l6XB+%QYA`9k=;V$H9&uQGdYkZlIOF#Ucb z-2(IT#GTa#7cvK~77>LVAB!Eov&-S%D zQ#?h5O5BS~-^C}frB%Tr z=}N0B!Y-*b`O_t-39}P~XCx5LIXJ`knBtc9Uk}b1u>)HkdN|& zY-W9%>vNS|x$)5IW+&;7gOlsOYMzCx7Iw|^u_g#7o3EZVPjnFZ`fQ@~Vj0gwwv2r@ z&>TG6RXQOs*aZFF;1>x`dB>>N<3h9(B&RA>OV&cCfOvpVztj8C-AZgvaKPK>EEUTB z63q`}uzlPKeQ)k;O{|Key=n1p4d;Mzndc#cg;X+$yYtctfIOC_`R>cbToYDX%9?C{EQfh<2ebB zM|WB%ikssd`YdXU&6_n2YzrZt^s>SiPVtQ7f(T5K)Fnv;?uQhx~bLr$Tm=Aog|+*cZ=}!A*Sot z4*HQ=5SvR05u~b*cI2JCD9GM%?{|VX*6+o~pJay*i#&u&jh~CF0~s-{rQK}1t#0@- zO5-UxB0*myYr*3bSZl^0q&FJvNcud9&|I{D8))5DL-W zqZgtF3~TD!1?pAvRn#6lsYD1Zh=VcfL(Yy5x>xSCQ=TjKvb(=1n_K|z4Am09?vg_ZUr?E@i> z3-FY!V&=j>yPssU_wZ*fq#`ejjEDpxtAhUf*l;4p7-|8iyU5eUKrbv+iEjGmwZUkv z&@R`bo~0ezhsdZW2@wU0n~`R&^Y%Z%1nkC$sE8hH`;lM%MNeBpG4p-X>mx5$^Su~B z#8NwjBwW|()$b1!@7Yre`wWurE3r1qAN%_<8s;otMM1}jPDn3=d|l2a*iy+1c-=|o zL#%DBpKhO&xBVO+i2(}@kuk7BGW{CO3PJ?s&(C92H^tOfj28s7AYz!me`d%Z>M5q0 zo1-0kBBC_k-8z;7x5)lIrX~Ce6d#SnH2UX!5tKaX0Plbk)K&24ee!$uP`|7}NYqV^zf6s&oVuuADJAd8Sp8@F*MIirPIfz&uObsZrnYp1N$}^%I z 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 z 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 literal 0 HcmV?d00001 diff --git a/libs/benchmarks/src/mapper.bench.ts b/libs/benchmarks/src/mapper.bench.ts new file mode 100644 index 00000000..b6a5248e --- /dev/null +++ b/libs/benchmarks/src/mapper.bench.ts @@ -0,0 +1,44 @@ +import { array, number, object, string } from '@cleverbrush/schema'; +import { bench, describe } from 'vitest'; +import { mapper } from '../../mapper/src/index.js'; + +const Source = object({ id: number(), name: string() }); +const Target = object({ id: number(), label: string() }); +const Parent = object({ id: number(), children: array(Source) }); +const ParentDto = object({ id: number(), children: array(Target) }); +const registry = mapper() + .configure(Source, Source, m => m) + .configure(Source, Target, m => + m.for(t => t.label).compute(s => s.name.toUpperCase()) + ) + .configure(Parent, ParentDto, m => m); +const sourceRows = Array.from({ length: 1000 }, (_, id) => ({ + id, + name: `user-${id}` +})); +const graphRows = Array.from({ length: 100 }, (_, id) => ({ + id, + children: sourceRows.slice(id, id + 10) +})); + +for (const [name, source, target, rows] of [ + ['flat copy / 1000 rows', Source, Source, sourceRows], + ['computed / 1000 rows', Source, Target, sourceRows], + ['nested arrays / 100 parents', Parent, ParentDto, graphRows] +] as const) { + // Set-up is intentionally outside the timed function. This is mapper overhead, + // not SQL/network latency or schema-construction performance. + const sync = (registry.getSyncMapper as any)(source, target); + const async = (registry.getMapper as any)(source, target); + const expected = JSON.stringify(rows.map(sync)); + if (JSON.stringify(await Promise.all(rows.map(async))) !== expected) + throw new Error('Benchmark variants must produce identical values'); + describe(`Prepared mapper: ${name}`, () => { + bench('synchronous map', () => { + rows.map(sync); + }); + bench('async Promise.all', async () => { + await Promise.all(rows.map(async)); + }); + }); +} diff --git a/libs/knex-schema/READ-SCHEMAS.md b/libs/knex-schema/READ-SCHEMAS.md new file mode 100644 index 00000000..b4e65cc5 --- /dev/null +++ b/libs/knex-schema/READ-SCHEMAS.md @@ -0,0 +1,217 @@ +# Projection-aware reads and synchronous mapping + +`withRowSchema()` is an **opt-in PostgreSQL read API**. Existing queries and +`getMapper()` retain their existing behavior. Schema-aware queries are immutable, +detached read plans: capture the returned value when adding filters or includes. +They do not track entities, save changes, or run SQL when inspecting metadata. + +## Before and after + +Previously, a projection needed a separately maintained source schema: + +```ts +const Source = object({ id: number(), name: string(), lastSeen: date().nullable() }); +const registry = mapper().configure(Source, PublicUser, m => m + .for(t => t.lastSeen).compute(s => s.lastSeen ?? undefined)); +const toUser = registry.getMapper(Source, PublicUser); +const result = await Promise.all(rows.map(toUser)); +``` + +The query now supplies that schema, and pure mapping needs no promises: + +```ts +const read = db.users.withRowSchema().select(u => ({ + id: u.id, name: u.name, lastSeen: u.lastSeen +})); +const Source = read.rowSchema; +const toUser = mapper().configure(Source, PublicUser, m => m + .for(t => t.lastSeen).compute(s => s.lastSeen ?? undefined)) + .getSyncMapper(Source, PublicUser); +const result = (await read.where(u => u.active, true)).map(toUser); +``` + +Select sensitive fields explicitly. The mapper does not fetch data, authorize +access, enrich rows, or decide how database nulls should appear in public DTOs. + +## Definitions can live in separate files + +```ts +// user-read.ts +import { createQuery, date, number, object, string } from '@cleverbrush/knex-schema'; +import { knex } from './database.js'; + +const UserTable = object({ + id: number().primaryKey(), name: string(), + lastSeen: date().optional().hasColumnName('last_seen'), + secret: string() +}).hasTableName('users'); + +export const userRead = createQuery(knex)(UserTable).withRowSchema() + .select(u => ({ id: u.id, name: u.name, lastSeen: u.lastSeen })); +export const UserRow = userRead.rowSchema; +``` + +```ts +// user-mapping.ts +import { date, number, object, string } from '@cleverbrush/schema'; +import { mapper } from '@cleverbrush/mapper'; +import { UserRow } from './user-read.js'; + +export const PublicUser = object({ + id: number(), name: string(), lastSeen: date().optional() +}); +export const toPublicUser = mapper().configure(UserRow, PublicUser, m => m + .for(t => t.lastSeen).compute(row => row.lastSeen ?? undefined)) + .getSyncMapper(UserRow, PublicUser); +``` + +```ts +// user-service.ts +import { userRead } from './user-read.js'; +import { toPublicUser } from './user-mapping.js'; + +export async function findPublicUser(id: number) { + const row = await userRead.where(u => u.id, id).first(); + return row === undefined ? undefined : toPublicUser(row); +} +``` + +Configure reusable mappings once. `where`, ordering, limits, offsets and +transaction clones retain the same `rowSchema` object. A different projection or +include produces a different schema. Independently created queries do not share +schema identity; the mapper registry keys mappings by schema identity. + +## What values does the schema describe? + +| Stored value | Decoded read value | +| --- | --- | +| Required integer/float | Finite JavaScript `number` | +| `number().bigint()` or `.decimal(p, s)` | Exact `string` | +| Optional or nullable SQL column | Present property containing its value or `null` | +| Date/timestamp | `Date`, including inside JSON relation graphs | +| Missing optional JSON property | Absent property, unlike SQL null | +| Missing optional object relation | `null` | +| Missing collection relation | `[]` | + +Exact numeric fields are cast to text **before** PostgreSQL JSON aggregation and +driver parsing. Converting a rounded JavaScript number to a string is not used. +Use the SQL-type builder methods to declare storage accurately; unknown SQL types +are rejected. A widened dynamic numeric SQL type has a conservative +`number | string` read type. Driver custom parsers must still honor the declared +representation, or decoding fails. + +Timezone-less SQL dates/timestamps are interpreted as UTC in this opt-in mode; +explicit offsets preserve their instant. Native date fields are projected as text +before decoding, so root and nested values do not depend on a driver's local-time +date parser. This is a deliberate opt-in convention, not a change to legacy reads. + +Input defaults, preprocessors and input-only validators are not replayed on stored +rows. Read schemas are structural output schemas. Optional schemas with input +defaults are rejected: `optional().default(...)` hides the storage requirement +in the inferred input/output type. Keep defaults in a separate input schema, +and use an accurately required/optional storage schema for these reads. +JavaScript `Date` has +millisecond precision: use explicit application representations if an API must +expose microseconds. Composite cursor tokens retain native timestamp precision +in private text columns, independently of the public date values. + +## Projections, aliases and aggregates + +```ts +const read = query(knex, alias(UserTable, 'user')).withRowSchema() + .leftJoin(alias(ProfileTable, 'profile'), t => eq(t.user.id, t.profile.userId)) + .select(t => ({ id: t.user.id, displayName: t.profile.displayName })); +// displayName is nullable even if ProfileTable declares it required. +const rows = await read; +read.rowSchema.validate(rows[0]); +``` + +Aliased reads require an explicit selection before execution or accessing +`rowSchema`. Declared named projections use `.projected('name')` on ordinary +readers. Typed aggregates work in object selections: count returns a safe number, +sum/average preserve exact text, and empty extrema/sums remain nullable. An explicit +Framework output schema replaces aggregate decoding and is parsed once; opaque +parser objects without schema introspection are rejected in this mode. + +## Nested graphs + +Declare relations on entities as usual, and return the child query from customizers: + +```ts +const read = db.projects.withRowSchema() + .select(p => ({ id: p.id, name: p.name })) + .include(r => r.tasks, tasks => tasks + .select(t => ({ title: t.title, createdAt: t.createdAt })) + .orderBy(t => t.id, 'desc').limit(3) + .include(r => r.notes, notes => notes.select(n => ({ body: n.body })))); +``` + +This executes one SQL statement. Child scopes, filters, ordering, projections and +limits apply independently per parent. Collections are not lazy-loaded. Required +belongs-to joins filter missing parents; `{ optional: true }` belongs-to and has-one +reads expose nullable objects. `joinOne(spec, customize)` and +`joinMany(spec, customize)` support explicit local/foreign keys without declaring +an entity relation. Use their typed child customizer for ordering/projections; +raw `foreignQuery` and post-load `mappers` cannot supply trustworthy row metadata. + +Numbered `.paginate({ page, pageSize })` performs a count and a page query. +`.paginateAfter({ limit, cursor, orderBy })` on ordinary readers reuses lossless +composite cursors, including unique-key validation. Cursor fields need not be in +the public projection. Reapply authorization filters for every page; a cursor is +not a permission or a transaction snapshot. Grouped/aggregate cursor reads are +rejected. + +## Polymorphic graphs and explicit dispatch + +STI/CTI entities produce a genuine union `rowSchema` and an object schema for each +discriminator in `variantRowSchemas`. All declared branch bodies are selected by +default. Use `selectVariants(['photo'])` to narrow the returned union, or +`forVariant()` to project a branch or load its relations: + +```ts +const read = db.assets.withRowSchema() + .forVariant('photo', q => q.include(r => r.tags)) + .forVariant('text', q => q.select(a => ({ id: a.id, kind: a.kind, body: a.body }))); + +const photoSource = read.variantRowSchemas.photo; +const textSource = read.variantRowSchemas.text; +const registry = mapper() + .configure(photoSource, PublicPhoto, configurePhoto) + .configure(textSource, PublicText, configureText); +const photo = registry.getSyncMapper(photoSource, PublicPhoto); +const text = registry.getSyncMapper(textSource, PublicText); +const result = (await read).map(row => row.kind === 'photo' ? photo(row) : text(row)); +``` + +Keep the original discriminator in branch projections. Framework intentionally +does not choose a public DTO or automatically dispatch a union mapper. Polymorphic +readers also work inside ordinary includes. A missing required CTI body or unknown +discriminator fails decoding. Explicit `allowOrphan: true` makes body fields +nullable. Union ordering/pagination applies to the combined branches, not to each +branch separately. Use `forVariant()` for branch-specific filtering/includes. + +## Boundaries and migration + +- Enter read mode **before** legacy select/include/join, ordering/pagination, + raw callbacks or variant-specific operations. Continue configuration on the + immutable reader. Default scopes may filter rows but must not preselect, + order or paginate them. +- The opt-in surface is deliberately read-only. It is not a replacement for + entity writes or tracked queries, and has no raw SQL shape escape hatch. +- Reads are PostgreSQL-oriented; this does not promise equivalent JSON/CTI SQL + behavior on other Knex dialects. +- Declared graph metadata must match storage. Unsupported opaque shapes throw + rather than pretending an entity schema describes their output. Explicit + TypeScript assertions such as `hasType()` remain the caller's responsibility. +- Existing queries keep their old mutability and driver-value behavior. Migrate + one read at a time; do not replace all application nulls or numeric values + globally. +- `getSyncMapper()` accepts only complete mappings with synchronous final steps + and nested mappings. It never probes callbacks. Known async mappings are + rejected; a disguised thenable throws when invoked. Keep `getMapper()` for + asynchronous work. Fetch/enrich data explicitly before pure mapping. + +Run the mapper-only benchmark with +`npm run bench -- --project benchmarks mapper.bench.ts`. It compares prepared +sync/async functions with identical rows and excludes SQL/network time. Do not +interpret its result as an endpoint-latency guarantee. diff --git a/libs/knex-schema/README.md b/libs/knex-schema/README.md index 0b5421de..75815930 100644 --- a/libs/knex-schema/README.md +++ b/libs/knex-schema/README.md @@ -10,6 +10,24 @@ npm install @cleverbrush/knex-schema **Peer dependency:** `knex >= 3.1.0` +## Opt-in projection-aware reads + +Call `.withRowSchema()` before selecting or including fields to get an immutable, +detached PostgreSQL read query. Its `rowSchema` describes the actual decoded +projection, including SQL nulls, nested dates and exact decimal/bigint strings. + +```ts +const read = query(knex, UserSchema).withRowSchema() + .select(u => ({ id: u.id, createdAt: u.createdAt })); +const SourceSchema = read.rowSchema; // metadata only; no SQL +const rows = await read.where(u => u.id, 42); +``` + +Supports typed flat joins/aggregates, declared and explicit nested relations, +named projections, composite cursors and STI/CTI branch schemas. Existing query +behavior is unchanged. See the [consumer guide](./READ-SCHEMAS.md) for multi-file +mapping examples, representation rules, supported operations and migration limits. + ## Quick Start ```typescript diff --git a/libs/knex-schema/integration/queries.test.ts b/libs/knex-schema/integration/queries.test.ts index dcc6ea59..b0c7fb8a 100644 --- a/libs/knex-schema/integration/queries.test.ts +++ b/libs/knex-schema/integration/queries.test.ts @@ -1,4 +1,5 @@ import { randomUUID } from 'node:crypto'; +import { mapper } from '@cleverbrush/mapper'; import { aggregate, alias, @@ -71,6 +72,132 @@ const taskEntity = defineEntity(Task) t => t.taskId ); const db = createDb(knex, { tasks: taskEntity }); + +it('schema-aware reads stay detached in a tracked context', async () => { + const tracked = createDb(knex, { tasks: taskEntity }, { tracking: true }); + const calls: unknown[] = []; + const listener = (sql: unknown) => calls.push(sql); + knex.on('query', listener); + try { + const read = tracked.tasks + .withRowSchema() + .select(t => ({ id: t.id, title: t.title })); + expect(calls).toHaveLength(0); + const row = await read.where(t => t.id, 102).first(); + expect(calls).toHaveLength(1); + expect(() => tracked.entry(row!)).toThrow(/not tracked/i); + expect(await read.where(t => t.id, 102).first()).not.toBe(row); + } finally { + knex.off('query', listener); + } +}); + +it('schema-aware explicit joins preserve nullable objects and custom collections', async () => { + const read = query(knex, Task) + .withRowSchema() + .select(t => ({ id: t.id })) + .joinOne( + { + as: 'person', + localColumn: t => t.ownerId, + foreignColumn: u => u.id, + foreignSchema: User, + required: false + }, + q => q.select(u => ({ name: u.name })) + ) + .joinMany( + { + as: 'comments', + localColumn: t => t.id, + foreignColumn: n => n.taskId, + foreignSchema: Note + }, + q => + q + .select(n => ({ text: n.body })) + .orderBy(n => n.id, 'desc') + .limit(1) + ) + .where(t => t.id, 104); + const row = await read.first(); + expect(row).toEqual({ id: 104, person: null, comments: [{ text: 'two' }] }); + expect(read.rowSchema.validate(row).valid).toBe(true); +}); + +it('schema-aware optional belongs-to joins keep unmatched parents', async () => { + const optional = defineEntity(Task).belongsTo( + t => t.owner, + t => t.ownerId, + u => u.id, + { optional: true } + ); + const read = query(knex, optional.schema) + .withRowSchema() + .select(t => ({ id: t.id })) + .include( + r => r.owner, + q => q.select(u => ({ name: u.name })) + ) + .where(t => t.id, 104); + const row = await read.first(); + expect(row).toEqual({ id: 104, owner: null }); + expect(read.rowSchema.validate(row).valid).toBe(true); +}); + +it('schema-aware flat joins preserve precision and scoped outer join nulls', async () => { + const read = query(knex, alias(Task, 'task')) + .withRowSchema() + .leftJoin(alias(User, 'owner'), t => eq(t.task.ownerId, t.owner.id)) + .select(t => ({ + id: t.task.id, + amount: t.task.amount, + date: t.task.createdAt, + owner: t.owner.name + })) + .orderBy(t => t.task.id); + const rows = await read; + expect(rows.find(r => r.id === 102)?.amount).toBe( + '9007199254740993.000001' + ); + expect(rows.find(r => r.id === 104)?.owner).toBeNull(); + expect(rows.find(r => r.id === 102)?.owner).toBe('Alice'); + expect( + rows.every( + r => r.date instanceof Date && read.rowSchema.validate(r).valid + ) + ).toBe(true); +}); + +it('schema-aware cursor pages keep microsecond ordering private', async () => { + const read = db.tasks + .withRowSchema() + .select(t => ({ title: t.title })) + .include(r => r.notes) + .where(t => t.projectId, 1); + const first = await read.paginateAfter({ + limit: 2, + orderBy: [ + { column: t => t.createdAt, direction: 'desc' }, + { column: t => t.id, direction: 'desc' } + ] + }); + const second = await read.paginateAfter({ + limit: 2, + cursor: first.nextCursor, + orderBy: [ + { column: t => t.createdAt, direction: 'desc' }, + { column: t => t.id, direction: 'desc' } + ] + }); + expect(first.data.map(row => row.title)).toEqual(['B', 'A']); + expect(second.data.map(row => row.title)).toEqual(['A', 'C']); + expect(second.hasMore).toBe(false); + expect(Object.keys(first.data[0]).sort()).toEqual(['notes', 'title']); + expect(first.data.every(row => read.rowSchema.validate(row).valid)).toBe( + true + ); +}); const orderBy = [ { column: (t: any) => t.createdAt, direction: 'desc' as const }, { column: (t: any) => t.id, direction: 'desc' as const } @@ -173,6 +300,76 @@ afterAll(async () => { }); describe('flat joins', () => { + it('reads exact values and selected relation schemas without hidden queries', async () => { + const read = db.tasks + .withRowSchema() + .select(t => ({ + id: t.id, + amount: t.amount, + createdAt: t.createdAt + })) + .include( + t => t.notes, + q => + q.select(n => ({ body: n.body })).orderBy(n => n.id, 'desc') + ) + .where(t => t.id, 104); + let queries = 0; + const onQuery = () => { + queries++; + }; + knex.on('query', onQuery); + try { + expect(read.rowSchema).toBe(read.where(t => t.id, 104).rowSchema); + expect(queries).toBe(0); + const rows = await read; + expect(queries).toBe(1); + expect(rows).toEqual([ + { + id: 104, + amount: '0.200000', + createdAt: expect.any(Date), + notes: [{ body: 'two' }, { body: 'one' }] + } + ]); + expect(read.rowSchema.validate(rows[0]).valid).toBe(true); + const exact = await db.tasks + .withRowSchema() + .where(t => t.id, 102) + .select(t => ({ amount: t.amount })) + .first(); + expect(exact).toEqual({ amount: '9007199254740993.000001' }); + const AmountRow = db.tasks + .withRowSchema() + .select(t => ({ amount: t.amount })); + const PublicAmount = object({ amount: string().optional() }); + const toPublic = mapper() + .configure(AmountRow.rowSchema, PublicAmount, m => + m.for(t => t.amount).compute(s => s.amount ?? undefined) + ) + .getSyncMapper(AmountRow.rowSchema, PublicAmount); + expect( + (await AmountRow.where(t => t.id, 102)).map(toPublic) + ).toEqual([{ amount: '9007199254740993.000001' }]); + } finally { + knex.off('query', onQuery); + } + }); + + it('decodes typed aggregate outputs once in schema-aware reads', async () => { + const read = db.tasks + .withRowSchema() + .where(t => t.projectId, 1) + .select(t => ({ + count: aggregate.count(), + total: aggregate.sum(t.amount) + })); + const [row] = await read; + expect(row.count).toBe(4); + expect(typeof row.total).toBe('string'); + expect(read.rowSchema.validate(row).valid).toBe(true); + }); + it('executes ordinary and aliased queries through a bound transaction callback', async () => { const result = await createQuery(knex).transaction(async tx => ({ ordinary: await tx(Task) diff --git a/libs/knex-schema/integration/read-graphs.test.ts b/libs/knex-schema/integration/read-graphs.test.ts new file mode 100644 index 00000000..7d6b4917 --- /dev/null +++ b/libs/knex-schema/integration/read-graphs.test.ts @@ -0,0 +1,278 @@ +import { randomUUID } from 'node:crypto'; +import { + array, + createDb, + date, + defineEntity, + number, + object, + string +} from '@cleverbrush/orm'; +import Knex from 'knex'; +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; + +const connection = process.env.QUERY_TEST_DATABASE_URL; +if (!connection) throw new Error('QUERY_TEST_DATABASE_URL is required'); +const knex = Knex({ client: 'pg', connection }); +const prefix = `cb_read_${randomUUID().replaceAll('-', '')}`; +const names = { + albums: `${prefix}_albums`, + assets: `${prefix}_assets`, + photos: `${prefix}_photos`, + labels: `${prefix}_labels` +}; +const Label = object({ + id: number().primaryKey(), + assetId: number().hasColumnName('asset_id'), + label: string(), + addedAt: date().hasColumnName('added_at') +}).hasTableName(names.labels); +const Photo = defineEntity( + object({ + assetId: number().primaryKey().hasColumnName('asset_id'), + size: number().bigint(), + takenAt: date().hasColumnName('taken_at'), + labels: array(Label).optional() + }).hasTableName(names.photos) +).hasMany( + p => p.labels, + p => p.assetId, + l => l.assetId +); +const Asset = defineEntity( + object({ + id: number().primaryKey(), + kind: string().hasColumnName('asset_kind'), + albumId: number().hasColumnName('album_id'), + rank: number().decimal(24, 6), + createdAt: date().hasColumnName('created_at') + }).hasTableName(names.assets) +) + .discriminator(a => a.kind) + .ctiVariant('photo', Photo, p => p.assetId) + .stiVariant('text', object({ body: string() })); +const Album = defineEntity( + object({ + id: number().primaryKey(), + assets: array(Asset.schema).optional() + }).hasTableName(names.albums) +).hasMany( + a => a.assets, + a => a.id, + a => a.albumId +); +const db = createDb(knex, { assets: Asset, albums: Album }); + +beforeAll(async () => { + await knex.schema.createTable(names.albums, t => { + t.integer('id').primary(); + }); + await knex.schema.createTable(names.assets, t => { + t.integer('id').primary(); + t.text('asset_kind'); + t.integer('album_id'); + t.decimal('rank', 24, 6); + t.timestamp('created_at', { useTz: true }); + t.text('body'); + }); + await knex.schema.createTable(names.photos, t => { + t.integer('asset_id').primary(); + t.bigInteger('size'); + t.timestamp('taken_at', { useTz: true }); + }); + await knex.schema.createTable(names.labels, t => { + t.integer('id').primary(); + t.integer('asset_id'); + t.text('label'); + t.timestamp('added_at', { useTz: true }); + }); + await knex(names.albums).insert([{ id: 1 }, { id: 2 }]); + await knex(names.assets).insert([ + { + id: 1, + asset_kind: 'photo', + album_id: 1, + rank: '10.000001', + created_at: '2026-01-01T00:00:00Z' + }, + { + id: 2, + asset_kind: 'text', + album_id: 1, + rank: '2.000001', + created_at: '2026-01-01T00:00:00Z', + body: 'hello' + } + ]); + await knex(names.photos).insert({ + asset_id: 1, + size: '9007199254740993', + taken_at: '2026-01-02T00:00:00Z' + }); + await knex(names.labels).insert([ + { + id: 1, + asset_id: 1, + label: 'first', + added_at: '2026-01-03T00:00:00Z' + }, + { + id: 2, + asset_id: 1, + label: 'second', + added_at: '2026-01-04T00:00:00Z' + } + ]); +}); +afterAll(async () => { + for (const table of [ + names.labels, + names.photos, + names.assets, + names.albums + ]) + await knex.schema.dropTableIfExists(table); + await knex.destroy(); +}); + +describe('schema-aware polymorphic graphs', () => { + it('orders using native values even when branch projections omit sort fields', async () => { + const read = db.assets + .withRowSchema() + .forVariant('photo', q => + q.select(a => ({ id: a.id, kind: a.kind })) + ) + .forVariant('text', q => + q.select(a => ({ id: a.id, kind: a.kind })) + ) + .orderBy(a => a.rank); + expect(await read).toEqual([ + { id: 2, kind: 'text' }, + { id: 1, kind: 'photo' } + ]); + expect(await read.selectVariants(['photo'])).toEqual([ + { id: 1, kind: 'photo' } + ]); + expect(() => + db.assets + .withRowSchema() + .forVariant('text', q => q.select(a => ({ id: a.id }))) + ).toThrow(/retain.*discriminator/); + }); + it('exposes exact branch schemas, dates and numeric ordering in one statement', async () => { + const read = db.assets + .withRowSchema() + .forVariant('photo', q => + q.include( + r => r.labels, + labels => labels.orderBy(l => l.id, 'desc').limit(1) + ) + ) + .orderBy(a => a.rank); + const calls: unknown[] = []; + const listener = (sql: unknown) => calls.push(sql); + knex.on('query', listener); + try { + expect(read.rowSchema.introspect().type).toBe('union'); + expect(read.limit(1).rowSchema).toBe(read.rowSchema); + expect(calls).toHaveLength(0); + const rows = await read; + expect(calls).toHaveLength(1); + expect(rows.map(r => r.id)).toEqual([2, 1]); + const photo = rows[1]; + expect(photo).toMatchObject({ + kind: 'photo', + size: '9007199254740993', + rank: '10.000001', + labels: [{ label: 'second' }] + }); + expect(photo.createdAt).toBeInstanceOf(Date); + if (photo.kind === 'photo') { + expect(photo.takenAt).toBeInstanceOf(Date); + expect(photo.labels[0].addedAt).toBeInstanceOf(Date); + expect(read.variantRowSchemas.photo.validate(photo).valid).toBe( + true + ); + } + expect(rows.every(row => read.rowSchema.validate(row).valid)).toBe( + true + ); + } finally { + knex.off('query', listener); + } + }); + + it('decodes nested polymorphic relations and empty arrays without hidden fetches', async () => { + const read = db.albums + .withRowSchema() + .include( + r => r.assets, + assets => + assets + .forVariant('photo', q => q.include(r => r.labels)) + .orderBy(a => a.id) + ) + .orderBy(a => a.id); + const rows = await read; + expect(rows[0].assets).toHaveLength(2); + expect(rows[1].assets).toEqual([]); + const photo = rows[0].assets[0]; + if (photo.kind !== 'photo') throw new Error('expected photo'); + expect(photo.size).toBe('9007199254740993'); + expect(photo.labels[0].addedAt).toBeInstanceOf(Date); + expect(read.rowSchema.validate(rows[0]).valid).toBe(true); + }); + + it('rejects unknown discriminators and missing required CTI bodies', async () => { + await knex(names.assets).insert([ + { + id: 3, + asset_kind: 'unknown', + album_id: 2, + rank: '1', + created_at: new Date() + }, + { + id: 4, + asset_kind: 'photo', + album_id: 2, + rank: '1', + created_at: new Date() + } + ]); + try { + await expect( + db.assets + .withRowSchema() + .where(a => a.id, 3) + .execute() + ).rejects.toThrow('unknown polymorphic discriminator'); + await expect( + db.assets + .withRowSchema() + .where(a => a.id, 4) + .execute() + ).rejects.toThrow('missing CTI variant body'); + const tolerant = defineEntity(Asset.schema) + .discriminator(a => a.kind) + .ctiVariant('photo', Photo, p => p.assetId, { + allowOrphan: true + }); + const reader = createDb(knex, { assets: tolerant }) + .assets.withRowSchema() + .where(a => a.id, 4); + const orphan = await reader.first(); + expect(orphan).toMatchObject({ + id: 4, + kind: 'photo', + size: null, + takenAt: null + }); + expect(reader.variantRowSchemas.photo.validate(orphan!).valid).toBe( + true + ); + } finally { + await knex(names.assets).whereIn('id', [3, 4]).delete(); + } + }); +}); diff --git a/libs/knex-schema/package.json b/libs/knex-schema/package.json index e65e3c6f..46c60b9e 100644 --- a/libs/knex-schema/package.json +++ b/libs/knex-schema/package.json @@ -13,7 +13,8 @@ "description": "Type-safe schema-driven query builder for Knex using @cleverbrush/schema — strongly typed CRUD, eager loading, and column mapping for PostgreSQL", "files": [ "dist", - "COMPOSABLE_QUERIES.md" + "COMPOSABLE_QUERIES.md", + "READ-SCHEMAS.md" ], "homepage": "https://docs.cleverbrush.com/knex-schema", "keywords": [ diff --git a/libs/knex-schema/src/AliasedReadQuery.ts b/libs/knex-schema/src/AliasedReadQuery.ts new file mode 100644 index 00000000..8b34cb1f --- /dev/null +++ b/libs/knex-schema/src/AliasedReadQuery.ts @@ -0,0 +1,234 @@ +import { type InferType, object } from '@cleverbrush/schema'; +import type { Knex } from 'knex'; +import type { + AliasedQueryBuilder, + AliasTables, + JoinPredicate, + TableAlias +} from './aliased-query.js'; +import { + type AggregateExpression, + type AliasedColumn, + COLUMN +} from './expressions.js'; +import { compileReadProjection, type ReadField } from './read-projection.js'; +import { + compileReadSchema, + decodeObject, + type ReadObject, + ReadSchemaError, + type ReadValue, + type SchemaForValue +} from './read-schema.js'; +import type { ReadColumn, ReadProjection } from './SchemaReadQuery.js'; + +/** Schema-backed aliases whose exact numeric and outer-join values match decoded rows. */ +export type ReadAliasTables = { + [A in keyof T]: { + [K in keyof T[A]]: T[A][K] extends AliasedColumn + ? ReadColumn< + SchemaForValue | (N extends true ? null : never)> + > + : never; + }; +}; +type Selection = Record | AggregateExpression>; +type Selector = (tables: ReadAliasTables) => AliasedColumn; + +/** Immutable flat joined read. Supply select() before accessing rowSchema or executing. */ +export class AliasedReadQuery { + private fields?: Record; + private schema?: Row; + /** @internal Enter through an aliased query's withRowSchema() method. */ + constructor(private planner: AliasedQueryBuilder) {} + + /** Exact structural schema, stable across operations that do not change selection. */ + get rowSchema(): Row { + if (!this.schema) + throw new ReadSchemaError( + 'Aliased reads require an explicit select projection' + ); + return this.schema; + } + private copy(): this { + return Object.assign(Object.create(Object.getPrototypeOf(this)), this, { + planner: this.planner.cloneReadSource() + }); + } + /** Add an immutable inner join with typed alias predicates. */ + join( + table: N extends keyof T ? never : TableAlias, + on: (tables: ReadAliasTables>) => JoinPredicate + ): AliasedReadQuery, Row> { + const copy = this.copy(); + copy.planner = copy.planner.join(table, on as any) as any; + return copy as any; + } + /** Add an immutable left join; projected right-side fields are nullable. */ + leftJoin( + table: N extends keyof T ? never : TableAlias, + on: ( + tables: ReadAliasTables> + ) => JoinPredicate + ): AliasedReadQuery, Row> { + const copy = this.copy(); + copy.planner = copy.planner.leftJoin(table, on as any) as any; + return copy as any; + } + /** Select exact columns and aggregates; opaque raw expressions are deliberately unsupported. */ + select

( + select: (tables: ReadAliasTables) => P + ): AliasedReadQuery> { + if (this.fields) + throw new ReadSchemaError( + 'Only one projection is allowed per read query' + ); + const { knex, columns } = this.planner.readContext(); + const entries = Object.values( + columns as Record>> + ).flatMap(table => Object.values(table)); + const copy = this.copy(); + copy.fields = compileReadProjection( + knex, + select(columns as ReadAliasTables), + column => { + if (!entries.includes(column)) + throw new ReadSchemaError( + 'Projection column does not belong to this query' + ); + const info = column[COLUMN]; + return { + name: `${info.alias}.${info.column}`, + node: compileReadSchema(info.schema) + }; + } + ); + copy.schema = object( + Object.fromEntries( + Object.entries(copy.fields).map(([key, field]) => [ + key, + field.node.schema + ]) + ) + ) as unknown as Row; + return copy as any; + } + /** Add a bound equality predicate. */ + where(column: Selector, value: unknown): this; + /** Add a bound predicate with an explicit supported operator. */ + where(column: Selector, operator: string, value: unknown): this; + /** Return a filtered clone without changing metadata identity. */ + where(column: Selector, ...args: [unknown] | [string, unknown]): this { + const copy = this.copy(); + if (args.length === 1) copy.planner.where(column as any, args[0]); + else copy.planner.where(column as any, args[0], args[1]); + return copy; + } + /** Match SQL null, including absent outer-joined rows. */ + whereNull(column: Selector): this { + const copy = this.copy(); + copy.planner.whereNull(column as any); + return copy; + } + /** Exclude SQL null without silently narrowing result types. */ + whereNotNull(column: Selector): this { + const copy = this.copy(); + copy.planner.whereNotNull(column as any); + return copy; + } + /** Match a bound value list. */ + whereIn(column: Selector, values: readonly unknown[]): this { + const copy = this.copy(); + copy.planner.whereIn(column as any, values); + return copy; + } + /** Order by native database values before decoding. */ + orderBy(column: Selector, direction: 'asc' | 'desc' = 'asc'): this { + const copy = this.copy(); + copy.planner.orderBy(column as any, direction); + return copy; + } + /** Group native columns for an aggregate projection. */ + groupBy(...columns: Selector[]): this { + const copy = this.copy(); + copy.planner.groupBy(...(columns as any)); + return copy; + } + /** Filter grouped rows using native SQL aggregate values. */ + having( + value: ( + tables: ReadAliasTables + ) => AggregateExpression | AliasedColumn, + operator: string, + right: unknown + ): this { + const copy = this.copy(); + copy.planner.having(value as any, operator, right); + return copy; + } + /** Limit the flat row count, including repeated parents produced by joins. */ + limit(count: number): this { + if (!Number.isInteger(count) || count < 0) + throw new ReadSchemaError('Limit must be a non-negative integer'); + const copy = this.copy(); + copy.planner.limit(count); + return copy; + } + /** Offset flat rows using caller-supplied deterministic ordering. */ + offset(count: number): this { + if (!Number.isInteger(count) || count < 0) + throw new ReadSchemaError('Offset must be a non-negative integer'); + const copy = this.copy(); + copy.planner.offset(count); + return copy; + } + /** Use a caller-owned transaction without mutating the original read query. */ + transacting(trx: Knex.Transaction): this { + const copy = this.copy(); + copy.planner = copy.planner.transacting(trx); + return copy; + } + /** @internal Compile selected fields, casting exact numeric values before driver parsing. */ + compile(): Knex.QueryBuilder { + void this.rowSchema; + const { sql, knex } = this.planner.readContext(); + return sql + .clearSelect() + .select( + Object.fromEntries( + Object.entries(this.fields!).map(([key, field]) => [ + key, + field.expression(knex) + ]) + ) + ); + } + /** Render SQL for debugging without executing it. */ + toQuery(): string { + return this.compile().toQuery(); + } + /** Execute one statement and validate/decode its detached results. */ + async execute(): Promise[]> { + const nodes = Object.fromEntries( + Object.entries(this.fields ?? {}).map(([key, field]) => [ + key, + field.node + ]) + ); + return (await this.compile()).map((row: unknown) => + decodeObject(nodes, row, 'row') + ); + } + /** Fetch the first selected row, or undefined. */ + async first(): Promise | undefined> { + return (await this.limit(1).execute())[0]; + } + /** Awaiting executes this reader; repeated awaits execute again. */ + // biome-ignore lint/suspicious/noThenProperty: query readers intentionally support await + then[], E = never>( + resolve?: ((rows: InferType[]) => R | PromiseLike) | null, + reject?: ((error: any) => E | PromiseLike) | null + ): Promise { + return this.execute().then(resolve, reject); + } +} diff --git a/libs/knex-schema/src/PolymorphicReadQuery.ts b/libs/knex-schema/src/PolymorphicReadQuery.ts new file mode 100644 index 00000000..e813f368 --- /dev/null +++ b/libs/knex-schema/src/PolymorphicReadQuery.ts @@ -0,0 +1,564 @@ +import { + type InferType, + type ObjectSchemaBuilder, + object, + type SchemaBuilder, + string, + type UnionSchemaBuilder, + union +} from '@cleverbrush/schema'; +import type { Knex } from 'knex'; +import { buildColumnMap, getPrimaryKeyColumns } from './columns.js'; +import type { SchemaProps } from './entity.js'; +import { COLUMN } from './expressions.js'; +import { getVariants } from './extension.js'; +import { + getEffectiveBaseQuery, + getSchemaQueryBuilderCtor +} from './operations/helpers.js'; +import { privateColumn } from './operations/ordering.js'; +import type { + EntityReadSchema, + ReadRelations, + ReadVariantMetadata +} from './read-entity.js'; +import { + type ObjectReadSchema, + type ReadObject, + type ReadSchema, + ReadSchemaError, + type SchemaForValue +} from './read-schema.js'; +import { + READ_QUERY, + type ReadColumns, + type ReadCorrelation, + type ReadQueryShape, + SchemaReadQuery +} from './SchemaReadQuery.js'; + +type VariantMap = + ReadVariantMetadata extends { variants: infer V } ? V : {}; +type VariantBody> = VariantMap[K] extends { + schema: infer Body; +} + ? Body + : never; +type VariantKey> = VariantMap[K] extends { + foreignKey: infer FK extends string; +} + ? FK + : never; +type Discriminator = + ReadVariantMetadata extends { discriminator: infer D extends string } + ? D + : never; +type BranchProps> = Omit< + SchemaProps, + keyof ReadRelations +> & + Omit< + SchemaProps>, + keyof ReadRelations> | VariantKey + >; +type OrphanProps = { + [K in keyof P & string]: V extends { allowOrphan: true } + ? SchemaForValue | null> + : P[K] extends ReadSchema + ? P[K] + : never; +}; +/** Runtime object schema for one polymorphic discriminator branch. */ +export type VariantReadSchema< + S extends ReadObject, + K extends keyof VariantMap & string +> = ObjectSchemaBuilder< + Omit< + SchemaProps>>, + keyof SchemaProps> | Discriminator + > & + OrphanProps< + Omit< + SchemaProps< + ObjectReadSchema< + VariantBody, + keyof ReadRelations> + > + >, + VariantKey | Discriminator + >, + VariantMap[K] + > & + Record, SchemaBuilder> +>; +/** Per-variant schemas for explicit application-level discriminator dispatch. */ +export type VariantReadSchemas = { + [K in keyof VariantMap & string]: VariantReadSchema; +}; +/** The genuine union schema returned for polymorphic read rows. */ +export type PolymorphicRowSchema> = + UnionSchemaBuilder, true, false, InferType>; +type BranchSource< + S extends ReadObject, + K extends keyof VariantMap & string +> = EntityReadSchema< + ObjectSchemaBuilder>, + ReadRelations & ReadRelations> +>; +type BranchQueries< + S extends ReadObject, + B extends Record +> = { + [K in keyof B & keyof VariantMap & string]: SchemaReadQuery< + BranchSource, + B[K], + ReadRelations & ReadRelations> + >; +}; +type Selector = ( + columns: ReadColumns> +) => { readonly [COLUMN]: { column: string } }; + +/** + * Immutable polymorphic read graph. Branches are combined in one PostgreSQL statement; + * rowSchema is a real discriminated union and variantRowSchemas supplies object schemas + * for separately configured mappers. Framework does not choose application DTO mappings. + */ +export class PolymorphicReadQuery< + S extends ReadObject, + B extends Record = VariantReadSchemas +> { + /** @internal Nominal identity for typed child-query customizers. */ + declare readonly [READ_QUERY]: true; + /** Runtime union matching decoded results, including selected variant bodies. */ + readonly rowSchema: PolymorphicRowSchema; + /** Stable object schemas keyed by discriminator, suitable for mapper.configure(). */ + readonly variantRowSchemas: Readonly; + private branches: Record>; + private fallback: SchemaReadQuery; + private orders: Array<{ key: string; direction: 'asc' | 'desc' }> = []; + private rowLimit?: number; + private rowOffset?: number; + private includeUnknown = true; + + /** @internal Use withRowSchema() instead of constructing polymorphic readers. */ + constructor( + private readonly knex: Knex, + private readonly source: S, + private readonly base: Knex.QueryBuilder + ) { + const config = getVariants(source); + if (!config) + throw new ReadSchemaError('No polymorphic variants are declared'); + this.branches = Object.create(null); + for (const key of Object.keys(config.variants)) + this.branches[key] = this.branch(key, true); + const common = this.commonSource(); + const discriminator = + buildColumnMap(source).propToCol.get(config.discriminatorKey) ?? + config.discriminatorKey; + // Invert only the discriminator guard, not caller/default-scope filters. + this.fallback = new SchemaReadQuery( + knex, + common, + knex + .from(base.clone().as('__read_unknown')) + .where(q => + q + .whereNotIn(discriminator, Object.keys(config.variants)) + .orWhereNull(discriminator) + ) + ); + const schemas = Object.fromEntries( + Object.entries(this.branches).map(([key, q]) => [key, q.rowSchema]) + ); + this.variantRowSchemas = Object.freeze(schemas) as Readonly; + this.rowSchema = this.unionSchema( + schemas + ) as unknown as PolymorphicRowSchema; + } + + private commonSource(): ReadObject { + const info = this.source.introspect(); + return (object(info.properties) as any) + .withExtension('tableName', info.extensions?.tableName) + .withExtension('relations', info.extensions?.relations ?? []); + } + + private unionSchema(schemas: Record): ReadSchema { + const [first, ...rest] = Object.values(schemas); + if (!first) + throw new ReadSchemaError( + 'A polymorphic read requires at least one variant' + ); + return rest.reduce( + (result: any, schema) => result.or(schema), + union(first) + ); + } + + private branch(key: string, body: boolean): SchemaReadQuery { + const config = getVariants(this.source)!; + const variant = config.variants[key]; + const baseInfo = this.source.introspect(); + const baseProperties = baseInfo.properties as Record< + string, + ReadSchema + >; + const variantProperties = variant.schema.introspect() + .properties as Record; + const commonRelations = (baseInfo.extensions?.relations ?? []) as any[]; + const declaredRelations = (variant.schema.introspect().extensions + ?.relations ?? []) as any[]; + const variantRelations = body + ? [ + ...declaredRelations, + ...variant.relations.filter( + r => !declaredRelations.some(d => d.name === r.name) + ) + ] + : []; + const excluded = new Set( + [...commonRelations, ...variantRelations].map(r => r.name) + ); + const baseCols = buildColumnMap(this.source).propToCol; + const variantCols = buildColumnMap(variant.schema).propToCol; + const baseAlias = '__read_poly_base'; + const bodyAlias = '__read_poly_body'; + const basePk = getPrimaryKeyColumns(this.source).columnNames; + const query = this.knex + .from(this.base.clone().as(baseAlias)) + .where( + `${baseAlias}.${baseCols.get(config.discriminatorKey) ?? config.discriminatorKey}`, + key + ); + if (body && variant.storage === 'cti') { + if (basePk.length !== 1) + throw new ReadSchemaError( + 'CTI read graphs require a single-column primary key' + ); + const Constructor = getSchemaQueryBuilderCtor(); + const bodyQuery = getEffectiveBaseQuery( + new Constructor(this.knex, variant.schema) + ).clone(); + query.leftJoin( + bodyQuery.as(bodyAlias), + `${bodyAlias}.${variant.foreignKey}`, + `${baseAlias}.${basePk[0]}` + ); + } + const columns: Record = Object.create(null); + const properties: Record = Object.create(null); + for (const [name, schema] of Object.entries(baseProperties)) { + if (excluded.has(name)) continue; + columns[name] = this.knex.raw('??', [ + `${baseAlias}.${baseCols.get(name) ?? name}` + ]); + properties[name] = (schema as any).withExtension( + 'columnName', + name + ); + } + if (body) + for (const [name, schema] of Object.entries(variantProperties)) { + if ( + excluded.has(name) || + (variant.storage === 'cti' && + variantCols.get(name) === variant.foreignKey) + ) + continue; + columns[name] = this.knex.raw('??', [ + `${variant.storage === 'cti' ? bodyAlias : baseAlias}.${variantCols.get(name) ?? name}` + ]); + properties[name] = ( + variant.allowOrphan ? schema.nullable() : (schema as any) + ).withExtension('columnName', name); + } + properties[config.discriminatorKey] = string(key); + const basePrimaryProperty = buildColumnMap(this.source).colToProp.get( + basePk[0] + ); + const variantForeignProperty = buildColumnMap( + variant.schema + ).colToProp.get(variant.foreignKey ?? ''); + const relations = [...commonRelations, ...variantRelations].map( + relation => ({ + ...relation, + localKey: + relation.localKey === variantForeignProperty + ? basePrimaryProperty + : relation.localKey, + foreignKey: + relation.type === 'belongsTo' + ? (buildColumnMap(variant.schema).colToProp.get( + relation.foreignKey + ) ?? relation.foreignKey) + : relation.foreignKey + }) + ); + let schema = (object(properties) as any) + .withExtension('tableName', '__read_poly_source') + .withExtension('relations', relations); + if (body && variant.storage === 'cti' && !variant.allowOrphan) { + if (Object.hasOwn(properties, '__read_cti_present')) + throw new ReadSchemaError('Reserved CTI read column collision'); + columns.__read_cti_present = this.knex.raw('??', [ + `${bodyAlias}.${variant.foreignKey}` + ]); + schema = schema.withExtension( + 'readOrphanColumn', + '__read_cti_present' + ); + } + return new SchemaReadQuery( + this.knex, + schema, + query.select(columns) + ); + } + + private copy(): this { + return Object.assign(Object.create(Object.getPrototypeOf(this)), this, { + branches: { ...this.branches }, + orders: [...this.orders] + }); + } + + /** @internal Check the identity of the original read source, retained by clones. */ + sameSource(other: unknown): boolean { + return ( + other instanceof PolymorphicReadQuery && + this.base === other.base && + this.source === other.source + ); + } + + private refresh(): void { + const schemas = Object.fromEntries( + Object.entries(this.branches).map(([key, q]) => [key, q.rowSchema]) + ); + Object.assign(this, { + variantRowSchemas: Object.freeze(schemas), + rowSchema: this.unionSchema(schemas) + }); + } + + /** Add a comparison to every branch without changing its declared result schema. */ + where(selector: Selector, value: unknown): this; + /** Add an explicit supported comparison operator to every branch. */ + where(selector: Selector, operator: string, value: unknown): this; + /** Add a bound comparison; existing reader instances remain unchanged. */ + where(selector: Selector, ...args: unknown[]): this { + const copy = this.copy(); + for (const [key, branch] of Object.entries(copy.branches)) + copy.branches[key] = (branch.where as Function)(selector, ...args); + copy.fallback = (copy.fallback.where as Function)(selector, ...args); + return copy; + } + /** Order all variants together, not independently within each branch. */ + orderBy(selector: Selector, direction: 'asc' | 'desc' = 'asc'): this { + if (direction !== 'asc' && direction !== 'desc') + throw new ReadSchemaError('Invalid ordering direction'); + const properties = this.source.introspect().properties; + const key = selector( + Object.fromEntries( + Object.keys(properties).map(k => [ + k, + { [COLUMN]: { column: k } } + ]) + ) as any + )[COLUMN].column; + if (!Object.hasOwn(properties, key)) + throw new ReadSchemaError('Unknown polymorphic ordering column'); + const copy = this.copy(); + copy.orders.push({ key, direction }); + return copy; + } + /** Limit the combined result across all variants. */ + limit(count: number): this { + if (!Number.isInteger(count) || count < 0) + throw new ReadSchemaError('Limit must be a non-negative integer'); + const copy = this.copy(); + copy.rowLimit = count; + return copy; + } + /** Restrict returned discriminator branches and narrow both runtime and inferred schemas. */ + selectVariants( + keys: K + ): PolymorphicReadQuery> { + if ( + !keys.length || + new Set(keys).size !== keys.length || + keys.some(key => !Object.hasOwn(this.branches, key)) + ) + throw new ReadSchemaError( + 'Select a non-empty set of declared variants without duplicates' + ); + const copy = this.copy(); + copy.branches = Object.fromEntries( + keys.map(key => [key, this.branches[key]]) + ); + copy.includeUnknown = false; + copy.refresh(); + return copy as any; + } + /** Skip rows of the combined result, using a stable explicit ordering. */ + offset(count: number): this { + if (!Number.isInteger(count) || count < 0) + throw new ReadSchemaError('Offset must be a non-negative integer'); + const copy = this.copy(); + copy.rowOffset = count; + return copy; + } + + /** + * Customize a variant's typed read query, including nested relations. Return the + * configured query; other branches and their schemas are unchanged. + */ + forVariant< + K extends keyof B & keyof VariantMap & string, + Q extends ReadQueryShape + >( + key: K, + configure: (query: BranchQueries[K]) => Q + ): PolymorphicReadQuery & Record> { + const current = this.branches[key]; + if (!current) throw new ReadSchemaError(`Unknown variant: ${key}`); + const configured = configure(current as any); + if (!current.sameSource(configured)) + throw new ReadSchemaError( + 'Variant customizer must return its configured read query' + ); + const discriminator = getVariants(this.source)!.discriminatorKey; + if ( + configured.rowSchema + .introspect() + .properties[discriminator]?.introspect().equalsTo !== key + ) + throw new ReadSchemaError( + 'Variant projections must retain the original discriminator' + ); + const copy = this.copy(); + copy.branches[key] = configured as unknown as SchemaReadQuery< + any, + any, + any + >; + copy.refresh(); + return copy as any; + } + + /** @internal Compile one UNION ALL statement; JSON preserves distinct branch shapes. */ + compile(correlate?: ReadCorrelation): Knex.QueryBuilder { + const reserved = Object.values(this.branches).flatMap(branch => + Object.keys(branch.rowSchema.introspect().properties) + ); + const order = this.orders.map(item => { + const hidden = privateColumn(reserved, 'read_order'); + reserved.push(hidden); + return { ...item, hidden }; + }); + const queries = [ + ...Object.values(this.branches), + ...(this.includeUnknown ? [this.fallback] : []) + ].map(branch => + this.knex + .from( + branch + .compile((sql, alias, source) => { + correlate?.(sql, alias, source); + const columns = buildColumnMap(source).propToCol; + for (const { key, hidden } of order) + sql.select({ + [hidden]: this.knex.raw( + 'cast(?? as text)', + [`${alias}.${columns.get(key) ?? key}`] + ) + }); + }) + .as('__read_branch') + ) + .select(this.knex.raw('to_jsonb(__read_branch) as __read_poly')) + ); + const query = this.knex + .from( + this.knex + .queryBuilder() + .unionAll(queries, true) + .as('__read_variants') + ) + .select('__read_poly'); + for (const { key, direction, hidden } of order) { + const info = this.source.introspect().properties[key].introspect(); + const type = + info.type === 'number' + ? 'numeric' + : info.type === 'date' + ? 'timestamptz' + : info.type === 'boolean' + ? 'boolean' + : info.type === 'string' + ? 'text' + : undefined; + if (!type) + throw new ReadSchemaError( + 'Polymorphic ordering requires a scalar column' + ); + query.orderByRaw( + `cast(__read_poly ->> ? as ${type}) ${direction}`, + [hidden] + ); + } + if (this.rowLimit !== undefined) query.limit(this.rowLimit); + if (this.rowOffset !== undefined) query.offset(this.rowOffset); + return query; + } + /** @internal Decode using exactly the selected branch's schema and codecs. */ + decode(row: any, path = 'row'): InferType> { + const value = row.__read_poly; + const key = value?.[getVariants(this.source)!.discriminatorKey]; + const branch = this.branches[key]; + if (!Object.hasOwn(this.branches, key) || !branch) + throw new ReadSchemaError( + `${path}: unknown polymorphic discriminator` + ); + return branch.decode(value, path); + } + /** Render debugging SQL without performing any database calls. */ + toQuery(): string { + return this.compile().toQuery(); + } + /** Execute and decode one statement containing every requested branch. */ + async execute(): Promise>[]> { + return (await this.compile()).map((row: any) => this.decode(row)); + } + /** Return the first globally ordered row, or undefined. */ + async first(): Promise> | undefined> { + return (await this.limit(1).execute())[0]; + } + /** Awaiting deliberately executes the query each time. */ + // biome-ignore lint/suspicious/noThenProperty: query readers intentionally support await + then>[], E = never>( + resolve?: + | (( + rows: InferType>[] + ) => T | PromiseLike) + | null, + reject?: ((error: any) => E | PromiseLike) | null + ): Promise { + return this.execute().then(resolve, reject); + } + /** Bind independent branch queries to a caller-owned transaction. */ + transacting(trx: Knex.Transaction): this { + const copy = this.copy(); + Object.assign(copy, { knex: trx }); + copy.branches = Object.fromEntries( + Object.entries(this.branches).map(([key, q]) => [ + key, + q.transacting(trx) + ]) + ); + copy.fallback = this.fallback.transacting(trx); + return copy; + } +} diff --git a/libs/knex-schema/src/SchemaQueryBuilder.ts b/libs/knex-schema/src/SchemaQueryBuilder.ts index cc7b97c4..080c3b6f 100644 --- a/libs/knex-schema/src/SchemaQueryBuilder.ts +++ b/libs/knex-schema/src/SchemaQueryBuilder.ts @@ -129,6 +129,7 @@ import { whereNullImpl, whereRawImpl } from './operations/where.js'; +import { type SchemaAwareQuery, schemaReadQuery } from './SchemaReadQuery.js'; // --------------------------------------------------------------------------- // Type-level helpers @@ -175,6 +176,14 @@ export class SchemaQueryBuilder< TLocalSchema extends ObjectSchemaBuilder, TResult > { + /** + * Enter immutable, detached schema-aware read mode before selecting/loading fields. + * Row metadata never runs SQL; existing query behavior remains unchanged. + * @throws ReadSchemaError if result-shaping operations were already applied. + */ + withRowSchema(): SchemaAwareQuery { + return schemaReadQuery(this); + } /** * Create a query over the schema's configured table. * @param knex - Database connection or transaction used to execute the query. @@ -1259,6 +1268,7 @@ export class SchemaQueryBuilder< */ apply(fn: (builder: Knex.QueryBuilder) => void): this { const state = getState(this); + state.opaqueReadShape = true; invalidateCache(this); fn(state.baseQuery); return this; diff --git a/libs/knex-schema/src/SchemaReadQuery.ts b/libs/knex-schema/src/SchemaReadQuery.ts new file mode 100644 index 00000000..c980565b --- /dev/null +++ b/libs/knex-schema/src/SchemaReadQuery.ts @@ -0,0 +1,885 @@ +import { + type ArraySchemaBuilder, + array, + EXTRA_TYPE_BRAND, + type InferType, + type ObjectSchemaBuilder, + object, + SYMBOL_SCHEMA_PROPERTY_DESCRIPTOR +} from '@cleverbrush/schema'; +import type { Knex } from 'knex'; +import { + buildColumnMap, + getPrimaryKeyColumns, + resolvePropertyKey +} from './columns.js'; +import type { RelationInfo, SchemaProps } from './entity.js'; +import { + type AggregateExpression, + type AliasedColumn, + COLUMN, + isAggregate +} from './expressions.js'; +import { getProjections, getVariants } from './extension.js'; +import { + type CompositeCursorOptions, + compositeCursor +} from './operations/composite-cursor.js'; +import { + ALLOWED_OPS, + getEffectiveBaseQuery, + getSchemaQueryBuilderCtor +} from './operations/helpers.js'; +import { getState } from './operations/state.js'; +import { PolymorphicReadQuery } from './PolymorphicReadQuery.js'; +import type { ReadRelations, ReadVariantMetadata } from './read-entity.js'; +import { compileReadProjection, type ReadField } from './read-projection.js'; +import { + type ColumnReadSchema, + compileReadSchema, + decodeObject, + type ObjectReadSchema, + type ReadNode, + type ReadObject, + type ReadSchema, + ReadSchemaError, + readExpression, + type SchemaForValue +} from './read-schema.js'; +import type { SchemaQueryBuilder } from './SchemaQueryBuilder.js'; +import type { + CursorPaginationResult, + JoinManySpec, + JoinOneSpec, + PaginationResult, + RelationSpec +} from './types.js'; + +const READ_COLUMN = Symbol('schema-read-column'); +/** @internal Nominal read-query identity used without recursively comparing fluent APIs. */ +export const READ_QUERY = Symbol('schema-read-query'); +/** Minimal type surface for a customizer's strongly inferred result schema. */ +export interface ReadQueryShape { + /** @internal Nominal marker; constructing a plain schema object is not a query. */ + readonly [READ_QUERY]: true; + /** Decoded result schema inferred from the returned query. */ + readonly rowSchema: R; +} +let readAliasSequence = 0; +/** A typed SQL column; selectors receive descriptions, not row values. */ +export interface ReadColumn + extends AliasedColumn> { + /** @internal Decoding and projection metadata shared by the query compiler. */ + readonly [READ_COLUMN]: ReadNode; +} +/** Columns available for typed projections and filters. */ +export type ReadColumns< + S extends ReadObject, + Relations extends PropertyKey = never +> = { + [K in Exclude, Relations> & string]: ReadColumn< + ColumnReadSchema[K]> + >; +}; +type Selection = Record | AggregateExpression>; +type MergeProps = { + [K in keyof A | keyof B]: K extends keyof B + ? B[K] + : K extends keyof A + ? A[K] + : never; +}; +type NamedProjections = S extends { readonly [EXTRA_TYPE_BRAND]?: infer P } + ? P + : {}; +type NamedKeys< + S, + K extends keyof NamedProjections +> = NamedProjections[K] extends readonly (infer Key extends string)[] + ? Key + : never; +/** Structural schema inferred from a typed projection. */ +export type ReadProjection = ObjectSchemaBuilder<{ + [K in keyof S & string]: S[K] extends ReadColumn + ? R + : S[K] extends AggregateExpression + ? SchemaForValue + : never; +}>; +type AddField< + S extends ReadObject, + K extends string, + F extends ReadSchema +> = ObjectSchemaBuilder, K> & Record>; +type Related = R extends RelationInfo ? S : never; +type RelationField = + R extends RelationInfo<'hasMany' | 'belongsToMany', any> + ? ArraySchemaBuilder + : R extends RelationInfo<'belongsTo', any> + ? R extends { optional: infer O } + ? true extends O + ? SchemaForValue | null> + : S + : S + : SchemaForValue | null>; +type Selector = (columns: C) => ReadColumn; +type AnyReadQuery = + | SchemaReadQuery + | PolymorphicReadQuery; +type Loaded = { + name: string; + query: AnyReadQuery; + relation: RelationSpec; + required: boolean; +}; +/** Result of entering opt-in read mode: an object reader or a declared variant union. */ +export type SchemaAwareQuery = + ReadVariantMetadata extends { + discriminator: string; + variants: Record; + } + ? PolymorphicReadQuery + : SchemaReadQuery; +/** @internal Apply parent correlation before child selection, ordering and pagination. */ +export type ReadCorrelation = ( + query: Knex.QueryBuilder, + alias: string, + source: ReadObject +) => void; + +/** + * Immutable, detached read query whose row schema matches its decoded SQL result. + * Enter through withRowSchema() before projections/includes. Ordinary legacy queries + * remain mutable and keep their existing values. Reading metadata never executes SQL. + */ +export class SchemaReadQuery< + S extends ReadObject, + Row extends ReadObject = ObjectReadSchema>, + Relations extends Record = ReadRelations +> { + /** @internal Nominal identity for typed child-query customizers. */ + declare readonly [READ_QUERY]: true; + private readonly alias = `__schema_read_${readAliasSequence++}`; + private fields: Record; + private loaded: Loaded[] = []; + private base: Knex.QueryBuilder; + private selected = false; + private grouped = false; + private readonly columns: Record>; + /** Runtime structural schema; stable across filters, pagination and transaction clones. */ + readonly rowSchema: Row; + + /** @internal Use withRowSchema() on a query/DbSet instead of constructing directly. */ + constructor( + private readonly knex: Knex, + private readonly source: S, + base: Knex.QueryBuilder + ) { + this.base = knex.queryBuilder().from(base.clone().as(this.alias)); + const relations = (source.introspect().extensions?.relations ?? + []) as RelationSpec[]; + const excluded = new Set(relations.map(r => r.name)); + const { propToCol } = buildColumnMap(source); + this.fields = Object.create(null); + this.columns = Object.create(null); + for (const [key, schema] of Object.entries( + source.introspect().properties ?? {} + )) { + if (excluded.has(key)) continue; + const node = compileReadSchema(schema as ReadSchema); + const column = `${this.alias}.${propToCol.get(key) ?? key}`; + this.columns[key] = { + [COLUMN]: { + alias: this.alias, + column: propToCol.get(key) ?? key, + schema + }, + [READ_COLUMN]: node + }; + this.fields[key] = { + node, + expression: knex => readExpression(knex, node, column) + }; + } + this.rowSchema = this.schema() as Row; + } + + private schema(): ReadObject { + return object( + Object.fromEntries( + Object.entries(this.fields).map(([key, field]) => [ + key, + field.node.schema + ]) + ) + ); + } + + private copy(): this { + const copy = Object.create(Object.getPrototypeOf(this)) as this; + Object.assign(copy, this, { + base: this.base.clone(), + fields: { ...this.fields }, + loaded: [...this.loaded] + }); + return copy; + } + + /** @internal Prevent customizers from substituting an unrelated query source. */ + sameSource(other: unknown): boolean { + return ( + other instanceof SchemaReadQuery && this.columns === other.columns + ); + } + + private column( + selector: Selector> + ): ReadColumn { + const column = selector( + this.columns as ReadColumns + ); + if (!column || !Object.values(this.columns).includes(column)) + throw new ReadSchemaError( + 'Column does not belong to this read query' + ); + return column; + } + + private name(column: ReadColumn): string { + return `${column[COLUMN].alias}.${column[COLUMN].column}`; + } + + /** Select an exact flat row shape, retaining per-field runtime schemas. */ + select

( + selector: (columns: ReadColumns) => P + ): SchemaReadQuery< + S, + ObjectSchemaBuilder< + MergeProps< + SchemaProps>, + Pick< + SchemaProps, + Extract, keyof Relations> + > + > + >, + Relations + > { + if (this.selected) + throw new ReadSchemaError( + 'Only one projection is allowed per read query' + ); + const selection = selector( + this.columns as ReadColumns + ); + if (this.loaded.length && Object.values(selection).some(isAggregate)) + throw new ReadSchemaError( + 'Aggregate projections cannot contain relations' + ); + const copy = this.copy(); + copy.fields = compileReadProjection( + this.knex, + selection, + expression => { + if ( + !Object.values(this.columns).includes( + expression as ReadColumn + ) + ) + throw new ReadSchemaError( + 'Projection column does not belong to this query' + ); + const column = expression as ReadColumn; + return { node: column[READ_COLUMN], name: this.name(column) }; + } + ); + copy.selected = true; + // Included relations are independent of the scalar projection. + for (const relation of copy.loaded) + copy.fields[relation.name] = this.fields[relation.name]; + Object.assign(copy, { rowSchema: copy.schema() }); + return copy as any; + } + + /** Apply a named schema projection with the same exact row-schema guarantees. */ + projected & string>( + name: K + ): SchemaReadQuery< + S, + ObjectSchemaBuilder< + Pick< + SchemaProps>, + Extract, keyof SchemaProps>> + > & + Pick< + SchemaProps, + Extract, keyof Relations> + > + >, + Relations + > { + const definition = getProjections(this.source)[name]; + if (!definition) + throw new ReadSchemaError(`Unknown projection: ${name}`); + return this.select(() => + Object.fromEntries( + definition.keys.map(key => [key, this.columns[key]]) + ) + ) as any; + } + + /** Add a bound comparison, returning an independent query with the same row schema. */ + where( + column: Selector>, + value: unknown + ): this; + /** Add a bound comparison using a supported SQL operator. */ + where( + column: Selector>, + operator: string, + value: unknown + ): this; + /** Add a bound comparison using a supported SQL operator. */ + where( + column: Selector>, + ...args: [unknown] | [string, unknown] + ): this { + const operator = args.length === 1 ? '=' : args[0].toLowerCase(); + if (!ALLOWED_OPS.has(operator)) + throw new ReadSchemaError( + `Unsupported comparison operator: ${operator}` + ); + const copy = this.copy(); + copy.base.where( + this.name(this.column(column)), + operator, + (args.length === 1 ? args[0] : args[1]) as any + ); + return copy; + } + + /** Filter SQL null values without changing the declared read shape. */ + whereNull(column: Selector>): this { + const copy = this.copy(); + copy.base.whereNull(this.name(this.column(column))); + return copy; + } + /** Exclude SQL null values without implicitly narrowing schema nullability. */ + whereNotNull(column: Selector>): this { + const copy = this.copy(); + copy.base.whereNotNull(this.name(this.column(column))); + return copy; + } + /** Filter against a bound list of values. An empty list produces no rows. */ + whereIn( + column: Selector>, + values: readonly unknown[] + ): this { + const copy = this.copy(); + copy.base.whereIn(this.name(this.column(column)), [...values] as any[]); + return copy; + } + /** Order parent rows independently of any child relation's ordering. */ + orderBy( + column: Selector>, + direction: 'asc' | 'desc' = 'asc' + ): this { + const copy = this.copy(); + copy.base.orderBy(this.name(this.column(column)), direction); + return copy; + } + /** Group rows before typed aggregate projection. */ + groupBy(...columns: Selector>[]): this { + const copy = this.copy(); + copy.base.groupBy(columns.map(c => this.name(this.column(c)))); + copy.grouped = true; + return copy; + } + /** Limit parent rows; relation limits apply independently within each parent. */ + limit(count: number): this { + if (!Number.isInteger(count) || count < 0) + throw new ReadSchemaError('Limit must be a non-negative integer'); + const copy = this.copy(); + copy.base.limit(count); + return copy; + } + /** Skip parent rows; use a deterministic order for pagination. */ + offset(count: number): this { + if (!Number.isInteger(count) || count < 0) + throw new ReadSchemaError('Offset must be a non-negative integer'); + const copy = this.copy(); + copy.base.offset(count); + return copy; + } + + /** + * Load a declared relation in the same SQL statement. Return the customized child + * query so its selected fields and nested includes remain strongly typed. + */ + include< + K extends keyof Relations & string, + Child extends ReadQueryShape = SchemaAwareQuery> + >( + selector: (relations: { [P in keyof Relations]: P }) => K, + customize?: (query: SchemaAwareQuery>) => Child + ): SchemaReadQuery< + S, + AddField>, + Relations + > { + if (Object.values(this.fields).some(f => f.aggregate) || this.grouped) + throw new ReadSchemaError( + 'Grouped/aggregate reads cannot load entity relations' + ); + const definitions = (this.source.introspect().extensions?.relations ?? + []) as RelationSpec[]; + const key = selector( + Object.fromEntries(definitions.map(r => [r.name, r.name])) as any + ); + const relation = definitions.find(r => r.name === key); + if (!relation) throw new ReadSchemaError(`Unknown relation: ${key}`); + if (this.loaded.some(r => r.name === key)) + throw new ReadSchemaError(`Duplicate relation: ${key}`); + const foreign = + typeof relation.schema === 'function' + ? relation.schema() + : relation.schema; + return this.load( + relation, + this.child(foreign, customize as any), + relation.type === 'belongsTo' && !relation.optional + ) as any; + } + + private child( + foreign: ReadObject, + customize?: (query: any) => ReadQueryShape + ): AnyReadQuery { + const Constructor = getSchemaQueryBuilderCtor(); + let child: AnyReadQuery = createReadQuery( + this.knex, + foreign, + getEffectiveBaseQuery(new Constructor(this.knex, foreign)).clone() + ); + if (customize) { + const customized = customize(child as any); + if (!child.sameSource(customized)) + throw new ReadSchemaError( + 'Relation customizer must return its configured read query' + ); + child = customized as any; + } + return child; + } + + private load( + relation: RelationSpec, + child: AnyReadQuery, + required: boolean + ): this { + const key = relation.name; + if (this.grouped || Object.values(this.fields).some(f => f.aggregate)) + throw new ReadSchemaError( + 'Grouped/aggregate reads cannot load entity relations' + ); + if ( + this.loaded.some(r => r.name === key) || + Object.hasOwn(this.fields, key) + ) + throw new ReadSchemaError(`Duplicate result field: ${key}`); + const many = + relation.type === 'hasMany' || relation.type === 'belongsToMany'; + const schema = many + ? array(child.rowSchema) + : required + ? child.rowSchema + : child.rowSchema.nullable(); + const node: ReadNode = { + schema, + exact: false, + decode: (value, path) => { + if (value === null && !required && !many) return null; + if (many) { + if (!Array.isArray(value)) + throw new ReadSchemaError( + `${path}: expected a relation array` + ); + return value.map((row, i) => + child.decode(row, `${path}[${i}]`) + ); + } + return child.decode(value, path); + } + }; + const copy = this.copy(); + copy.loaded.push({ name: key, query: child, relation, required }); + copy.fields[key] = { + node, + expression: () => { + throw new ReadSchemaError( + 'Relation expression must be compiled in context' + ); + } + }; + Object.assign(copy, { rowSchema: copy.schema() }); + return copy as any; + } + + /** Join one typed nested object with explicit property keys, including nullable joins. */ + joinOne< + F extends ReadObject, + K extends string, + Required extends boolean = true, + Child extends ReadQueryShape = SchemaAwareQuery + >( + spec: JoinOneSpec, + customize?: (query: SchemaAwareQuery) => Child + ): SchemaReadQuery< + S, + AddField< + Row, + K, + Required extends true + ? Child['rowSchema'] + : SchemaForValue | null> + >, + Relations & Record> + > { + if (spec.foreignQuery || spec.mappers) + throw new ReadSchemaError( + 'Use the typed child customizer instead of foreignQuery/mappers in schema-aware mode' + ); + return this.load( + { + name: spec.as, + type: 'hasOne', + schema: spec.foreignSchema, + localKey: resolvePropertyKey( + spec.localColumn as any, + this.source, + 'joinOne' + ), + remoteKey: resolvePropertyKey( + spec.foreignColumn as any, + spec.foreignSchema, + 'joinOne' + ) + }, + this.child(spec.foreignSchema, customize as any), + spec.required !== false + ) as any; + } + + /** Join a typed collection, applying child projection and pagination independently per parent. */ + joinMany< + F extends ReadObject, + K extends string, + Child extends ReadQueryShape = SchemaAwareQuery + >( + spec: Omit, 'orderBy'>, + customize?: (query: SchemaAwareQuery) => Child + ): SchemaReadQuery< + S, + AddField>, + Relations & Record> + > { + if (spec.foreignQuery || spec.mappers || 'orderBy' in spec) + throw new ReadSchemaError( + 'Use the typed child customizer for ordering instead of raw foreignQuery/mappers' + ); + let child = this.child(spec.foreignSchema, customize as any); + if (spec.limit !== undefined) child = child.limit(spec.limit); + if (spec.offset !== undefined) child = child.offset(spec.offset); + return this.load( + { + name: spec.as, + type: 'hasMany', + schema: spec.foreignSchema, + localKey: resolvePropertyKey( + spec.localColumn as any, + this.source, + 'joinMany' + ), + remoteKey: resolvePropertyKey( + spec.foreignColumn as any, + spec.foreignSchema, + 'joinMany' + ) + }, + child, + false + ) as any; + } + + /** @internal Decode a SQL/JSON row using the same metadata exposed to consumers. */ + decode(row: any, path = 'row'): any { + if ( + this.source.introspect().extensions?.readOrphanColumn && + row.__read_cti_present == null + ) + throw new ReadSchemaError(`${path}: missing CTI variant body`); + return decodeObject( + Object.fromEntries( + Object.entries(this.fields).map(([key, field]) => [ + key, + field.node + ]) + ), + row, + path + ); + } + + /** @internal Compile a bound SQL statement; callers never receive the mutable builder. */ + compile(correlate?: ReadCorrelation): Knex.QueryBuilder { + const query = this.base.clone().clearSelect(); + correlate?.(query, this.alias, this.source); + const expressions: Record = Object.create(null); + for (const [key, field] of Object.entries(this.fields)) { + if (!this.loaded.some(r => r.name === key)) + expressions[key] = field.expression(this.knex); + } + const orphanColumn = + this.source.introspect().extensions?.readOrphanColumn; + if (orphanColumn) + expressions.__read_cti_present = this.knex.raw('??', [ + `${this.alias}.${orphanColumn}` + ]); + for (const loaded of this.loaded) { + const { relation, query: child } = loaded; + const parentTable = this.alias; + const parentPk = getPrimaryKeyColumns(this.source).columnNames; + const foreignKey = relation.foreignKey; + const resolveKey = (schema: ReadObject, key: any) => { + if (typeof key === 'function') { + const descriptor = key( + ObjectSchemaBuilderValue.getPropertiesFor(schema) + ); + key = + descriptor[SYMBOL_SCHEMA_PROPERTY_DESCRIPTOR] + .propertyName; + } + return buildColumnMap(schema).propToCol.get(key) ?? key; + }; + const childSql = child.compile((sql, childTable, childSource) => { + const childPk = getPrimaryKeyColumns(childSource).columnNames; + if (relation.localKey && relation.remoteKey) { + sql.where( + `${childTable}.${resolveKey(childSource, relation.remoteKey)}`, + this.knex.ref( + `${parentTable}.${resolveKey(this.source, relation.localKey)}` + ) + ); + return; + } + if (parentPk.length !== 1) + throw new ReadSchemaError( + 'Automatic relation reads require single-column primary keys' + ); + if (childPk.length !== 1) + throw new ReadSchemaError( + 'Automatic relation reads require single-column primary keys' + ); + if (relation.type === 'belongsTo') + sql.where( + `${childTable}.${childPk[0]}`, + this.knex.ref( + `${parentTable}.${resolveKey(this.source, foreignKey)}` + ) + ); + else if (relation.type === 'belongsToMany') { + const through = relation.through!; + sql.join( + through.table, + `${through.table}.${through.foreignKey}`, + `${childTable}.${childPk[0]}` + ).where( + `${through.table}.${through.localKey}`, + this.knex.ref(`${parentTable}.${parentPk[0]}`) + ); + } else + sql.where( + `${childTable}.${resolveKey(childSource, foreignKey)}`, + this.knex.ref(`${parentTable}.${parentPk[0]}`) + ); + }); + const many = + relation.type === 'hasMany' || + relation.type === 'belongsToMany'; + if (!many) childSql.limit(1); + const wrapped = this.knex + .queryBuilder() + .from(childSql.clone().as('__read_relation')); + expressions[loaded.name] = many + ? this.knex.raw( + "(select coalesce(jsonb_agg(to_jsonb(__read_relation)), '[]'::jsonb) from (?) as __read_relation)", + [childSql] + ) + : this.knex.raw( + '(select to_jsonb(__read_relation) from (?) as __read_relation)', + [childSql] + ); + if (loaded.required) + query.whereExists(wrapped.clone().select(this.knex.raw('1'))); + } + return query.select(expressions); + } + + /** Render debugging SQL without execution; bound values may be sensitive. */ + toQuery(): string { + return this.compile().toQuery(); + } + /** Execute one statement and decode its selected row graph. */ + async execute(): Promise[]> { + return (await this.compile()).map((row: unknown) => this.decode(row)); + } + /** Execute a limited copy, returning undefined when no row matches. */ + async first(): Promise | undefined> { + return (await this.limit(1).execute())[0]; + } + /** Awaiting executes the query; repeated awaits deliberately execute again. */ + // biome-ignore lint/suspicious/noThenProperty: query readers intentionally support await + then[], E = never>( + resolve?: ((rows: InferType[]) => T | PromiseLike) | null, + reject?: ((error: any) => E | PromiseLike) | null + ): Promise { + return this.execute().then(resolve, reject); + } + /** Bind an independent query graph to a caller-owned transaction. */ + transacting(trx: Knex.Transaction): this { + const copy = this.copy(); + copy.base.transacting(trx); + Object.assign(copy, { knex: trx }); + copy.loaded = this.loaded.map(r => ({ + ...r, + query: r.query.transacting(trx) + })); + return copy; + } + /** + * Read a lossless composite cursor page using native SQL ordering. Cursor sort + * values remain private text columns, independent of projections and Date decoding. + * Requires non-null scalar order columns containing a declared unique key. + */ + async paginateAfter( + options: CompositeCursorOptions + ): Promise>> { + if (this.grouped || Object.values(this.fields).some(f => f.aggregate)) + throw new ReadSchemaError( + 'Cursor pagination cannot be used for aggregate reads' + ); + const Constructor = getSchemaQueryBuilderCtor(); + const source = this.source.withExtension('tableName', this.alias); + const legacy = new Constructor(this.knex, source, this.compile()); + const state = getState(legacy); + state.skipDefaultScope = true; + state.includeDeleted = true; + // The query is already projected; reserve its aliases against cursor fields. + state.hiddenColumns = new Set(Object.keys(this.fields)); + return compositeCursor( + legacy, + options, + row => this.decode(row), + this.source.introspect().extensions?.tableName as string + ); + } + /** Fetch a numbered page and a count without mutating the source query. */ + async paginate(options: { + page: number; + pageSize: number; + }): Promise>> { + const { page, pageSize } = options; + if ( + !Number.isInteger(page) || + page < 1 || + !Number.isInteger(pageSize) || + pageSize < 1 + ) + throw new ReadSchemaError( + 'Page and pageSize must be positive integers' + ); + const countQuery = this.compile() + .clearOrder() + .clear('limit') + .clear('offset'); + const countRow = await this.knex + .from(countQuery.as('__read_count')) + .count({ count: '*' }) + .first(); + const total = Number(countRow?.count ?? 0); + if (!Number.isSafeInteger(total)) + throw new ReadSchemaError( + 'Pagination count exceeds the safe integer range' + ); + const data = await this.offset((page - 1) * pageSize) + .limit(pageSize) + .execute(); + const totalPages = Math.ceil(total / pageSize); + return { + data, + total, + page, + pageSize, + totalPages, + hasNextPage: page < totalPages, + hasPreviousPage: page > 1 + }; + } +} + +import { ObjectSchemaBuilder as ObjectSchemaBuilderValue } from '@cleverbrush/schema'; + +/** @internal Enter schema-aware mode only before result-shaping legacy operations. */ +export function schemaReadQuery( + builder: SchemaQueryBuilder +): SchemaAwareQuery { + const state = getState(builder); + if ( + state.selectionMode !== null || + state.specs.length || + state.variantRelationIncludes.length + ) + throw new ReadSchemaError( + 'Call withRowSchema() before select/include/join operations' + ); + if ( + state.opaqueReadShape || + state.enabledVariants || + state.variantWhereFilters.length + ) + throw new ReadSchemaError( + 'Call withRowSchema() before raw or variant-specific operations' + ); + const base = getEffectiveBaseQuery(builder).clone(); + const statements = (base as any)._statements as Array<{ grouping: string }>; + if ( + statements.some(s => s.grouping === 'order') || + (base as any)._single.limit !== undefined || + (base as any)._single.offset !== undefined + ) + throw new ReadSchemaError( + 'Call withRowSchema() before ordering or pagination' + ); + if ( + statements.some(s => + ['columns', 'join', 'group', 'having', 'union'].includes(s.grouping) + ) + ) + throw new ReadSchemaError( + 'Existing raw projections, joins and aggregates cannot declare a read schema' + ); + return createReadQuery(state.knex, state.localSchema as S, base); +} + +/** @internal Shared reader factory for roots and nested relations. */ +export function createReadQuery( + knex: Knex, + schema: S, + base: Knex.QueryBuilder +): SchemaAwareQuery { + return ( + getVariants(schema) + ? new PolymorphicReadQuery(knex, schema, base) + : new SchemaReadQuery(knex, schema, base) + ) as SchemaAwareQuery; +} diff --git a/libs/knex-schema/src/aliased-query.ts b/libs/knex-schema/src/aliased-query.ts index 5ac2979f..455b16dd 100644 --- a/libs/knex-schema/src/aliased-query.ts +++ b/libs/knex-schema/src/aliased-query.ts @@ -1,6 +1,8 @@ import type { InferType, ObjectSchemaBuilder } from '@cleverbrush/schema'; import type { Knex } from 'knex'; +import { AliasedReadQuery } from './AliasedReadQuery.js'; import { buildColumnMap } from './columns.js'; +import type { SchemaProps } from './entity.js'; import { type AggregateExpression, type AliasedColumn, @@ -66,7 +68,9 @@ type Columns = { [K in keyof InferType]-?: AliasedColumn< | Exclude[K], undefined> | (undefined extends InferType[K] ? null : never) - | (Nullable extends true ? null : never) + | (Nullable extends true ? null : never), + K extends keyof SchemaProps ? SchemaProps[K] : never, + Nullable >; }; @@ -137,6 +141,35 @@ export class AliasedQueryBuilder { private tables = new Map(); private selected = false; private decoders: Record unknown> = {}; + private nullableTables = new Set(); + private opaqueReadShape = false; + + /** Enter immutable read mode before select/raw changes; an explicit projection is required. */ + withRowSchema(): AliasedReadQuery { + if (this.selected || this.opaqueReadShape) + throw new Error( + 'Call withRowSchema() before select/apply operations' + ); + return new AliasedReadQuery(this.cloneReadSource()); + } + + /** @internal Snapshot the SQL planner without sharing mutable query state. */ + cloneReadSource(): AliasedQueryBuilder { + const copy = Object.assign( + Object.create(Object.getPrototypeOf(this)), + this + ); + copy.sql = this.sql.clone(); + copy.tables = new Map(this.tables); + copy.nullableTables = new Set(this.nullableTables); + copy.decoders = { ...this.decoders }; + return copy; + } + + /** @internal Schema-backed state used by the immutable opt-in adapter. */ + readContext(): { knex: Knex; sql: Knex.QueryBuilder; columns: TTables } { + return { knex: this.knex, sql: this.sql.clone(), columns: this.tree() }; + } /** * Create a read-only query for one aliased schema. @@ -172,7 +205,9 @@ export class AliasedQueryBuilder { [COLUMN]: { alias: name, column, - schema: properties[key] + schema: this.nullableTables.has(name) + ? properties[key].nullable() + : properties[key] } } ]) @@ -248,11 +283,13 @@ export class AliasedQueryBuilder { if (this.tables.has(table.name)) throw new Error(`Duplicate table alias: ${table.name}`); this.tables.set(table.name, table.schema); + if (left) this.nullableTables.add(table.name); try { const predicate = this.predicate(on(this.tree())); this.sql[left ? 'leftJoin' : 'join'](this.source(table), predicate); } catch (error) { this.tables.delete(table.name); + this.nullableTables.delete(table.name); throw error; } } @@ -421,6 +458,7 @@ export class AliasedQueryBuilder { /** Raw escape hatch; callers own any effects on result shape or cardinality. */ apply(callback: (query: Knex.QueryBuilder) => void): this { + this.opaqueReadShape = true; callback(this.sql); return this; } @@ -439,6 +477,8 @@ export class AliasedQueryBuilder { copy.tables = new Map(this.tables); copy.selected = this.selected; copy.decoders = { ...this.decoders }; + copy.nullableTables = new Set(this.nullableTables); + copy.opaqueReadShape = this.opaqueReadShape; return copy; } diff --git a/libs/knex-schema/src/entity.ts b/libs/knex-schema/src/entity.ts index 93ff5896..fe6ea98e 100644 --- a/libs/knex-schema/src/entity.ts +++ b/libs/knex-schema/src/entity.ts @@ -23,6 +23,11 @@ import { getColumnName, type VariantInputForResolver } from './extension.js'; +import type { + EntityReadSchema, + ReadVariants, + WithReadVariant +} from './read-entity.js'; import type { ResolvedVariantRelationSpec } from './types.js'; // --------------------------------------------------------------------------- @@ -167,11 +172,13 @@ export type WithRelation< TKey extends string, TKind extends 'belongsTo' | 'hasOne' | 'hasMany' | 'belongsToMany', TForeign extends ObjectSchemaBuilder, - TVariantUnion = never + TVariantUnion = never, + TReadVariants extends ReadVariants = {} > = Entity< TSchema, TRels & Record>, - TVariantUnion + TVariantUnion, + TReadVariants >; // --------------------------------------------------------------------------- @@ -192,10 +199,11 @@ export type WithRelation< export class Entity< TSchema extends ObjectSchemaBuilder, TRels extends Record = {}, - TVariantUnion = never + TVariantUnion = never, + TReadVariants extends ReadVariants = {} > { /** The underlying schema (relations registered via `withExtension('relations', ...)`). */ - readonly schema: TSchema; + readonly schema: EntityReadSchema; /** @internal Phantom slot to retain `TRels` in inferred types. */ private declare readonly __relations__: TRels; @@ -209,7 +217,11 @@ export class Entity< * definitions; constructing an Entity does not query or create database tables. */ constructor(schema: TSchema) { - this.schema = schema; + this.schema = schema as unknown as EntityReadSchema< + TSchema, + TRels, + TReadVariants + >; } private _addRelation(spec: { @@ -217,6 +229,8 @@ export class Entity< name: string; schema: any; foreignKey?: any; + localKey?: string; + remoteKey?: string; through?: { table: string; localKey: string; foreignKey: string }; optional?: boolean; }): Entity { @@ -257,7 +271,15 @@ export class Entity< _localSel: EntityPropSelector, remoteSel: EntityPropSelector, opts?: { optional?: boolean } - ): WithRelation { + ): WithRelation< + TSchema, + TRels, + TKey, + 'hasOne', + TForeign, + TVariantUnion, + TReadVariants + > { const navName = this._resolvePropName( navSel as EntityPropSelector, this.schema @@ -273,6 +295,8 @@ export class Entity< name: navName, schema: foreignSchema, foreignKey: remoteKey, + localKey: this._resolvePropName(_localSel, this.schema), + remoteKey, optional: opts?.optional }) as any; } @@ -299,7 +323,15 @@ export class Entity< navSel: EntityPropSelector, _localSel: EntityPropSelector, remoteSel: EntityPropSelector - ): WithRelation { + ): WithRelation< + TSchema, + TRels, + TKey, + 'hasMany', + TForeign, + TVariantUnion, + TReadVariants + > { const navName = this._resolvePropName( navSel as EntityPropSelector, this.schema @@ -313,7 +345,9 @@ export class Entity< type: 'hasMany', name: navName, schema: foreignSchema, - foreignKey: remoteKey + foreignKey: remoteKey, + localKey: this._resolvePropName(_localSel, this.schema), + remoteKey }) as any; } @@ -334,19 +368,22 @@ export class Entity< any, any, any - > = UnwrapNavSchema[TKey]> + > = UnwrapNavSchema[TKey]>, + TOptional extends boolean = false >( navSel: EntityPropSelector, localSel: EntityPropSelector, _remoteSel: EntityPropSelector, - opts?: { optional?: boolean } - ): WithRelation< + opts?: { optional?: TOptional } + ): Entity< TSchema, - TRels, - TKey, - 'belongsTo', - TForeign, - TVariantUnion + TRels & + Record< + TKey, + RelationInfo<'belongsTo', TForeign> & { optional: TOptional } + >, + TVariantUnion, + TReadVariants > { const navName = this._resolvePropName( navSel as EntityPropSelector, @@ -360,6 +397,11 @@ export class Entity< name: navName, schema: foreignSchema, foreignKey: localKey, + localKey, + remoteKey: this._resolvePropName( + _remoteSel as EntityPropSelector, + foreignSchema + ), optional: opts?.optional }) as any; } @@ -390,7 +432,8 @@ export class Entity< TKey, 'belongsToMany', TForeign, - TVariantUnion + TVariantUnion, + TReadVariants > { const navName = this._resolvePropName( navSel as EntityPropSelector, @@ -426,7 +469,7 @@ export class Entity< */ discriminator & string>( sel: TKey | EntityPropSelector - ): Entity { + ): Entity { const discKey = typeof sel === 'string' ? (sel as string) @@ -434,7 +477,10 @@ export class Entity< sel as EntityPropSelector, this.schema ); - const next = new Entity(this.schema) as Entity; + const next = new Entity(this.schema) as unknown as Entity< + TSchema, + TRels + >; // Carry the variant-builder state on the new Entity so subsequent // `.ctiVariant()`/`.stiVariant()` calls can extend it. Stored on // the instance (not in the schema) so the original schema is @@ -443,7 +489,7 @@ export class Entity< discKey, variants: {} as Record }; - return next; + return next as any; } /** @@ -466,19 +512,33 @@ export class Entity< any, any, any - > + >, + const TKey extends string, + TForeignKey extends keyof SchemaProps & string, + TVarRelations extends Record, + TAllowOrphan extends boolean = false >( - key: string, - variant: Entity, - fkSel: (t: EntityTree) => any, + key: TKey, + variant: Entity, + fkSel: EntityPropSelector, opts?: { - allowOrphan?: boolean; + allowOrphan?: TAllowOrphan; relations?: Record>; } ): Entity< TSchema, TRels, - TVariantUnion | VariantBranch + TVariantUnion | VariantBranch, + WithReadVariant< + TReadVariants, + TKey, + { + schema: EntityReadSchema; + storage: 'cti'; + foreignKey: TForeignKey; + allowOrphan: TAllowOrphan; + } + > > { const builder = (this as any)._variantBuilder as | VariantBuilderState @@ -510,7 +570,7 @@ export class Entity< }; return this._withVariantBuilder< TVariantUnion | VariantBranch - >(builder.discKey, nextVariants); + >(builder.discKey, nextVariants) as any; } /** @@ -527,10 +587,12 @@ export class Entity< any, any, any - > + >, + const TKey extends string, + TVarRelations extends Record = {} >( - key: string, - body: Entity | TVarSchema, + key: TKey, + body: Entity | TVarSchema, opts?: { enforceCheck?: boolean; relations?: Record>; @@ -538,7 +600,15 @@ export class Entity< ): Entity< TSchema, TRels, - TVariantUnion | VariantBranch + TVariantUnion | VariantBranch, + WithReadVariant< + TReadVariants, + TKey, + { + schema: EntityReadSchema; + storage: 'sti'; + } + > > { const builder = (this as any)._variantBuilder as | VariantBuilderState @@ -570,7 +640,7 @@ export class Entity< }; return this._withVariantBuilder< TVariantUnion | VariantBranch - >(builder.discKey, nextVariants); + >(builder.discKey, nextVariants) as any; } /** @internal Apply the variant extension to the schema and return a new Entity. */ @@ -828,7 +898,7 @@ export type EntityRelations = * Type-level helper: extract the underlying schema type from any `Entity`. * @public */ -export type EntitySchema = E extends Entity ? S : never; +export type EntitySchema = E extends { schema: infer S } ? S : never; /** * Type-level helper: extract the accumulated variant union from any `Entity`. diff --git a/libs/knex-schema/src/expressions.ts b/libs/knex-schema/src/expressions.ts index 04aae2be..1b198372 100644 --- a/libs/knex-schema/src/expressions.ts +++ b/libs/knex-schema/src/expressions.ts @@ -36,7 +36,7 @@ export const COLUMN = Symbol('query-column'); export const EXPRESSION = Symbol('query-expression'); /** A schema-backed SQL column belonging to one explicit table alias. */ -export interface AliasedColumn { +export interface AliasedColumn { readonly [COLUMN]: { alias: string; column: string; @@ -46,6 +46,10 @@ export interface AliasedColumn { * Type-only marker carrying column nullability and value type; not a runtime row value. */ readonly __value?: T; + /** Type-only original schema used by opt-in projection metadata. */ + readonly __readSource?: S; + /** Type-only join nullability, independent of the stored column schema. */ + readonly __leftJoined?: Nullable; } export type SelectableColumn = diff --git a/libs/knex-schema/src/extension.ts b/libs/knex-schema/src/extension.ts index 5a421518..cbd16f47 100644 --- a/libs/knex-schema/src/extension.ts +++ b/libs/knex-schema/src/extension.ts @@ -1,4 +1,5 @@ // @cleverbrush/knex-schema — Schema extension: hasColumnName / hasTableName +export { READ_SQL_TYPE } from './read-storage.js'; import type { AnySchemaBuilder, diff --git a/libs/knex-schema/src/index.ts b/libs/knex-schema/src/index.ts index e925f107..f583f211 100644 --- a/libs/knex-schema/src/index.ts +++ b/libs/knex-schema/src/index.ts @@ -1,5 +1,7 @@ // @cleverbrush/knex-schema — Type-safe schema-driven query builder for Knex +export type { ReadAliasTables } from './AliasedReadQuery.js'; +export { AliasedReadQuery } from './AliasedReadQuery.js'; export type { AliasTables, JoinedProjection, @@ -90,8 +92,34 @@ export { validateEntitiesAgainstDatabase } from './migration.js'; export type { CompositeCursorOptions } from './operations/composite-cursor.js'; +export type { + PolymorphicRowSchema, + VariantReadSchema, + VariantReadSchemas +} from './PolymorphicReadQuery.js'; +export { PolymorphicReadQuery } from './PolymorphicReadQuery.js'; // Raw query execution export { rawQuery } from './raw.js'; +export type { + EntityReadSchema, + ReadRelations, + ReadVariant, + ReadVariantMetadata, + ReadVariants, + WithReadVariant +} from './read-entity.js'; +export { READ_ENTITY } from './read-entity.js'; +export type { + ColumnReadSchema, + ObjectReadSchema, + ReadObject, + ReadSchema, + ReadValue, + SchemaForValue +} from './read-schema.js'; +export { ReadSchemaError } from './read-schema.js'; +export type { SqlNumber } from './read-storage.js'; +export { READ_SQL_TYPE } from './read-storage.js'; export type { BoundQuery } from './SchemaQueryBuilder.js'; // Main entry point export { @@ -99,6 +127,13 @@ export { query, SchemaQueryBuilder } from './SchemaQueryBuilder.js'; +export type { + ReadColumn, + ReadColumns, + ReadProjection, + SchemaAwareQuery +} from './SchemaReadQuery.js'; +export { SchemaReadQuery } from './SchemaReadQuery.js'; // Snapshot-based migration export { entitiesToSnapshot, diff --git a/libs/knex-schema/src/operations/composite-cursor.ts b/libs/knex-schema/src/operations/composite-cursor.ts index 6a36e639..342bda95 100644 --- a/libs/knex-schema/src/operations/composite-cursor.ts +++ b/libs/knex-schema/src/operations/composite-cursor.ts @@ -31,7 +31,9 @@ export interface CompositeCursorOptions< export async function compositeCursor( builder: SchemaQueryBuilder, - options: CompositeCursorOptions + options: CompositeCursorOptions, + decode?: (row: Record) => any, + sourceIdentity?: string ): Promise> { if ( !Number.isSafeInteger(options.limit) || @@ -121,9 +123,11 @@ export async function compositeCursor( ); } const identity = JSON.stringify([ - state.tableName, + sourceIdentity ?? state.tableName, order.map(({ column, direction, type }) => [column, direction, type]) ]); + const nativeColumn = (column: string) => + sourceIdentity ? `${state.tableName}.${column}` : column; let values: string[] | undefined; if (options.cursor != null) { try { @@ -193,10 +197,13 @@ export async function compositeCursor( order.forEach((item, index) => { this.orWhere(function () { for (let before = 0; before < index; before++) { - this.where(order[before].column, cursorValues[before]); + this.where( + nativeColumn(order[before].column), + cursorValues[before] + ); } this.where( - item.column, + nativeColumn(item.column), item.direction === 'desc' ? '<' : '>', cursorValues[index] ); @@ -209,7 +216,7 @@ export async function compositeCursor( if (!statements(sql).some(s => s.grouping === 'columns')) sql.select(`${state.tableName}.*`); for (const item of order) { - sql.orderBy(item.column, item.direction); + sql.orderBy(nativeColumn(item.column), item.direction); const key = privateColumn( [ ...colToProp.keys(), @@ -219,7 +226,9 @@ export async function compositeCursor( ], 'cursor' ); - const value = state.knex.raw('cast(?? as text)', [item.column]); + const value = state.knex.raw('cast(?? as text)', [ + nativeColumn(item.column) + ]); sql.select({ [key]: value }); state.explicitSelects?.push(key); // Object projections must carry hidden cursor values through eager wrapping. @@ -256,7 +265,9 @@ export async function compositeCursor( ).toString('base64url') : null; return { - data: page.map(row => cleanAndMapRow(copy, row)), + data: page.map(row => + decode ? decode(row) : cleanAndMapRow(copy, row) + ), nextCursor, hasMore }; diff --git a/libs/knex-schema/src/operations/state.ts b/libs/knex-schema/src/operations/state.ts index 18d18c57..c71645fa 100644 --- a/libs/knex-schema/src/operations/state.ts +++ b/libs/knex-schema/src/operations/state.ts @@ -10,6 +10,8 @@ import type { } from '../types.js'; export interface QueryBuilderState { + /** Raw callbacks have no statically declared result shape for opt-in reads. */ + opaqueReadShape?: boolean; knex: Knex; baseQuery: Knex.QueryBuilder; localSchema: ObjectSchemaBuilder; diff --git a/libs/knex-schema/src/read-entity.ts b/libs/knex-schema/src/read-entity.ts new file mode 100644 index 00000000..6d31a2d2 --- /dev/null +++ b/libs/knex-schema/src/read-entity.ts @@ -0,0 +1,72 @@ +import type { RelationInfo } from './entity.js'; +import type { ReadObject } from './read-schema.js'; + +/** Type-only entity graph metadata retained through optional/nullable navigation schemas. */ +export const READ_ENTITY: unique symbol = Symbol.for( + '@cleverbrush/knex-schema:read-entity' +); +/** A declared polymorphic storage branch used to derive database-read schemas. */ +export interface ReadVariant { + /** Variant object schema, including its relation metadata. */ + schema: ReadObject; + /** Storage layout for this branch. */ + storage: 'cti' | 'sti'; + /** CTI parent-reference property, omitted from the public read row. */ + foreignKey?: string; + /** Whether a missing CTI body produces nullable fields instead of an error. */ + allowOrphan?: boolean; +} +/** Type-only declaration of the discriminator and available polymorphic branches. */ +export interface ReadVariants { + /** Name of the discriminator property. */ + discriminator?: string; + /** Branch descriptions keyed by discriminator literal. */ + variants?: Record; +} +/** Attach entity graph information to schema extension types without changing validation. */ +export type EntityReadSchema = { + readonly [READ_ENTITY]: { relations: Relations; polymorphic: Variants }; + optional(): EntityReadSchema< + ReturnType, + Relations, + Variants + >; + nullable(): EntityReadSchema< + ReturnType, + Relations, + Variants + >; + required(): EntityReadSchema< + ReturnType, + Relations, + Variants + >; + notNullable(): EntityReadSchema< + ReturnType, + Relations, + Variants + >; +} & S; +/** Relations available from an entity's schema, including nested navigation schemas. */ +export type ReadRelations = S extends { + readonly [READ_ENTITY]: { + relations: infer R extends Record; + }; +} + ? R + : {}; +/** Polymorphic declarations available from an entity's schema. */ +export type ReadVariantMetadata = S extends { + readonly [READ_ENTITY]: { polymorphic: infer V }; +} + ? V + : {}; +/** Accumulate a variant while retaining its literal key and storage schema. */ +export type WithReadVariant< + V extends ReadVariants, + K extends string, + Branch extends ReadVariant +> = { + discriminator: V['discriminator']; + variants: Omit, K> & Record; +}; diff --git a/libs/knex-schema/src/read-graph.test-d.ts b/libs/knex-schema/src/read-graph.test-d.ts new file mode 100644 index 00000000..25ec2482 --- /dev/null +++ b/libs/knex-schema/src/read-graph.test-d.ts @@ -0,0 +1,94 @@ +import type { InferType } from '@cleverbrush/schema'; +import Knex from 'knex'; +import { expectTypeOf, test } from 'vitest'; +import { defineEntity } from './entity.js'; +import { array, date, number, object, string } from './extension.js'; +import { query } from './SchemaQueryBuilder.js'; + +const Label = object({ + id: number().primaryKey(), + assetId: number(), + label: string() +}).hasTableName('labels'); +const Photo = defineEntity( + object({ + assetId: number().primaryKey(), + size: number().bigint(), + takenAt: date(), + labels: array(Label).optional() + }).hasTableName('photos') +).hasMany( + p => p.labels, + p => p.assetId, + l => l.assetId +); +const Asset = defineEntity( + object({ + id: number().primaryKey(), + kind: string(), + albumId: number(), + createdAt: date() + }).hasTableName('assets') +) + .discriminator(a => a.kind) + .ctiVariant('photo', Photo, p => p.assetId) + .stiVariant('text', object({ body: string() })); +const Album = defineEntity( + object({ + id: number().primaryKey(), + assets: array(Asset.schema).optional() + }).hasTableName('albums') +).hasMany( + a => a.assets, + a => a.id, + a => a.albumId +); +const knex = Knex({ client: 'pg' }); + +test('polymorphic read branches retain discriminators and nested relation types', async () => { + const read = query(knex, Asset.schema) + .withRowSchema() + .forVariant('photo', q => + q.include( + r => r.labels, + labels => labels.select(l => ({ text: l.label })) + ) + ); + type PhotoRow = InferType; + type Expected = { + id: number; + kind: 'photo'; + albumId: number; + createdAt: Date; + size: string; + takenAt: Date; + labels: { text: string }[]; + }; + expectTypeOf().toExtend(); + expectTypeOf().toExtend(); + const rows = await read; + if (rows[0].kind === 'photo') { + expectTypeOf(rows[0].size).toEqualTypeOf(); + expectTypeOf(rows[0].labels[0].text).toEqualTypeOf(); + const labels = rows[0].labels; + expectTypeOf().toEqualTypeOf<'text'>(); + // @ts-expect-error the other branch's fields are unavailable after narrowing + rows[0].body; + } + // @ts-expect-error undeclared variants are not accepted + read.forVariant('unknown', q => q); +}); + +test('polymorphic reads compose inside an ordinary relation', async () => { + const read = query(knex, Album.schema) + .withRowSchema() + .include( + r => r.assets, + assets => assets.forVariant('photo', q => q.include(r => r.labels)) + ); + const rows = await read; + const asset = rows[0].assets[0]; + if (asset.kind === 'photo') + expectTypeOf(asset.labels[0].label).toEqualTypeOf(); + else expectTypeOf(asset.body).toEqualTypeOf(); +}); diff --git a/libs/knex-schema/src/read-mapping.test.ts b/libs/knex-schema/src/read-mapping.test.ts new file mode 100644 index 00000000..c138e1bc --- /dev/null +++ b/libs/knex-schema/src/read-mapping.test.ts @@ -0,0 +1,76 @@ +import { mapper } from '@cleverbrush/mapper'; +import Knex from 'knex'; +import { describe, expect, expectTypeOf, it } from 'vitest'; +import { defineEntity } from './entity.js'; +import { array, date, number, object, string } from './extension.js'; +import { query } from './SchemaQueryBuilder.js'; + +describe('query schemas as reusable mapping sources', () => { + it('maps projected nested rows without duplicate schemas or promises', async () => { + const Note = object({ + id: number(), + taskId: number(), + body: string() + }).hasTableName('notes'); + const Task = defineEntity( + object({ + id: number().primaryKey(), + amount: number().decimal(24, 6).optional(), + done: date().optional(), + notes: array(Note).optional() + }).hasTableName('tasks') + ).hasMany( + t => t.notes, + t => t.id, + n => n.taskId + ); + const read = query(Knex({ client: 'pg' }), Task.schema) + .withRowSchema() + .select(t => ({ id: t.id, amount: t.amount, done: t.done })) + .include( + r => r.notes, + q => q.select(n => ({ body: n.body })) + ); + const Source = read.rowSchema; + const NoteSource = + Source.introspect().properties.notes.introspect().elementSchema!; + const PublicNote = object({ text: string() }); + const Target = object({ + id: number(), + amount: string().optional(), + done: date().optional(), + notes: array(PublicNote) + }); + const registry = mapper() + .configure(NoteSource, PublicNote, m => + m.for(t => t.text).from(s => s.body) + ) + .configure(Source, Target, m => + m + .for(t => t.amount) + .compute(s => s.amount ?? undefined) + .for(t => t.done) + .compute(s => s.done ?? undefined) + ); + const toPublic = registry.getSyncMapper(Source, Target); + const row = Source.parse({ + id: 1, + amount: '9007199254740993.000001', + done: null, + notes: [{ body: 'hello' }] + }); + const result = toPublic(row); + expectTypeOf(result.notes[0].text).toEqualTypeOf(); + expectTypeOf(result.done).toEqualTypeOf(); + // @ts-expect-error the selected projection has no unselected entity field + row.secret; + expect(result).toEqual({ + id: 1, + amount: '9007199254740993.000001', + done: undefined, + notes: [{ text: 'hello' }] + }); + expect(result).toEqual(await registry.getMapper(Source, Target)(row)); + expect(read.where(t => t.id, 1).rowSchema).toBe(Source); + }); +}); diff --git a/libs/knex-schema/src/read-projection.ts b/libs/knex-schema/src/read-projection.ts new file mode 100644 index 00000000..3d1251ff --- /dev/null +++ b/libs/knex-schema/src/read-projection.ts @@ -0,0 +1,87 @@ +import { number, string } from '@cleverbrush/schema'; +import type { Knex } from 'knex'; +import { + type AggregateExpression, + type AliasedColumn, + compileAggregate, + EXPRESSION, + isAggregate +} from './expressions.js'; +import { + compileReadSchema, + type ReadNode, + type ReadSchema, + ReadSchemaError, + readExpression +} from './read-schema.js'; + +/** @internal One selected field drives SQL, decoding and exposed schema metadata. */ +export type ReadField = { + node: ReadNode; + expression: (knex: Knex) => Knex.Raw; + aggregate?: boolean; +}; +/** @internal Compile typed columns and aggregates using a caller-owned column resolver. */ +export function compileReadProjection( + knex: Knex, + selection: Record | AggregateExpression>, + resolve: (column: AliasedColumn) => { name: string; node: ReadNode } +): Record { + if (!Object.keys(selection).length) + throw new ReadSchemaError('A non-empty projection is required'); + return Object.fromEntries( + Object.entries(selection).map(([key, expression]) => { + if (!isAggregate(expression)) { + const { name, node } = resolve(expression); + return [ + key, + { + node, + expression: (db: Knex) => readExpression(db, node, name) + } + ]; + } + const { kind, column, output } = expression[EXPRESSION]; + const compiled = compileAggregate( + knex, + expression, + c => resolve(c as AliasedColumn).name + ); + let node: ReadNode; + if (output) { + if (!('introspect' in output)) + throw new ReadSchemaError( + 'Aggregate output requires an introspectable Framework schema' + ); + node = compileReadSchema(output as ReadSchema, false); + } else if (kind === 'count' || kind === 'countDistinct') + node = compileReadSchema(number()); + else if (kind === 'sum' || kind === 'avg') + node = compileReadSchema(string().nullable()); + else + node = compileReadSchema( + resolve(column as AliasedColumn).node.schema.nullable() + ); + const dateResult = + !output && node.schema.introspect().type === 'date'; + return [ + key, + { + node: { + ...node, + decode: (value: unknown, path: string) => + node.decode( + dateResult ? value : compiled.decode(value), + path + ) + }, + expression: () => + dateResult + ? knex.raw('cast(? as text)', [compiled.native]) + : compiled.sql, + aggregate: true + } + ]; + }) + ); +} diff --git a/libs/knex-schema/src/read-schema.test-d.ts b/libs/knex-schema/src/read-schema.test-d.ts new file mode 100644 index 00000000..21da993e --- /dev/null +++ b/libs/knex-schema/src/read-schema.test-d.ts @@ -0,0 +1,85 @@ +import type { InferType } from '@cleverbrush/schema'; +import Knex from 'knex'; +import { expectTypeOf, test } from 'vitest'; +import { alias, eq } from './aliased-query.js'; +import { defineEntity } from './entity.js'; +import { date, number, object, string } from './extension.js'; +import { query } from './SchemaQueryBuilder.js'; + +const Task = object({ + id: number().primaryKey(), + title: string(), + amount: number().decimal(24, 6).optional(), + done: date().optional() +}).hasTableName('tasks'); +test('projection row type equals its runtime schema inference', async () => { + const read = query(Knex({ client: 'pg' }), Task) + .withRowSchema() + .select(t => ({ id: t.id, amount: t.amount, done: t.done })); + type Row = { id: number; amount: string | null; done: Date | null }; + expectTypeOf>().toEqualTypeOf(); + expectTypeOf(await read).toEqualTypeOf(); + // @ts-expect-error unknown columns are never accepted + read.select(t => ({ secret: t.secret })); +}); + +test('flat joins retain exact storage and left join nullability', async () => { + const read = query(Knex({ client: 'pg' }), alias(Task, 'task')) + .withRowSchema() + .leftJoin(alias(Task, 'other'), t => eq(t.task.id, t.other.id)) + .select(t => ({ + amount: t.task.amount, + otherId: t.other.id, + otherDate: t.other.done + })); + type Row = { + amount: string | null; + otherId: number | null; + otherDate: Date | null; + }; + expectTypeOf>().toEqualTypeOf(); + expectTypeOf(await read).toEqualTypeOf(); +}); + +test('optional declared joins and explicit relation customizers retain their shape', async () => { + const Owner = object({ + id: number().primaryKey(), + name: string() + }).hasTableName('owners'); + const WithOwner = Task.addProp('ownerId', number()).addProp( + 'owner', + Owner.optional() + ); + const entity = defineEntity(WithOwner).belongsTo( + t => t.owner, + t => t.ownerId, + u => u.id, + { optional: true } + ); + const read = query(Knex({ client: 'pg' }), entity.schema) + .withRowSchema() + .include( + r => r.owner, + q => q.select(u => ({ name: u.name })) + ); + const row = (await read)[0]; + expectTypeOf(row.owner).toExtend<{ name: string } | null>(); + // @ts-expect-error the relation may be null + const _required: { name: string } = row.owner; + const explicit = query(Knex({ client: 'pg' }), Task) + .withRowSchema() + .select(t => ({ title: t.title })) + .joinMany( + { + as: 'users', + localColumn: t => t.id, + foreignColumn: u => u.id, + foreignSchema: Owner + }, + q => q.select(u => ({ label: u.name })) + ); + const value = (await explicit)[0]; + expectTypeOf(value.users[0].label).toEqualTypeOf(); + // @ts-expect-error omitted foreign fields are not part of the selected result + value.users[0].id; +}); diff --git a/libs/knex-schema/src/read-schema.test.ts b/libs/knex-schema/src/read-schema.test.ts new file mode 100644 index 00000000..41db89f3 --- /dev/null +++ b/libs/knex-schema/src/read-schema.test.ts @@ -0,0 +1,163 @@ +import Knex from 'knex'; +import { describe, expect, it } from 'vitest'; +import { alias, eq } from './aliased-query.js'; +import { aggregate } from './expressions.js'; +import { date, number, object, string } from './extension.js'; +import { compileReadSchema } from './read-schema.js'; +import { query } from './SchemaQueryBuilder.js'; + +const Task = object({ + id: number().primaryKey(), + title: string(), + amount: number().decimal(24, 6).optional(), + completedAt: date().optional().hasColumnName('completed_at') +}).hasTableName('tasks'); +const knex = Knex({ client: 'pg' }); + +describe('schema-aware read metadata', () => { + it('describes only projected fields, SQL nulls and exact storage', () => { + const read = query(knex, Task) + .withRowSchema() + .select(t => ({ + title: t.title, + amount: t.amount, + done: t.completedAt + })); + const properties = read.rowSchema.introspect().properties; + expect(Object.keys(properties)).toEqual(['title', 'amount', 'done']); + expect( + read.rowSchema.validate({ + title: 'task', + amount: '9007199254740993.000001', + done: null + }).valid + ).toBe(true); + expect( + // @ts-expect-error Intentionally validate an invalid wire value. + read.rowSchema.validate({ title: 'task', amount: 1, done: null }) + .valid + ).toBe(false); + expect(read.toQuery()).toContain('cast('); + expect(read.toQuery()).not.toContain('"id" as'); + }); + it('preserves schema identity across immutable filters and transactions', () => { + const read = query(knex, Task).withRowSchema(); + const one = read.where(t => t.id, 1).limit(1); + const two = read.where(t => t.id, 2).offset(1); + expect(one.rowSchema).toBe(read.rowSchema); + expect(two.rowSchema).toBe(read.rowSchema); + expect(one.toQuery()).toContain('= 1'); + expect(two.toQuery()).toContain('= 2'); + expect(read.toQuery()).not.toContain('where'); + }); + it('does not apply entity input defaults or preprocessing during reads', () => { + const schema = string().default('input default'); + const node = compileReadSchema(schema); + expect(() => node.decode(undefined, 'value')).toThrow(); + expect(node.decode('stored', 'value')).toBe('stored'); + expect(() => + compileReadSchema(string().optional().default('input')) + ).toThrow(/ambiguous read nullability/); + expect(() => + compileReadSchema( + object({ value: string().optional().default('input') }) + ) + ).toThrow(/ambiguous read nullability/); + }); + it('decodes dates in nested JSON and rejects invalid values', () => { + const node = compileReadSchema( + object({ seen: date(), optional: date().optional() }) + ); + expect(node.decode({ seen: '2026-01-01T00:00:00Z' }, 'row')).toEqual({ + seen: new Date('2026-01-01T00:00:00Z') + }); + expect(() => node.decode({ seen: 'not a date' }, 'row')).toThrow( + /row.seen/ + ); + }); + it('interprets timezone-less dates consistently as UTC', () => { + const node = compileReadSchema(date()); + expect(node.decode('2026-01-02', 'date').toISOString()).toBe( + '2026-01-02T00:00:00.000Z' + ); + expect( + node.decode('2026-01-02 03:04:05.123456', 'date').toISOString() + ).toBe('2026-01-02T03:04:05.123Z'); + expect( + node.decode('2026-01-02T03:04:05+02:00', 'date').toISOString() + ).toBe('2026-01-02T01:04:05.000Z'); + }); + it('retains aggregate output schemas and rejects opaque parsers', () => { + const read = query(knex, Task) + .withRowSchema() + .select(t => ({ + count: aggregate.count(), + total: aggregate.sum(t.amount) + })); + expect(read.rowSchema.validate({ count: 3, total: null }).valid).toBe( + true + ); + expect(() => + query(knex, Task) + .withRowSchema() + .select(() => ({ + count: aggregate.count(undefined, { + output: { parse: () => 1 } + }) + })) + ).toThrow(/introspectable/); + }); + it('rejects entry after legacy shape changes', () => { + expect(() => + query(knex, Task) + .orderBy(t => t.id) + .withRowSchema() + ).toThrow(/before ordering/); + expect(() => query(knex, Task).limit(1).withRowSchema()).toThrow( + /before ordering/ + ); + expect(() => query(knex, Task).offset(1).withRowSchema()).toThrow( + /before ordering/ + ); + expect(() => + query(knex, Task) + .select(t => ({ id: t.id })) + .withRowSchema() + ).toThrow(/before/); + expect(() => + query(knex, Task).selectRaw('1 as other').withRowSchema() + ).toThrow(); + expect(() => + query(knex, Task) + .apply(q => q.whereRaw('true')) + .withRowSchema() + ).toThrow(/before/); + expect(() => + query(knex, alias(Task, 'task')) + .apply(q => q.select('id')) + .withRowSchema() + ).toThrow(/before/); + }); + it('describes immutable flat left joins with SQL nulls', () => { + const base = query(knex, alias(Task, 'task')).withRowSchema(); + expect(() => base.rowSchema).toThrow(/explicit select/); + const joined = base + .leftJoin(alias(Task, 'other'), t => eq(t.task.id, t.other.id)) + .select(t => ({ + id: t.task.id, + amount: t.other.amount, + otherId: t.other.id + })); + expect( + joined.rowSchema.validate({ id: 1, amount: null, otherId: null }) + .valid + ).toBe(true); + expect(joined.where(t => t.task.id, 1).rowSchema).toBe( + joined.rowSchema + ); + expect(joined.toQuery()).toContain('left join'); + expect(base.select(t => ({ id: t.task.id })).toQuery()).not.toContain( + 'join' + ); + }); +}); diff --git a/libs/knex-schema/src/read-schema.ts b/libs/knex-schema/src/read-schema.ts new file mode 100644 index 00000000..0803b794 --- /dev/null +++ b/libs/knex-schema/src/read-schema.ts @@ -0,0 +1,305 @@ +import { + type ArraySchemaBuilder, + array, + boolean, + date, + type InferType, + number, + type ObjectSchemaBuilder, + object, + type SchemaBuilder, + string, + union +} from '@cleverbrush/schema'; +import type { Knex } from 'knex'; +import { READ_SQL_TYPE } from './read-storage.js'; + +/** A schema builder accepted by the database-read schema compiler. */ +export type ReadSchema = SchemaBuilder; +/** A table/object schema accepted by schema-aware read queries. */ +export type ReadObject = ObjectSchemaBuilder; +/** Reconstruct structural schema types without discarding nested property schemas. */ +export type SchemaForValue = 0 extends 1 & T + ? ReadSchema + : NonNullable extends Date + ? SchemaBuilder< + Date, + undefined extends T ? false : true, + null extends T ? true : false + > + : NonNullable extends readonly (infer E)[] + ? ArraySchemaBuilder< + SchemaForValue, + undefined extends T ? false : true, + null extends T ? true : false, + undefined, + false, + {}, + NonNullable + > + : NonNullable extends object + ? ObjectSchemaBuilder< + { + [K in keyof NonNullable & string]-?: SchemaForValue< + NonNullable[K] + >; + }, + undefined extends T ? false : true, + null extends T ? true : false + > + : SchemaBuilder< + NonNullable, + undefined extends T ? false : true, + null extends T ? true : false + >; + +type StorageValue = S extends { + readonly [READ_SQL_TYPE]: infer SQL extends string; +} + ? string extends SQL + ? string | NonNullable> + : Lowercase extends + | 'bigint' + | 'bigserial' + | 'int8' + | `decimal${string}` + | `numeric${string}` + ? string + : NonNullable> + : NonNullable>; +/** Database columns are present; optional persisted values are represented by SQL null. */ +export type ReadValue = + | StorageValue + | (undefined extends InferType ? null : never) + | (null extends InferType ? null : never); +/** Structural schema for one decoded database column. */ +export type ColumnReadSchema = SchemaForValue>; +/** Derive a row's scalar properties, excluding explicitly declared navigation keys. */ +export type ObjectReadSchema = + S extends ObjectSchemaBuilder + ? ObjectSchemaBuilder<{ + [K in Exclude & string]: ColumnReadSchema< + P[K] + >; + }> + : never; + +/** Invalid or opaque query shapes are rejected instead of receiving invented schemas. */ +export class ReadSchemaError extends Error { + /** Describe an unsupported read shape or a decoded-value contract violation. */ + constructor(message: string) { + super(message); + this.name = 'ReadSchemaError'; + } +} + +/** @internal One shared description drives SQL projection, decoding and row metadata. */ +export interface ReadNode { + schema: ReadSchema; + exact: boolean; + decode(value: unknown, path: string): any; +} + +const exactSql = /^(numeric|decimal|bigint|bigserial|int8)(\b|\()/i; +const allowedSql: Record = { + string: /^(text|varchar|character varying|char|character|uuid|citext)(\b|\()/i, + number: /^(numeric|decimal|bigint|bigserial|int8|smallint|int2|integer|int|int4|serial|smallserial|real|float|float4|float8|double precision)(\b|\()/i, + boolean: /^(boolean|bool)$/i, + date: /^(date|timestamp|timestamptz)(\b|\()/i, + object: /^jsonb?$/i, + array: /^jsonb?$/i +}; + +/** @internal Compile output-only metadata, never replaying input preprocessors/defaults. */ +export function compileReadSchema(source: ReadSchema, column = true): ReadNode { + const info = source.introspect() as any; + // default() can promote the inferred input/output requirement without changing + // the underlying optional storage flag. That erased distinction cannot safely + // describe a read where input defaults are intentionally not replayed. + if (info.hasDefault && info.isRequired === false) + throw new ReadSchemaError( + 'Defaulted optional schemas have ambiguous read nullability; declare storage without input defaults' + ); + const sqlType = info.extensions?.columnType as string | undefined; + if (sqlType && !allowedSql[info.type]?.test(sqlType)) + throw new ReadSchemaError( + `Unsupported SQL type "${sqlType}" for ${info.type}` + ); + const nullable = info.isNullable || (column && info.isRequired === false); + const optional = !column && info.isRequired === false; + const exact = column && !!sqlType && exactSql.test(sqlType); + if (!column && sqlType && exactSql.test(sqlType)) + throw new ReadSchemaError( + 'Exact SQL numeric hints inside stored JSON cannot preserve precision; model those JSON values as strings' + ); + let schema: any; + let convert: (value: any, path: string) => any; + switch (info.type) { + case 'string': + schema = + info.equalsTo === undefined ? string() : string(info.equalsTo); + convert = value => value; + break; + case 'number': + schema = exact + ? string() + : info.equalsTo === undefined + ? number().isFloat() + : number(info.equalsTo); + convert = (value, path) => { + if (exact) { + if (typeof value !== 'string') + throw new ReadSchemaError( + `${path}: exact numeric text was not preserved by SQL` + ); + return value; + } + if (typeof value !== 'number' || !Number.isFinite(value)) + throw new ReadSchemaError( + `${path}: expected a finite database number` + ); + return value; + }; + break; + case 'boolean': + schema = boolean(); + convert = value => value; + break; + case 'date': + schema = date(); + convert = (value, path) => { + // Native dates/timestamps are projected as text at every SQL depth. + // Interpret timezone-less persisted values as UTC consistently; + // explicit offsets retain their meaning and input Date objects + // keep their instant. Do not depend on the driver's local timezone. + const text = + typeof value === 'string' && + /^\d{4}-\d{2}-\d{2}(?:[ T]\d{2}:\d{2}:\d{2}(?:\.\d+)?)?$/.test( + value + ) + ? `${value.length === 10 ? `${value}T00:00:00` : value.replace(' ', 'T')}Z` + : value; + const result = + value instanceof Date + ? value + : typeof text === 'string' + ? new Date(text) + : null; + if (!result || !Number.isFinite(result.getTime())) + throw new ReadSchemaError(`${path}: invalid database date`); + return result; + }; + break; + case 'object': { + const children = Object.fromEntries( + Object.entries(info.properties ?? {}).map(([key, child]) => [ + key, + compileReadSchema(child as ReadSchema, false) + ]) + ); + schema = object( + Object.fromEntries( + Object.entries(children).map(([key, child]) => [ + key, + child.schema + ]) + ) + ); + convert = (value, path) => decodeObject(children, value, path); + break; + } + case 'array': { + if (!info.elementSchema) + throw new ReadSchemaError( + 'Array read schema requires an element schema' + ); + const child = compileReadSchema(info.elementSchema, false); + schema = array(child.schema); + convert = (value, path) => { + if (!Array.isArray(value)) + throw new ReadSchemaError(`${path}: expected an array`); + return value.map((item, index) => + child.decode(item, `${path}[${index}]`) + ); + }; + break; + } + case 'union': { + const children: ReadNode[] = info.options.map( + (option: ReadSchema) => compileReadSchema(option, column) + ); + schema = children + .slice(1) + .reduce( + (s: any, child) => s.or(child.schema), + union(children[0].schema) + ); + convert = (value, path) => { + for (const child of children) { + try { + return child.decode(value, path); + } catch (error) { + if (!(error instanceof ReadSchemaError)) throw error; + } + } + throw new ReadSchemaError( + `${path}: no matching database union member` + ); + }; + break; + } + default: + throw new ReadSchemaError( + `Cannot derive a database read schema for ${info.type}` + ); + } + if (nullable) schema = schema.nullable(); + if (optional) schema = schema.optional(); + return { + schema, + exact, + decode(value, path) { + if (value === null && nullable) return null; + if (value === undefined && optional) return undefined; + const converted = convert(value, path); + if (!schema.validate(converted).valid) + throw new ReadSchemaError( + `${path}: database value does not match the read schema` + ); + return converted; + } + }; +} + +/** @internal Decode exactly the described fields, excluding internal or unselected columns. */ +export function decodeObject( + children: Record, + value: any, + path: string +): Record { + if (!value || typeof value !== 'object' || Array.isArray(value)) + throw new ReadSchemaError(`${path}: expected a database object`); + const result: Record = {}; + for (const [key, child] of Object.entries(children)) { + const decoded = child.decode(value[key], `${path}.${key}`); + if (decoded !== undefined) + Object.defineProperty(result, key, { + value: decoded, + enumerable: true, + configurable: true, + writable: true + }); + } + return result; +} + +/** @internal Cast exact values before PostgreSQL/JSON parsing can round them. */ +export function readExpression( + knex: Knex, + node: ReadNode, + column: string +): Knex.Raw { + return node.exact || node.schema.introspect().type === 'date' + ? knex.raw('cast(?? as text)', [column]) + : knex.raw('??', [column]); +} diff --git a/libs/knex-schema/src/read-storage.test-d.ts b/libs/knex-schema/src/read-storage.test-d.ts new file mode 100644 index 00000000..c0571fcf --- /dev/null +++ b/libs/knex-schema/src/read-storage.test-d.ts @@ -0,0 +1,29 @@ +import type { InferType } from '@cleverbrush/schema'; +import { expectTypeOf, test } from 'vitest'; +import { number } from './extension.js'; +import type { READ_SQL_TYPE } from './read-storage.js'; + +test('numeric storage metadata survives schema modifiers', () => { + const price = number() + .decimal(20, 4) + .optional() + .hasColumnName('price_value'); + expectTypeOf>().toEqualTypeOf(); + expectTypeOf< + (typeof price)[typeof READ_SQL_TYPE] + >().toEqualTypeOf<'decimal'>(); + const named = number() + .hasColumnName('price_value') + .decimal(20, 4) + .nullable() + .index(); + expectTypeOf>().toEqualTypeOf(); + expectTypeOf< + (typeof named)[typeof READ_SQL_TYPE] + >().toEqualTypeOf<'decimal'>(); + const overridden = named.columnType('integer').required().notNullable(); + expectTypeOf< + (typeof overridden)[typeof READ_SQL_TYPE] + >().toEqualTypeOf<'integer'>(); + expectTypeOf>().toEqualTypeOf(); +}); diff --git a/libs/knex-schema/src/read-storage.ts b/libs/knex-schema/src/read-storage.ts new file mode 100644 index 00000000..96a22a23 --- /dev/null +++ b/libs/knex-schema/src/read-storage.ts @@ -0,0 +1,105 @@ +import { NumberSchemaBuilder } from '@cleverbrush/schema'; + +/** SQL storage type retained by numeric column builders for schema-aware reads. */ +export const READ_SQL_TYPE: unique symbol = Symbol.for( + '@cleverbrush/knex-schema:read-sql-type' +); + +type Preserved = { + [K in Exclude< + keyof E, + typeof READ_SQL_TYPE | 'columnType' | 'bigint' | 'smallint' | 'decimal' + >]: E[K] extends (...args: infer A) => any + ? (this: S, ...args: A) => S + : E[K]; +} & { readonly [READ_SQL_TYPE]: SQL }; + +/** A numeric validation schema whose SQL representation survives ordinary modifiers. */ +export type SqlNumber< + T, + R extends boolean, + N extends boolean, + D extends boolean, + E, + SQL extends string +> = NumberSchemaBuilder> & Preserved; + +declare module '@cleverbrush/schema' { + interface NumberSchemaBuilder< + TResult, + TRequired extends boolean, + TNullable extends boolean, + THasDefault extends boolean, + TExtensions + > { + /** Set a SQL storage type; schema-aware reads retain its representation. */ + columnType( + type: SQL + ): SqlNumber< + TResult, + TRequired, + TNullable, + THasDefault, + TExtensions, + SQL + >; + /** Set bigint storage; schema-aware reads return exact strings. */ + bigint(): SqlNumber< + TResult, + TRequired, + TNullable, + THasDefault, + TExtensions, + 'bigint' + >; + /** Set smallint storage; schema-aware reads return numbers. */ + smallint(): SqlNumber< + TResult, + TRequired, + TNullable, + THasDefault, + TExtensions, + 'smallint' + >; + /** Set decimal storage; schema-aware reads return exact strings. */ + decimal( + precision: number, + scale: number + ): SqlNumber< + TResult, + TRequired, + TNullable, + THasDefault, + TExtensions, + 'decimal' + >; + } +} + +// Match the declaration augmentation for base-schema factories too, just as the +// package's primary-key augmentation does. Every method still returns a clone. +const prototype = NumberSchemaBuilder.prototype as any; +const methods = { + columnType(this: NumberSchemaBuilder, type: string) { + return this.withExtension('columnType', type); + }, + bigint(this: NumberSchemaBuilder) { + return this.withExtension('columnType', 'bigint'); + }, + smallint(this: NumberSchemaBuilder) { + return this.withExtension('columnType', 'smallint'); + }, + decimal(this: NumberSchemaBuilder, precision: number, scale: number) { + return this.withExtension( + 'columnType', + `decimal(${precision},${scale})` + ); + } +}; +for (const [name, method] of Object.entries(methods)) + if (typeof prototype[name] !== 'function') + Object.defineProperty(prototype, name, { + value: method, + configurable: true, + writable: true + }); diff --git a/libs/knex-schema/src/types.ts b/libs/knex-schema/src/types.ts index 9832f2af..cd070d25 100644 --- a/libs/knex-schema/src/types.ts +++ b/libs/knex-schema/src/types.ts @@ -536,6 +536,11 @@ export interface RelationSpec { name: string; schema: any; foreignKey?: any; + /** Explicit schema property names retained for opt-in read correlation. */ + localKey?: string; + remoteKey?: string; + /** Nullable belongs-to relations do not filter out their parent rows. */ + optional?: boolean; through?: { table: string; localKey: string; foreignKey: string }; } diff --git a/libs/knex-schema/tsconfig.typecheck.json b/libs/knex-schema/tsconfig.typecheck.json index c24a9fd6..fed7da48 100644 --- a/libs/knex-schema/tsconfig.typecheck.json +++ b/libs/knex-schema/tsconfig.typecheck.json @@ -1,6 +1,6 @@ { "extends": "./tsconfig.build.json", "compilerOptions": { "noEmit": true, "strict": true }, - "include": ["src/**/*.test-d.ts"], + "include": ["src/**/*.test-d.ts", "src/read-*.test.ts"], "exclude": [] } diff --git a/libs/knex-schema/vitest.config.mts b/libs/knex-schema/vitest.config.mts index c2329925..045819a5 100644 --- a/libs/knex-schema/vitest.config.mts +++ b/libs/knex-schema/vitest.config.mts @@ -5,7 +5,7 @@ export default defineConfig({ include: ['src/**/*.test.ts'], typecheck: { enabled: true, - include: ['src/**/*.test-d.ts'], + include: ['src/**/*.test-d.ts', 'src/read-*.test.ts'], tsconfig: './tsconfig.typecheck.json' } } diff --git a/libs/mapper/README.md b/libs/mapper/README.md index b8d83a78..e1c6a6c2 100644 --- a/libs/mapper/README.md +++ b/libs/mapper/README.md @@ -40,6 +40,32 @@ npm install @cleverbrush/mapper **Peer dependency:** `@cleverbrush/schema` +## Synchronous mapping + +Use the same `configure()` API and retrieve a synchronous mapper when every final +step and nested mapping is synchronous: + +```ts +const registry = mapper().configure(Source, Target, m => m + .for(t => t.label).compute(s => s.name.toUpperCase())); +const toTarget = registry.getSyncMapper(Source, Target); +const results = rows.map(toTarget); // ordinary values, not promises +``` + +Completeness checking, `.from()`, ignores, nested objects/arrays and compatible +auto-mapping still apply. Async computations or nested async mappings reject +`getSyncMapper()` at compile time; runtime guards cover JavaScript and unsafe +casts too. Callbacks are never probed during configuration. A function falsely +typed as synchronous that returns a promise/thenable throws when invoked. +`getMapper()` still always returns an async function. There is no separate +`configureSync()` API. + +Configure once and reuse the same source/target schema instances. Queries can +provide their projection schema through `.withRowSchema().rowSchema`; see the +[projection-aware read guide](../knex-schema/READ-SCHEMAS.md), including separate +definition/mapping/service files and explicit polymorphic dispatch. The mapper +performs no database calls or application enrichment. + ## Quick Start ```typescript diff --git a/libs/mapper/src/MappingRegistry.ts b/libs/mapper/src/MappingRegistry.ts index c0a97b79..3b122021 100644 --- a/libs/mapper/src/MappingRegistry.ts +++ b/libs/mapper/src/MappingRegistry.ts @@ -19,6 +19,78 @@ const SYMBOL_TARGET_PROPERTY_KEY: unique symbol = Symbol('targetPropertyKey'); * unmapped target properties. Using a symbol keeps it out of IntelliSense. */ const SYMBOL_UNMAPPED: unique symbol = Symbol('unmapped'); +const SYMBOL_STEPS: unique symbol = Symbol('mappingSteps'); + +type Step = Omit & + Record; +type IsAsync = 0 extends 1 & T + ? true + : [Extract>] extends [never] + ? false + : true; +type NestedAsync = + S extends ArraySchemaBuilder + ? T extends ArraySchemaBuilder + ? NestedAsync< + ExtractArrayElementSchema, + ExtractArrayElementSchema, + Registered + > + : false + : [S, T] extends Registered + ? true + : false; +type AsyncKeys = { + [K in keyof ExtractSchemaProperties & string]: K extends keyof Steps + ? Steps[K] extends false + ? never + : K + : K extends keyof ExtractSchemaProperties + ? NestedAsync< + ExtractSchemaProperties[K], + ExtractSchemaProperties[K], + Registered + > extends false + ? never + : K + : never; +}[keyof ExtractSchemaProperties & string]; + +/** Compile-time diagnostics for incomplete or asynchronous mapping steps. */ +type SyncMappingArguments = [Unmapped] extends [ + never +] + ? [Async] extends [never] + ? [] + : [error: 'Mapping contains asynchronous steps'] + : [error: `Unmapped properties: ${Unmapped}`]; + +/** Compile-time diagnostics for registered synchronous mapping pairs. */ +type RegisteredSyncArguments = Pair extends Registered + ? Pair extends Async + ? [error: 'Mapping contains asynchronous steps'] + : [] + : [error: 'Mapping is not registered']; + +const syncImplementations = new WeakMap any>(); + +function assertSync(value: any, key: string): any { + if (value != null && typeof value.then === 'function') { + throw new MapperConfigurationError( + `Synchronous mapping returned a thenable for property "${key}"` + ); + } + return value; +} + +function synchronous(fn: Function): (source: any) => any { + const result = syncImplementations.get(fn); + if (!result) + throw new MapperConfigurationError( + 'Mapping contains an asynchronous computation or nested mapper' + ); + return result; +} // ── Helper Types ────────────────────────────────────────────────────── @@ -85,10 +157,11 @@ type TargetPropertySchema< /** * Extracts the element schema from an ArraySchemaBuilder. */ -type ExtractArrayElementSchema = - T extends ArraySchemaBuilder - ? TElementSchema - : never; +type ExtractArrayElementSchema = T extends { + introspect(): { elementSchema: infer TElementSchema }; +} + ? NonNullable + : never; /** * Extracts the property schema from a PropertyDescriptor's `getSchema()` @@ -117,15 +190,39 @@ type ExtractPropertySchema = T extends { * - Neither is ObjectSchemaBuilder + incompatible InferType → `true` */ type NeedsMapping = - TSourcePropSchema extends ArraySchemaBuilder - ? TTargetPropSchema extends ArraySchemaBuilder + TSourcePropSchema extends ArraySchemaBuilder< + any, + any, + any, + any, + any, + any, + any + > + ? TTargetPropSchema extends ArraySchemaBuilder< + any, + any, + any, + any, + any, + any, + any + > ? NeedsMapping< ExtractArrayElementSchema, ExtractArrayElementSchema, TRegistered > : true - : TTargetPropSchema extends ArraySchemaBuilder + : TTargetPropSchema extends ArraySchemaBuilder< + any, + any, + any, + any, + any, + any, + any + > ? true : TSourcePropSchema extends ObjectSchemaBuilder ? TTargetPropSchema extends ObjectSchemaBuilder @@ -176,8 +273,24 @@ type CheckSchemaCompatible = [InferType] extends [InferType] ? true : // Both arrays → recurse into element schemas - TSourceSchema extends ArraySchemaBuilder - ? TTargetSchema extends ArraySchemaBuilder + TSourceSchema extends ArraySchemaBuilder< + any, + any, + any, + any, + any, + any, + any + > + ? TTargetSchema extends ArraySchemaBuilder< + any, + any, + any, + any, + any, + any, + any + > ? CheckSchemaCompatible< ExtractArrayElementSchema, ExtractArrayElementSchema, @@ -217,11 +330,18 @@ type IsFromCompatible< // ── Mapper Result Type ──────────────────────────────────────────────── +/** A mapping function that always returns a Promise, including for pure mappings. */ export type SchemaToSchemaMapperResult< TFromSchema extends ObjectSchemaBuilder, TToSchema extends ObjectSchemaBuilder > = (from: InferType) => Promise>; +/** A complete synchronous mapping; unexpected thenables throw instead of leaking into DTOs. */ +export type SyncSchemaToSchemaMapperResult< + TFromSchema extends ObjectSchemaBuilder, + TToSchema extends ObjectSchemaBuilder +> = (from: InferType) => InferType; + // ── Error Class ─────────────────────────────────────────────────────── export class MapperConfigurationError extends Error { @@ -264,7 +384,7 @@ type MappingEntry = { function resolveElementMapper( sourceElementSchema: SchemaBuilder, targetElementSchema: SchemaBuilder, - registry: MappingRegistry | undefined + registry: MappingRegistry | undefined ): ((element: any) => Promise) | null { // Both element schemas are ObjectSchemaBuilder: look up registered mapper if ( @@ -290,7 +410,9 @@ function resolveElementMapper( fromKeys.length === toKeys.length && fromKeys.every((k, i) => k === toKeys[i]) ) { - return async (element: any) => element; + const copy = async (element: any) => element; + syncImplementations.set(copy, element => element); + return copy; } return null; } @@ -311,11 +433,19 @@ function resolveElementMapper( registry ); if (innerMapper) { - return async (arr: any) => { + const mapArray = async (arr: any) => { if (arr == null) return undefined; if (!Array.isArray(arr)) return arr; return Promise.all(arr.map(innerMapper)); }; + const sync = syncImplementations.get(innerMapper); + if (sync) + syncImplementations.set(mapArray, arr => { + if (arr == null) return undefined; + if (!Array.isArray(arr)) return arr; + return arr.map(sync); + }); + return mapArray; } } return null; @@ -345,7 +475,9 @@ function resolveElementMapper( ) { return null; } - return async (element: any) => element; + const copy = async (element: any) => element; + syncImplementations.set(copy, element => element); + return copy; } return null; @@ -365,14 +497,30 @@ export class PropertyMappingBuilder< TToSchema extends ObjectSchemaBuilder, TKey extends string, TUnmapped extends string, - TRegistered = never + TRegistered = never, + TAsyncRegistered = never, + TSteps = {} > { - private readonly _mapper: Mapper; + private readonly _mapper: Mapper< + TFromSchema, + TToSchema, + any, + TRegistered, + TAsyncRegistered, + TSteps + >; private readonly _targetKey: TKey; /** @internal */ constructor( - mapper: Mapper, + mapper: Mapper< + TFromSchema, + TToSchema, + any, + TRegistered, + TAsyncRegistered, + TSteps + >, targetKey: TKey ) { this._mapper = mapper; @@ -407,11 +555,7 @@ export class PropertyMappingBuilder< } >( selector: ( - tree: PropertyDescriptorTree< - TFromSchema, - TFromSchema, - SchemaPropertyInferredType - > + tree: PropertyDescriptorTree ) => TReturn, ..._args: [TReturn] extends [never] ? [ @@ -427,7 +571,22 @@ export class PropertyMappingBuilder< : [ error: `Property '${TKey}': source property type is not assignable to the target property type. Use compute() instead.` ] - ): Mapper, TRegistered> { + ): Mapper< + TFromSchema, + TToSchema, + Exclude, + TRegistered, + TAsyncRegistered, + Step< + TSteps, + TKey, + NestedAsync< + ExtractPropertySchema, + TargetPropertySchema, + TAsyncRegistered + > + > + > { const sourceTree = ObjectSchemaBuilder.getPropertiesFor( this._mapper['_fromSchema'] ); @@ -466,10 +625,26 @@ export class PropertyMappingBuilder< targetPropSchema instanceof ArraySchemaBuilder ) { const sourceElementSchema = ( - sourceSchema as ArraySchemaBuilder + sourceSchema as ArraySchemaBuilder< + any, + any, + any, + any, + any, + any, + any + > ).introspect().elementSchema; const targetElementSchema = ( - targetPropSchema as ArraySchemaBuilder + targetPropSchema as ArraySchemaBuilder< + any, + any, + any, + any, + any, + any, + any + > ).introspect().elementSchema; if (sourceElementSchema && targetElementSchema) { @@ -501,15 +676,20 @@ export class PropertyMappingBuilder< * Computes the target property value from the entire source object. * Supports both sync and async functions. */ - public compute( - fn: - | (( - obj: InferType - ) => SchemaPropertyInferredType) - | (( - obj: InferType - ) => Promise>) - ): Mapper, TRegistered> { + public compute< + TResult extends + | SchemaPropertyInferredType + | Promise> + >( + fn: (obj: InferType) => TResult + ): Mapper< + TFromSchema, + TToSchema, + Exclude, + TRegistered, + TAsyncRegistered, + Step> + > { this._mapper['_mappings'].set(this._targetKey, { type: 'custom', fn: fn as any @@ -526,7 +706,9 @@ export class PropertyMappingBuilder< TFromSchema, TToSchema, Exclude, - TRegistered + TRegistered, + TAsyncRegistered, + Step > { this._mapper['_mappings'].set(this._targetKey, { type: 'ignore' @@ -558,14 +740,18 @@ export class Mapper< TFromSchema extends ObjectSchemaBuilder, TToSchema extends ObjectSchemaBuilder, TUnmapped extends string = SchemaKeys, - TRegistered = never + TRegistered = never, + TAsyncRegistered = never, + TSteps = {} > { /** Phantom property for structural type-checking of TUnmapped. */ declare readonly [SYMBOL_UNMAPPED]: TUnmapped; + /** @internal Tracks final per-property computations without executing them. */ + declare readonly [SYMBOL_STEPS]: TSteps; private readonly _fromSchema: TFromSchema; private readonly _toSchema: TToSchema; - private readonly _registry: MappingRegistry | undefined; + private readonly _registry: MappingRegistry | undefined; private readonly _mappings: Map = new Map(); /** @@ -577,7 +763,7 @@ export class Mapper< public constructor( fromSchema: TFromSchema, toSchema: TToSchema, - registry?: MappingRegistry + registry?: MappingRegistry ) { this._fromSchema = fromSchema; this._toSchema = toSchema; @@ -602,7 +788,9 @@ export class Mapper< TToSchema, TKey, TUnmapped, - TRegistered + TRegistered, + TAsyncRegistered, + TSteps > { // At runtime, use a Proxy to detect which property was accessed let capturedKey: string | undefined; @@ -637,6 +825,29 @@ export class Mapper< return new PropertyMappingBuilder(this, capturedKey as TKey); } + /** + * Compile a synchronous function when the complete mapping has no async steps. + * Eligibility is inferred through compute(), from(), nested mappings and overrides. + * Callbacks are never probed during configuration. A disguised Promise/thenable + * throws at invocation; known async functions/dependencies throw at compilation. + * @throws MapperConfigurationError for incomplete or asynchronous mappings. + */ + public getSyncMapper( + ..._args: SyncMappingArguments< + TUnmapped, + AsyncKeys + > + ): SyncSchemaToSchemaMapperResult { + return synchronous( + ( + this.getMapper as () => SchemaToSchemaMapperResult< + TFromSchema, + TToSchema + > + )() + ); + } + /** * Returns the configured async mapping function. * @@ -852,6 +1063,60 @@ export class Mapper< return result; }; + // The same finalized entries drive the sync executor. Only execution differs; + // descriptor selection, automatic mapping and completeness are shared above. + const syncEntries = [...mappings].map(([key, entry]) => { + const nested = entry.autoMapper ?? entry.elementMapper; + const nestedSync = nested + ? syncImplementations.get(nested) + : undefined; + if ( + (nested && !nestedSync) || + entry.fn?.constructor.name === 'AsyncFunction' + ) + return null; + return { key, entry, nestedSync }; + }); + if (syncEntries.every(entry => entry !== null)) { + syncImplementations.set(mapperFn, source => { + const result: Record = {}; + for (const { key, entry, nestedSync } of syncEntries) { + if (entry.type === 'ignore') continue; + let value: any; + if (entry.type === 'custom') + value = assertSync(entry.fn!(source), key); + else { + const read = + entry.sourceDescriptorInner.getValue(source); + if (!read.success) continue; + value = read.value; + if (entry.type === 'auto') { + if (value === undefined) continue; + value = assertSync(nestedSync!(value), key); + } else if (entry.type === 'autoArray') { + if (value == null) continue; + if (!Array.isArray(value)) + throw new MapperConfigurationError( + `Expected array for property "${key}" but got ${typeof value}` + ); + value = value.map(element => + assertSync(nestedSync!(element), key) + ); + } + } + const target = (targetTree as any)[key]?.[ + SYMBOL_SCHEMA_PROPERTY_DESCRIPTOR + ]; + if (target) + target.setValue(result, value, { + createMissingStructure: true + }); + else result[key] = value; + } + return result; + }); + } + // Auto-register in the registry if available if (this._registry) { this._registry['_mappers'] @@ -865,7 +1130,7 @@ export class Mapper< // ── MappingRegistry ─────────────────────────────────────────────────── -export class MappingRegistry { +export class MappingRegistry { protected readonly _mappers: Map< ObjectSchemaBuilder, Map< @@ -904,7 +1169,8 @@ export class MappingRegistry { */ public configure< TFromSchema extends ObjectSchemaBuilder, - TToSchema extends ObjectSchemaBuilder + TToSchema extends ObjectSchemaBuilder, + TSteps = {} >( fromSchema: TFromSchema, toSchema: TToSchema, @@ -913,10 +1179,26 @@ export class MappingRegistry { TFromSchema, TToSchema, KeysNeedingMapping, - TRegistered + TRegistered, + TAsyncRegistered > - ) => Mapper - ): MappingRegistry { + ) => Mapper< + TFromSchema, + TToSchema, + never, + TRegistered, + TAsyncRegistered, + TSteps + > + ): MappingRegistry< + TRegistered | [TFromSchema, TToSchema], + | TAsyncRegistered + | ([ + AsyncKeys + ] extends [never] + ? never + : [TFromSchema, TToSchema]) + > { if (!this.#ensureObjectSchemas(fromSchema, toSchema)) { throw new Error( 'Both fromSchema and toSchema must be instances of ObjectSchemaBuilder' @@ -933,7 +1215,13 @@ export class MappingRegistry { // Create new immutable registry with cloned mappings const newRegistry = new MappingRegistry< - TRegistered | [TFromSchema, TToSchema] + TRegistered | [TFromSchema, TToSchema], + | TAsyncRegistered + | ([ + AsyncKeys + ] extends [never] + ? never + : [TFromSchema, TToSchema]) >(); for (const [from, toMap] of this._mappers) { newRegistry._mappers.set(from, new Map(toMap)); @@ -949,25 +1237,42 @@ export class MappingRegistry { TFromSchema, TToSchema, KeysNeedingMapping, - TRegistered + TRegistered, + TAsyncRegistered >(fromSchema, toSchema, newRegistry); // Configure via user callback const configuredMapper = fn(mapper); // Implicit finalization: auto-map + validate + register - ( - configuredMapper as Mapper< - TFromSchema, - TToSchema, - never, - TRegistered - > - ).getMapper(); + configuredMapper.getMapper(); return newRegistry; } + /** + * Retrieve a registered synchronous mapper inferred from configure(). + * The pair must be registered and its final steps must all be synchronous. + * Async mappings remain usable with getMapper(); configuration never executes + * compute callbacks. Unexpected thenables throw when the returned mapper runs. + * @throws MapperConfigurationError for an asynchronous dependency. + * @throws Error if the schema pair has not been registered. + */ + public getSyncMapper< + TFromSchema extends ObjectSchemaBuilder, + TToSchema extends ObjectSchemaBuilder + >( + fromSchema: TFromSchema, + toSchema: TToSchema, + ..._args: RegisteredSyncArguments< + [TFromSchema, TToSchema], + TRegistered, + TAsyncRegistered + > + ): SyncSchemaToSchemaMapperResult { + return synchronous(this.getMapper(fromSchema, toSchema)); + } + /** * Gets a mapper function that will map from the fromSchema to the toSchema. * Throws an error if no mapper is found for the given schemas pair. diff --git a/libs/mapper/src/index.ts b/libs/mapper/src/index.ts index 22c3d837..4eb8448c 100644 --- a/libs/mapper/src/index.ts +++ b/libs/mapper/src/index.ts @@ -1,4 +1,7 @@ -export type { SchemaToSchemaMapperResult } from './MappingRegistry.js'; +export type { + SchemaToSchemaMapperResult, + SyncSchemaToSchemaMapperResult +} from './MappingRegistry.js'; export { Mapper, MapperConfigurationError, diff --git a/libs/mapper/src/sync.test.ts b/libs/mapper/src/sync.test.ts new file mode 100644 index 00000000..e6df6f24 --- /dev/null +++ b/libs/mapper/src/sync.test.ts @@ -0,0 +1,156 @@ +import { array, number, object, string } from '@cleverbrush/schema'; +import { describe, expect, expectTypeOf, it, vi } from 'vitest'; +import { Mapper, MapperConfigurationError, mapper } from './index.js'; + +const Source = object({ id: number(), title: string() }); +const Target = object({ id: number(), label: string() }); + +describe('inferred synchronous mapping', () => { + it('returns an ordinary value and preserves the async API', async () => { + const compute = vi.fn((s: { title: string }) => s.title.toUpperCase()); + const registry = mapper().configure(Source, Target, m => + m.for(t => t.label).compute(compute) + ); + const sync = registry.getSyncMapper(Source, Target); + expect(compute).not.toHaveBeenCalled(); + const result = sync({ id: 1, title: 'hello' }); + expectTypeOf(result).toEqualTypeOf<{ id: number; label: string }>(); + expect(result).toEqual({ id: 1, label: 'HELLO' }); + const asyncResult = registry.getMapper( + Source, + Target + )({ id: 1, title: 'hello' }); + expect(asyncResult).toBeInstanceOf(Promise); + expect(await asyncResult).toEqual(result); + }); + + it('rejects async computations at compile time and runtime', () => { + const registry = mapper().configure(Source, Target, m => + m.for(t => t.label).compute(async s => s.title) + ); + expect(() => { + // @ts-expect-error asynchronous mapping cannot be retrieved synchronously + registry.getSyncMapper(Source, Target); + }).toThrow(MapperConfigurationError); + }); + + it('tracks nested objects and arrays including explicit from', () => { + const Parent = object({ child: Source, children: array(Source) }); + const Dto = object({ child: Target, children: array(Target) }); + const registry = mapper() + .configure(Source, Target, m => + m.for(t => t.label).compute(s => s.title) + ) + .configure(Parent, Dto, m => + m.for(t => t.children).from(s => s.children) + ); + expect( + registry.getSyncMapper( + Parent, + Dto + )({ + child: { id: 1, title: 'one' }, + children: [{ id: 2, title: 'two' }] + }) + ).toEqual({ + child: { id: 1, label: 'one' }, + children: [{ id: 2, label: 'two' }] + }); + const asyncRegistry = mapper() + .configure(Source, Target, m => + m.for(t => t.label).compute(async s => s.title) + ) + .configure(Parent, Dto, m => m); + expect(() => { + // @ts-expect-error nested async mapping makes the parent async + asyncRegistry.getSyncMapper(Parent, Dto); + }).toThrow(MapperConfigurationError); + }); + + it('uses final overrides, not discarded async computations', () => { + const registry = mapper().configure(Source, Target, m => + m + .for(t => t.label) + .compute(async s => s.title) + .for(t => t.label) + .compute(s => s.title) + ); + expect( + registry.getSyncMapper(Source, Target)({ id: 3, title: 'three' }) + ).toEqual({ id: 3, label: 'three' }); + }); + + it('guards functions returning disguised thenables without probing them', () => { + const registry = mapper().configure(Source, Target, m => + m + .for(t => t.label) + // biome-ignore lint/suspicious/noThenProperty: test a deliberately disguised thenable + .compute(() => ({ then() {} }) as unknown as string) + ); + expect(() => + registry.getSyncMapper(Source, Target)({ id: 1, title: '' }) + ).toThrow(/thenable.*label/); + }); + + it('retains completeness checks for direct builders', () => { + const direct = new Mapper(Source, Target) + .for(t => t.id) + .from(s => s.id) + .for(t => t.label) + .compute(s => s.title); + expect(direct.getSyncMapper()({ id: 1, title: 'one' })).toEqual({ + id: 1, + label: 'one' + }); + expect(() => { + // @ts-expect-error both target properties are still unmapped + new Mapper(Source, Target).getSyncMapper(); + }).toThrow(/not mapped/); + }); + + it('rejects conditional promises and async nested arrays without probing callbacks', () => { + const compute = vi.fn((s: { title: string }) => + s.title ? s.title : Promise.resolve('fallback') + ); + const registry = mapper().configure(Source, Target, m => + m.for(t => t.label).compute(compute) + ); + const Parent = object({ groups: array(array(Source)) }); + const Dto = object({ groups: array(array(Target)) }); + const nested = registry.configure(Parent, Dto, m => m); + expect(compute).not.toHaveBeenCalled(); + // Non-native async functions cannot be recognized without invoking them; + // the type system rejects retrieval, and invocation guards the false branch. + // @ts-expect-error a conditional Promise is still asynchronous + const unsafe = nested.getSyncMapper(Parent, Dto); + expect(() => unsafe({ groups: [[{ id: 1, title: '' }]] })).toThrow( + /thenable/ + ); + }); + + it('matches async values and errors for optional arrays and thrown computations', async () => { + const From = object({ items: array(Source).optional() }); + const To = object({ items: array(Target).optional() }); + const registry = mapper() + .configure(Source, Target, m => + m + .for(t => t.label) + .compute(s => { + if (!s.title) throw new Error('missing title'); + return s.title; + }) + ) + .configure(From, To, m => m); + const sync = registry.getSyncMapper(From, To); + const async = registry.getMapper(From, To); + for (const value of [ + {}, + { items: [] }, + { items: [{ id: 1, title: 'one' }] } + ]) + expect(sync(value)).toEqual(await async(value)); + const invalid = { items: [{ id: 1, title: '' }] }; + expect(() => sync(invalid)).toThrow('missing title'); + await expect(async(invalid)).rejects.toThrow('missing title'); + }); +}); diff --git a/libs/mapper/vitest.config.mts b/libs/mapper/vitest.config.mts new file mode 100644 index 00000000..2a17c278 --- /dev/null +++ b/libs/mapper/vitest.config.mts @@ -0,0 +1,12 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + include: ['src/**/*.test.ts'], + typecheck: { + enabled: true, + include: ['src/**/*.test.ts'], + tsconfig: './tsconfig.json' + } + } +}); diff --git a/libs/orm/README.md b/libs/orm/README.md index 35226880..d4ec01cf 100644 --- a/libs/orm/README.md +++ b/libs/orm/README.md @@ -21,6 +21,27 @@ npm install @cleverbrush/orm `knex` is a peer dependency (install it alongside `@cleverbrush/orm`). `@cleverbrush/knex-schema` is a direct dependency and is installed automatically. +## Detached reads with result schemas + +`db.users.withRowSchema()` enters an immutable read-only API whose `rowSchema` +matches its decoded selection and includes. Results remain **detached even when +the context uses `{ tracking: true }`**. This avoids attaching partial projections +as incomplete tracked entities. Ordinary entity queries keep their old behavior. + +```ts +const read = db.users.withRowSchema() + .select(u => ({ id: u.id, name: u.name })); +const Source = read.rowSchema; +const toDto = mapper().configure(Source, UserDto, m => m) + .getSyncMapper(Source, UserDto); +const users = (await read).map(toDto); +``` + +Typed relation customizers return their configured query; nested graphs are +decoded in one SQL statement. STI/CTI readers expose `variantRowSchemas` for +explicit application mapping. See the [read-schema consumer guide](../knex-schema/READ-SCHEMAS.md) +for numeric/null/date rules, examples and compatibility boundaries. + --- ## Quick start diff --git a/libs/orm/src/dbset.ts b/libs/orm/src/dbset.ts index 2369ce8d..35110ac4 100644 --- a/libs/orm/src/dbset.ts +++ b/libs/orm/src/dbset.ts @@ -15,7 +15,8 @@ import type { Entity, EntityRelations, EntitySchema, - PrimaryKeyValueOf + PrimaryKeyValueOf, + SchemaAwareQuery } from '@cleverbrush/knex-schema'; import { getPrimaryKeyColumns, @@ -46,7 +47,9 @@ import { updateVariant as _updateVariant } from './variant-write.js'; -const scalarAggregateMethods = new Set([ +// These methods return scalars or detached read plans, not tracked entity rows. +const untrackedResultMethods = new Set([ + 'withRowSchema', 'countValue', 'countDistinctValue', 'sumValue', @@ -73,8 +76,13 @@ const scalarAggregateMethods = new Set([ export interface EntityQuery, TResult> extends Omit< SchemaQueryBuilder, TResult>, - 'include' | 'includeVariant' + 'include' | 'includeVariant' | 'withRowSchema' > { + /** + * Start an immutable detached read model with inferred runtime row schemas. + * Enable before select/include operations; results never attach to tracking. + */ + withRowSchema(): SchemaAwareQuery>; /** * Eager-load a relation declared on `TEntity` via `.hasOne()` / * `.hasMany()` / `.belongsTo()` / `.belongsToMany()`. Selector returns @@ -465,7 +473,7 @@ function wrapQuery, TResult>( if ( onResults != null && sqb.returnsEntityRows && - !scalarAggregateMethods.has(prop) && + !untrackedResultMethods.has(prop) && result != null && typeof (result as any).then === 'function' ) { @@ -960,7 +968,7 @@ function wrapVariantQuery< if ( onResults != null && sqb.returnsEntityRows && - !scalarAggregateMethods.has(prop) && + !untrackedResultMethods.has(prop) && result != null && typeof (result as any).then === 'function' ) { diff --git a/websites/docs/app/knex-schema/page.tsx b/websites/docs/app/knex-schema/page.tsx index 9a3b6fe9..7cae6e15 100644 --- a/websites/docs/app/knex-schema/page.tsx +++ b/websites/docs/app/knex-schema/page.tsx @@ -18,6 +18,37 @@ export default function KnexSchemaPage() {

+ + {/* ── Installation ─────────────────────────────────── */} +
+

Synchronous mapping and query row schemas

+

+ Keep the existing configure() API. When the final + computations and nested mappings are synchronous, + getSyncMapper() returns ordinary values while retaining + completeness checks. getMapper() remains asynchronous. +

+
+                         ({ id: u.id, name: u.name }));
+const Source = read.rowSchema; // no SQL
+const toDto = mapper().configure(Source, UserDto, m => m)
+    .getSyncMapper(Source, UserDto);
+const result = (await read).map(toDto);`)
+                            }}
+                        />
+                    
+

+ Known async mappings are rejected; disguised promises or + thenables throw at invocation. Configuration never + probes callbacks. Fetching, enrichment, authorization + and union dispatch remain explicit application code. +

+ + Read the multi-file consumer guide and compatibility + rules + +
+ {/* ── Install ─────────────────────────────────────── */}

Installation

diff --git a/websites/docs/app/orm/page.tsx b/websites/docs/app/orm/page.tsx index e52c1e89..45b1433a 100644 --- a/websites/docs/app/orm/page.tsx +++ b/websites/docs/app/orm/page.tsx @@ -19,6 +19,37 @@ export default function OrmPage() {

+
+

Detached reads with projection schemas

+

+ db.users.withRowSchema() returns an immutable read-only + query with runtime metadata matching its projection and + relation graph. Results stay detached even in a tracking + context, so partial selections cannot silently become + incomplete tracked entities. +

+
+                         ({ id: p.id, name: p.name }))
+    .include(r => r.tasks, tasks => tasks
+        .select(t => ({ title: t.title })));
+const Source = read.rowSchema; // nested task schema included
+const projects = await read; // one SQL statement`)
+                            }}
+                        />
+                    
+

+ Return child queries from customizers. STI/CTI reads + expose variantRowSchemas for explicit mapper dispatch. + Ordinary entity reads and writes remain unchanged. +

+ + Projection-aware consumer guide + +
+ {/* ── Installation ─────────────────────────────────── */} +
+

Synchronous mapping

+

+ Use the existing configure() chain, then + getSyncMapper(Source, Target) for pure synchronous + mappings. Completeness and nested-mapping checks remain. + Async computations are rejected, and a disguised + promise/thenable throws when invoked. getMapper() keeps + its async behavior. +

+

+ Opt-in Framework database reads expose projection-aware + rowSchema metadata, so source schemas need not be copied + by hand. Reuse schema instances and configure once; + fetching and domain conversions remain + application-owned. +

+ + Query mapping examples and consumer guide + +
+ Date: Wed, 30 Sep 2026 15:59:43 +0000 Subject: [PATCH 2/3] fix: preserve read safety and support strict mapper consumers --- libs/knex-schema/integration/queries.test.ts | 19 ++ libs/knex-schema/src/SchemaQueryBuilder.ts | 1 + libs/mapper/src/MappingRegistry.ts | 220 +++++++++++-------- libs/mapper/src/sync.test.ts | 24 ++ 4 files changed, 172 insertions(+), 92 deletions(-) diff --git a/libs/knex-schema/integration/queries.test.ts b/libs/knex-schema/integration/queries.test.ts index b0c7fb8a..0609dd02 100644 --- a/libs/knex-schema/integration/queries.test.ts +++ b/libs/knex-schema/integration/queries.test.ts @@ -73,6 +73,25 @@ const taskEntity = defineEntity(Task) ); const db = createDb(knex, { tasks: taskEntity }); +it('transaction clones retain row schemas and raw-query safety guards', async () => { + const read = db.tasks.withRowSchema().select(t => ({ title: t.title })); + await knex.transaction(async trx => { + const inTransaction = read.transacting(trx); + expect(inTransaction.rowSchema).toBe(read.rowSchema); + expect(await inTransaction.where(t => t.id, 104).first()).toEqual( + await read.where(t => t.id, 104).first() + ); + expect(() => + query(knex, Task) + .apply(q => { + q.whereRaw('true'); + }) + .transacting(trx) + .withRowSchema() + ).toThrow(/before raw/); + }); +}); + it('schema-aware reads stay detached in a tracked context', async () => { const tracked = createDb(knex, { tasks: taskEntity }, { tracking: true }); const calls: unknown[] = []; diff --git a/libs/knex-schema/src/SchemaQueryBuilder.ts b/libs/knex-schema/src/SchemaQueryBuilder.ts index 080c3b6f..104a8724 100644 --- a/libs/knex-schema/src/SchemaQueryBuilder.ts +++ b/libs/knex-schema/src/SchemaQueryBuilder.ts @@ -1311,6 +1311,7 @@ export class SchemaQueryBuilder< builderState.includeDeleted = state.includeDeleted; builderState.onlyDeleted = state.onlyDeleted; builderState.skipDefaultScope = state.skipDefaultScope; + builderState.opaqueReadShape = state.opaqueReadShape; builderState.variantConfig = state.variantConfig; builderState.enabledVariants = state.enabledVariants !== null diff --git a/libs/mapper/src/MappingRegistry.ts b/libs/mapper/src/MappingRegistry.ts index 3b122021..e07113fb 100644 --- a/libs/mapper/src/MappingRegistry.ts +++ b/libs/mapper/src/MappingRegistry.ts @@ -28,18 +28,53 @@ type IsAsync = 0 extends 1 & T : [Extract>] extends [never] ? false : true; -type NestedAsync = - S extends ArraySchemaBuilder - ? T extends ArraySchemaBuilder - ? NestedAsync< - ExtractArrayElementSchema, - ExtractArrayElementSchema, - Registered - > +// Inspect metadata instead of recursively comparing the entire fluent builder. +type ArraySchemaShape = { introspect(): { elementSchema: unknown } }; +type ObjectSchemaShape = { introspect(): { properties: unknown } }; +type SameProperties = [keyof A, keyof B] extends [keyof B, keyof A] + ? [A, B] extends [B, A] + ? true + : false + : false; +// Runtime registration still uses schema identity. At compile time compare the +// declared fields, not every recursive builder/validation method. Exact key sets +// prevent an empty or smaller schema from matching an unrelated registration. +type RegisteredMatch = S extends ObjectSchemaShape + ? T extends ObjectSchemaShape + ? Registered extends [infer From, infer To] + ? [InferType, InferType] extends [ + InferType, + InferType + ] + ? [InferType, InferType] extends [ + InferType, + InferType + ] + ? SameProperties< + ExtractSchemaProperties, + ExtractSchemaProperties + > extends true + ? SameProperties< + ExtractSchemaProperties, + ExtractSchemaProperties + > + : false + : false + : false : false - : [S, T] extends Registered - ? true - : false; + : false + : false; +type NestedAsync = S extends ArraySchemaShape + ? T extends ArraySchemaShape + ? NestedAsync< + ExtractArrayElementSchema, + ExtractArrayElementSchema, + Registered + > + : false + : true extends RegisteredMatch + ? true + : false; type AsyncKeys = { [K in keyof ExtractSchemaProperties & string]: K extends keyof Steps ? Steps[K] extends false @@ -97,15 +132,16 @@ function synchronous(fn: Function): (source: any) => any { /** * Extracts the properties record from an ObjectSchemaBuilder. */ -type ExtractSchemaProperties = - T extends ObjectSchemaBuilder - ? TProperties - : never; +type ExtractSchemaProperties = T extends { + introspect(): { properties: infer TProperties }; +} + ? TProperties + : never; /** * Gets all top-level property key names of an ObjectSchemaBuilder. */ -type SchemaKeys> = +type SchemaKeys = keyof ExtractSchemaProperties & string; /** @@ -125,7 +161,7 @@ type TargetPropertyKey = { * type of the selector callback. */ type TargetPropertyTree< - TSchema extends ObjectSchemaBuilder, + TSchema extends ObjectSchemaBuilder, TAllowedKeys extends string > = { [K in SchemaKeys & TAllowedKeys]: TargetPropertyKey & @@ -137,7 +173,7 @@ type TargetPropertyTree< * by its key name. */ type SchemaPropertyInferredType< - TSchema extends ObjectSchemaBuilder, + TSchema extends ObjectSchemaBuilder, K extends string > = K extends keyof ExtractSchemaProperties ? InferType[K]> @@ -148,7 +184,7 @@ type SchemaPropertyInferredType< * ObjectSchemaBuilder by its key name. */ type TargetPropertySchema< - TSchema extends ObjectSchemaBuilder, + TSchema extends ObjectSchemaBuilder, K extends string > = K extends keyof ExtractSchemaProperties ? ExtractSchemaProperties[K] @@ -190,43 +226,23 @@ type ExtractPropertySchema = T extends { * - Neither is ObjectSchemaBuilder + incompatible InferType → `true` */ type NeedsMapping = - TSourcePropSchema extends ArraySchemaBuilder< - any, - any, - any, - any, - any, - any, - any - > - ? TTargetPropSchema extends ArraySchemaBuilder< - any, - any, - any, - any, - any, - any, - any - > + TSourcePropSchema extends ArraySchemaShape + ? TTargetPropSchema extends ArraySchemaShape ? NeedsMapping< ExtractArrayElementSchema, ExtractArrayElementSchema, TRegistered > : true - : TTargetPropSchema extends ArraySchemaBuilder< - any, - any, - any, - any, - any, - any, - any - > + : TTargetPropSchema extends ArraySchemaShape ? true - : TSourcePropSchema extends ObjectSchemaBuilder - ? TTargetPropSchema extends ObjectSchemaBuilder - ? [TSourcePropSchema, TTargetPropSchema] extends TRegistered + : TSourcePropSchema extends ObjectSchemaShape + ? TTargetPropSchema extends ObjectSchemaShape + ? true extends RegisteredMatch< + TSourcePropSchema, + TTargetPropSchema, + TRegistered + > ? false : InferType extends InferType ? InferType extends InferType @@ -234,7 +250,7 @@ type NeedsMapping = : true : true : true - : TTargetPropSchema extends ObjectSchemaBuilder + : TTargetPropSchema extends ObjectSchemaShape ? true : InferType extends InferType ? false @@ -246,8 +262,8 @@ type NeedsMapping = * Keys where `NeedsMapping` is `false` can be auto-mapped via the registry. */ type KeysNeedingMapping< - TFromSchema extends ObjectSchemaBuilder, - TToSchema extends ObjectSchemaBuilder, + TFromSchema extends ObjectSchemaBuilder, + TToSchema extends ObjectSchemaBuilder, TRegistered > = { [K in SchemaKeys]: K extends SchemaKeys @@ -273,24 +289,8 @@ type CheckSchemaCompatible = [InferType] extends [InferType] ? true : // Both arrays → recurse into element schemas - TSourceSchema extends ArraySchemaBuilder< - any, - any, - any, - any, - any, - any, - any - > - ? TTargetSchema extends ArraySchemaBuilder< - any, - any, - any, - any, - any, - any, - any - > + TSourceSchema extends ArraySchemaShape + ? TTargetSchema extends ArraySchemaShape ? CheckSchemaCompatible< ExtractArrayElementSchema, ExtractArrayElementSchema, @@ -298,9 +298,13 @@ type CheckSchemaCompatible = > : false : // Both objects → check registration - TSourceSchema extends ObjectSchemaBuilder - ? TTargetSchema extends ObjectSchemaBuilder - ? [TSourceSchema, TTargetSchema] extends TRegistered + TSourceSchema extends ObjectSchemaShape + ? TTargetSchema extends ObjectSchemaShape + ? true extends RegisteredMatch< + TSourceSchema, + TTargetSchema, + TRegistered + > ? true : false : false @@ -317,7 +321,7 @@ type CheckSchemaCompatible = */ type IsFromCompatible< TReturn, - TToSchema extends ObjectSchemaBuilder, + TToSchema extends ObjectSchemaBuilder, TKey extends string, TRegistered > = [ExtractPropertySchema] extends [never] @@ -332,14 +336,14 @@ type IsFromCompatible< /** A mapping function that always returns a Promise, including for pure mappings. */ export type SchemaToSchemaMapperResult< - TFromSchema extends ObjectSchemaBuilder, - TToSchema extends ObjectSchemaBuilder + TFromSchema extends ObjectSchemaBuilder, + TToSchema extends ObjectSchemaBuilder > = (from: InferType) => Promise>; /** A complete synchronous mapping; unexpected thenables throw instead of leaking into DTOs. */ export type SyncSchemaToSchemaMapperResult< - TFromSchema extends ObjectSchemaBuilder, - TToSchema extends ObjectSchemaBuilder + TFromSchema extends ObjectSchemaBuilder, + TToSchema extends ObjectSchemaBuilder > = (from: InferType) => InferType; // ── Error Class ─────────────────────────────────────────────────────── @@ -493,8 +497,8 @@ function resolveElementMapper( * - `ignore()` — explicitly skip the property */ export class PropertyMappingBuilder< - TFromSchema extends ObjectSchemaBuilder, - TToSchema extends ObjectSchemaBuilder, + TFromSchema extends ObjectSchemaBuilder, + TToSchema extends ObjectSchemaBuilder, TKey extends string, TUnmapped extends string, TRegistered = never, @@ -737,8 +741,8 @@ export class PropertyMappingBuilder< * @typeParam TUnmapped - union of target property key names not yet mapped */ export class Mapper< - TFromSchema extends ObjectSchemaBuilder, - TToSchema extends ObjectSchemaBuilder, + TFromSchema extends ObjectSchemaBuilder, + TToSchema extends ObjectSchemaBuilder, TUnmapped extends string = SchemaKeys, TRegistered = never, TAsyncRegistered = never, @@ -1132,16 +1136,16 @@ export class Mapper< export class MappingRegistry { protected readonly _mappers: Map< - ObjectSchemaBuilder, + ObjectSchemaBuilder, Map< - ObjectSchemaBuilder, + ObjectSchemaBuilder, SchemaToSchemaMapperResult > > = new Map(); #ensureObjectSchemas( - fromSchema: ObjectSchemaBuilder, - toSchema: ObjectSchemaBuilder + fromSchema: ObjectSchemaBuilder, + toSchema: ObjectSchemaBuilder ): boolean { return !( !fromSchema || @@ -1168,8 +1172,24 @@ export class MappingRegistry { * properties remain that cannot be auto-mapped */ public configure< - TFromSchema extends ObjectSchemaBuilder, - TToSchema extends ObjectSchemaBuilder, + TFromSchema extends ObjectSchemaBuilder< + any, + any, + any, + any, + any, + any, + any + >, + TToSchema extends ObjectSchemaBuilder< + any, + any, + any, + any, + any, + any, + any + >, TSteps = {} >( fromSchema: TFromSchema, @@ -1259,8 +1279,16 @@ export class MappingRegistry { * @throws Error if the schema pair has not been registered. */ public getSyncMapper< - TFromSchema extends ObjectSchemaBuilder, - TToSchema extends ObjectSchemaBuilder + TFromSchema extends ObjectSchemaBuilder< + any, + any, + any, + any, + any, + any, + any + >, + TToSchema extends ObjectSchemaBuilder >( fromSchema: TFromSchema, toSchema: TToSchema, @@ -1282,8 +1310,16 @@ export class MappingRegistry { * return a promise resolving to a value of the toSchema type */ public getMapper< - TFromSchema extends ObjectSchemaBuilder, - TToSchema extends ObjectSchemaBuilder + TFromSchema extends ObjectSchemaBuilder< + any, + any, + any, + any, + any, + any, + any + >, + TToSchema extends ObjectSchemaBuilder >( fromSchema: TFromSchema, toSchema: TToSchema diff --git a/libs/mapper/src/sync.test.ts b/libs/mapper/src/sync.test.ts index e6df6f24..65a29571 100644 --- a/libs/mapper/src/sync.test.ts +++ b/libs/mapper/src/sync.test.ts @@ -6,6 +6,30 @@ const Source = object({ id: number(), title: string() }); const Target = object({ id: number(), label: string() }); describe('inferred synchronous mapping', () => { + it('does not confuse unrelated registered schemas with primitive steps', () => { + const Id = object({ id: number() }); + const IdDto = object({ id: number() }); + const registry = mapper() + .configure(Source, Target, m => + m.for(t => t.label).compute(async s => s.title) + ) + .configure(Id, IdDto, m => m); + expect(registry.getSyncMapper(Id, IdDto)({ id: 1 })).toEqual({ id: 1 }); + const OptionalChild = object({ child: Source.optional() }); + const RequiredChild = object({ child: Target }); + expect(() => { + // @ts-expect-error a required child mapping does not map an optional source + registry.configure(OptionalChild, RequiredChild, m => m); + }).toThrow(/not mapped/); + const Empty = object({}); + const Parent = object({ child: Source }); + const ParentDto = object({ child: Target }); + const emptyRegistry = mapper().configure(Empty, Empty, m => m); + expect(() => { + // @ts-expect-error an empty registration cannot supply the missing child mapping + emptyRegistry.configure(Parent, ParentDto, m => m); + }).toThrow(/not mapped/); + }); it('returns an ordinary value and preserves the async API', async () => { const compute = vi.fn((s: { title: string }) => s.title.toUpperCase()); const registry = mapper().configure(Source, Target, m => From 6f7fc68956a5384ae1cc141043883167d6c783db Mon Sep 17 00:00:00 2001 From: Andrew Zolotukhin Date: Wed, 30 Sep 2026 17:18:36 +0000 Subject: [PATCH 3/3] fix: address projection mapping review with native typed metadata --- .../projection-aware-synchronous-mapping.md | 9 + docs/assets/projection-read-schemas.png | Bin 153082 -> 124840 bytes docs/assets/projection-sync-mapper.png | Bin 139024 -> 125139 bytes libs/di/src/ServiceCollection.ts | 50 +- libs/di/src/ServiceProvider.ts | 11 +- libs/di/src/ServiceScope.ts | 11 +- libs/knex-schema/COMPOSABLE_QUERIES.md | 188 ------ libs/knex-schema/READ-SCHEMAS.md | 217 ------- libs/knex-schema/README.md | 398 +++++++++++- libs/knex-schema/package.json | 4 +- libs/knex-schema/src/extension.ts | 43 +- libs/knex-schema/src/index.ts | 3 +- libs/knex-schema/src/read-consumer.test.ts | 166 +++++ libs/knex-schema/src/read-schema.ts | 31 +- libs/knex-schema/src/read-storage.test-d.ts | 49 +- libs/knex-schema/src/read-storage.test.ts | 25 + libs/knex-schema/src/read-storage.ts | 105 ---- libs/knex-schema/src/unit.test.ts | 6 +- libs/mapper/README.md | 61 +- libs/orm/README.md | 49 +- libs/schema/README.md | 49 ++ libs/schema/src/builders/AnySchemaBuilder.ts | 10 + .../schema/src/builders/ArraySchemaBuilder.ts | 11 + .../src/builders/BooleanSchemaBuilder.ts | 11 + libs/schema/src/builders/DateSchemaBuilder.ts | 9 + .../src/builders/FunctionSchemaBuilder.ts | 12 + .../src/builders/GenericSchemaBuilder.ts | 11 + .../src/builders/NumberSchemaBuilder.ts | 9 + .../src/builders/ObjectSchemaBuilder.ts | 11 + .../src/builders/PromiseSchemaBuilder.ts | 11 + .../src/builders/RecordSchemaBuilder.ts | 12 + .../src/builders/StringSchemaBuilder.ts | 9 + .../schema/src/builders/TupleSchemaBuilder.ts | 12 + .../schema/src/builders/UnionSchemaBuilder.ts | 10 + libs/schema/src/core.ts | 8 + libs/schema/src/extension.ts | 21 +- libs/schema/src/metadata-extension.test-d.ts | 210 +++++++ libs/schema/src/metadata-extension.test.ts | 96 +++ libs/schema/src/metadata-extension.ts | 375 +++++++++++ websites/docs/app/knex-schema/page.tsx | 186 +++--- websites/docs/app/mapper/page.tsx | 64 +- websites/docs/app/orm/page.tsx | 62 +- websites/docs/public/llms.txt | 589 ++++++------------ websites/schema/app/mapper/page.tsx | 72 +-- .../app/playground/schemaDeclarations.ts | 412 +++++++++++- 45 files changed, 2459 insertions(+), 1249 deletions(-) delete mode 100644 libs/knex-schema/COMPOSABLE_QUERIES.md delete mode 100644 libs/knex-schema/READ-SCHEMAS.md create mode 100644 libs/knex-schema/src/read-consumer.test.ts create mode 100644 libs/knex-schema/src/read-storage.test.ts delete mode 100644 libs/knex-schema/src/read-storage.ts create mode 100644 libs/schema/src/metadata-extension.test-d.ts create mode 100644 libs/schema/src/metadata-extension.test.ts create mode 100644 libs/schema/src/metadata-extension.ts diff --git a/.changeset/projection-aware-synchronous-mapping.md b/.changeset/projection-aware-synchronous-mapping.md index 58b463a4..647a4c89 100644 --- a/.changeset/projection-aware-synchronous-mapping.md +++ b/.changeset/projection-aware-synchronous-mapping.md @@ -2,6 +2,8 @@ "@cleverbrush/mapper": minor "@cleverbrush/knex-schema": minor "@cleverbrush/orm": minor +"@cleverbrush/schema": minor +"@cleverbrush/di": minor --- Add opt-in immutable, detached PostgreSQL reads with projection-aware runtime @@ -12,3 +14,10 @@ application mappings without duplicating projection schemas. Add `getSyncMapper()` with synchronous eligibility inferred through the existing `configure()` API, completeness checks, nested mapping propagation and runtime thenable guards. Existing queries and asynchronous mapping behavior are unchanged. + +Add application-agnostic typed metadata extension methods that retain metadata +through immutable chains. Use these in database extensions without modifying +global schema prototypes. + +Preserve typed function-schema compatibility in dependency injection when a +function declares its return schema. diff --git a/docs/assets/projection-read-schemas.png b/docs/assets/projection-read-schemas.png index 4258257a9f7ef48fe95744a6bf0899c3ef3cc3ef..399e7888e7ee8dfaee535b388ff3082469b6e2c2 100644 GIT binary patch literal 124840 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 C>L^e{tkIdA-Mb~d9{fh`@KQ3FMdu} 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

fNy9aiS_j-%B0I>i%y5JrcDwg{6g>a9?lb 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 AxBvhE literal 153082 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/F_E#$(bJ8LR0feVlsnX&R@|S09C|{ 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 IM6N<$g5c1|Y5)KL literal 139024 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 z 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 z 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 diff --git a/libs/di/src/ServiceCollection.ts b/libs/di/src/ServiceCollection.ts index 0784b381..4c0cf780 100644 --- a/libs/di/src/ServiceCollection.ts +++ b/libs/di/src/ServiceCollection.ts @@ -260,7 +260,16 @@ export class ServiceCollection { */ public addSingletonFromSchema< TTargetSchema extends SchemaBuilder, - TFuncSchema extends FunctionSchemaBuilder + TFuncSchema extends FunctionSchemaBuilder< + any, + any, + any, + any, + any, + any, + any, + any + > >( targetSchema: TTargetSchema, funcSchema: TFuncSchema, @@ -295,7 +304,16 @@ export class ServiceCollection { */ public addScopedFromSchema< TTargetSchema extends SchemaBuilder, - TFuncSchema extends FunctionSchemaBuilder + TFuncSchema extends FunctionSchemaBuilder< + any, + any, + any, + any, + any, + any, + any, + any + > >( targetSchema: TTargetSchema, funcSchema: TFuncSchema, @@ -330,7 +348,16 @@ export class ServiceCollection { */ public addTransientFromSchema< TTargetSchema extends SchemaBuilder, - TFuncSchema extends FunctionSchemaBuilder + TFuncSchema extends FunctionSchemaBuilder< + any, + any, + any, + any, + any, + any, + any, + any + > >( targetSchema: TTargetSchema, funcSchema: TFuncSchema, @@ -416,7 +443,16 @@ export class ServiceCollection { #addFromSchema< TTargetSchema extends SchemaBuilder, - TFuncSchema extends FunctionSchemaBuilder + TFuncSchema extends FunctionSchemaBuilder< + any, + any, + any, + any, + any, + any, + any, + any + > >( targetSchema: TTargetSchema, funcSchema: TFuncSchema, @@ -451,7 +487,7 @@ export class ServiceCollection { * Used internally to type-check `addSingletonFromSchema`-style registrations. */ type FuncSchemaParameters< - T extends FunctionSchemaBuilder + T extends FunctionSchemaBuilder > = T extends FunctionSchemaBuilder< any, @@ -459,7 +495,9 @@ type FuncSchemaParameters< any, any, any, - infer TParams extends SchemaBuilder[] + infer TParams extends SchemaBuilder[], + any, + any > ? { [K in keyof TParams]: InferType } : never; diff --git a/libs/di/src/ServiceProvider.ts b/libs/di/src/ServiceProvider.ts index 26b335e0..63816393 100644 --- a/libs/di/src/ServiceProvider.ts +++ b/libs/di/src/ServiceProvider.ts @@ -193,7 +193,16 @@ export class ServiceProvider implements IServiceProvider { * @see {@link FunctionSchemaBuilder.hasReturnType} */ public invoke< - TFuncSchema extends FunctionSchemaBuilder + TFuncSchema extends FunctionSchemaBuilder< + any, + any, + any, + any, + any, + any, + any, + any + > >( funcSchema: TFuncSchema, implementation: InferType diff --git a/libs/di/src/ServiceScope.ts b/libs/di/src/ServiceScope.ts index 87c8b087..d55622eb 100644 --- a/libs/di/src/ServiceScope.ts +++ b/libs/di/src/ServiceScope.ts @@ -305,7 +305,16 @@ export class ScopedServiceProvider implements IServiceProvider { * @see {@link ServiceProvider.invoke} */ public invoke< - TFuncSchema extends FunctionSchemaBuilder + TFuncSchema extends FunctionSchemaBuilder< + any, + any, + any, + any, + any, + any, + any, + any + > >( funcSchema: TFuncSchema, implementation: InferType diff --git a/libs/knex-schema/COMPOSABLE_QUERIES.md b/libs/knex-schema/COMPOSABLE_QUERIES.md deleted file mode 100644 index e86394bb..00000000 --- a/libs/knex-schema/COMPOSABLE_QUERIES.md +++ /dev/null @@ -1,188 +0,0 @@ -# Composable read queries - -These APIs are additive. Existing single-schema selectors, nested eager loading, -legacy aggregate methods, and single-column cursor calls remain available. - -## Typed flat joins - -```ts -import { alias, eq, query } from '@cleverbrush/knex-schema'; - -const task = alias(TaskSchema, 'task'); -const owner = alias(UserSchema, 'owner'); -const rows = await query(knex, task) - .leftJoin(owner, t => eq(t.task.ownerId, t.owner.id)) - .where(t => t.task.projectId, projectId) - .orderBy(t => t.task.id, 'desc') - .select(t => ({ id: t.task.id, ownerName: t.owner.name })); -// ownerName includes null because owner is left-joined. -``` - -Aliases do not mutate schemas. Each source retains default scopes and soft-delete -filters; filtering the right-hand source does not turn a left join into an inner -join. `createQuery(knex)` also accepts aliased schemas. `eq`, `and`, and `or` -compose column-based join conditions. Duplicate aliases are errors. - -Both `and` and `or` accept multiple predicates and can be nested. Each group -becomes a parenthesized SQL expression, preserving the intended precedence: - -```ts -import { alias, and, eq, or, query } from '@cleverbrush/knex-schema'; - -const rows = await query(knex, alias(TaskSchema, 'task')) - .join(alias(UserSchema, 'owner'), t => or( - eq(t.task.ownerId, t.owner.id), - and( - eq(t.task.approverId, t.owner.id), - or( - eq(t.task.teamId, t.owner.teamId), - eq(t.task.creatorId, t.owner.id) - ) - ) - )) - .select(t => ({ id: t.task.id, ownerName: t.owner.name })); -``` - -This example assumes the illustrated ID properties exist on the schemas. -Empty `and()`/`or()` groups are rejected. Predicates describe SQL; they do not -execute a JavaScript callback for each returned row. - -`isSqlIdentifier(value)` is an exported type guard used by `alias()`. It accepts -one ASCII identifier (`task_owner2`), not qualified names (`public.tasks`), quoted -names, whitespace or non-string values. This deliberately conservative format -does not describe every valid PostgreSQL identifier and does not replace Knex -identifier quoting. Existing table/column metadata APIs are not restricted by it. - -The read-only aliased builder requires an explicit, non-empty projection and -supports `where`, `whereIn`, `whereNull`, `whereNotNull`, `orderBy`, `orderByRaw`, -`groupBy`, `having`, `limit`, `offset`, `first`, `execute`, `transacting`, and -awaiting the query. `apply`/`toKnexQuery` remain raw escape hatches whose effects -on result shape/cardinality are the caller's responsibility. Values remain bound -and identifiers quoted. Flat collection joins can repeat parents; they do not -deduplicate or fetch one related row at a time. Choose ORM eager loading for -nested related objects instead. - -For reusable connection/transaction handling, ordinary and aliased schemas retain -the same inference through `createQuery(knex)`, `withTransaction(trx)`, and -`transaction(callback)`. Only ordinary-schema calls accept a custom Knex base -query. These APIs and their JSDoc are also available through `@cleverbrush/orm`. - -## Aggregates with optional output schemas - -```ts -import { aggregate, number } from '@cleverbrush/knex-schema'; - -const count = await query(knex, TaskSchema).countValue(); // number -const total = await query(knex, TaskSchema) - .sumValue(t => t.estimate); // string | null - -const grouped = await query(knex, TaskSchema) - .groupBy(t => t.ownerId) - .select(t => ({ - ownerId: t.ownerId, - count: aggregate.count(), - total: aggregate.sum(t.estimate) - })); - -// Explicit floating-point conversion when appropriate for your domain. -const average = await query(knex, TaskSchema) - .avgValue(t => t.estimate, { - output: number().isFloat().coerce().nullable() - }); // number | null -``` - -| API | Default result | -| --- | --- | -| `countValue(options?)`, `countValue(column, options?)` | Safe number; counts rows or non-null values | -| `countDistinctValue(column, options?)` | Safe number | -| `sumValue(column, options?)`, `avgValue(column, options?)` | Database numeric text, or null | -| `minValue(column, options?)`, `maxValue(column, options?)` | Column's database representation, or null | - -The corresponding `aggregate.count/countDistinct/sum/avg/min/max` expressions -work in ordinary and aliased object projections. Expression options are the -second argument: `aggregate.count(undefined, { output: schema })` customizes -`COUNT(*)`. Aliased `having` also accepts aggregate expressions; its comparisons -use native SQL values, not decoded/text-formatted values. - -Counts reject malformed results and integers outside JavaScript's safe range. -Sum/average preserve PostgreSQL's result as text without changing global driver -parsers. This does not make floating-point source columns exact. Numeric/decimal/ -bigint extrema retain strings; because existing SQL overrides are not fully -represented in schema types, numeric extrema are conservatively typed as -`number | string | null`. Date extrema return `Date | null`. - -An optional **output schema replaces the default decoder**. Its synchronous -`parse` receives the raw driver value, including null, before default conversion. -Its schema output type determines the result, including nullable/optional -modifiers. PostgreSQL counts normally reach it as strings, so a number schema -needs explicit coercion. Validation failures reject the query. Custom parsers -may return bigint/domain decimal types; JSON serialization remains application -code. With custom parsers, the application owns their conversion/precision policy. - -Scalar helpers clone the source, ignore its limit/offset/order, and retain -filters, semantic joins, scopes, and transactions. They reject grouped, HAVING, -distinct, and already aggregated queries; use aggregate projections for those. -An empty scalar count is zero; other empty/all-null aggregates are null. An -empty grouped query returns no rows. Legacy `.count()`, `.sum()`, etc. keep their -existing behavior and signatures. - -## Eager-loading order - -```ts -const tasks = await query(knex, TaskSchema) - .orderBy(t => t.createdAt, 'desc') - .orderBy(t => t.id, 'desc') - .joinMany({ - foreignSchema: NoteSchema, - localColumn: t => t.id, - foreignColumn: t => t.taskId, - as: 'notes' - }) - .limit(20); -``` - -The final SELECT retains parent order, including bound raw ordering expressions. -Limits/offsets select parents, not expanded child rows. Internal fields are -removed from mapped results. Parent ordering, child ordering, and relation -filtering are separate operations. Add a unique tie-breaker for deterministic -ordering of tied parents. - -## Composite cursors - -```ts -const page = await query(knex, TaskSchema) - .where(t => t.projectId, projectId) - .select(t => ({ id: t.id, title: t.title })) - .paginateAfter({ - cursor: previousPage?.nextCursor, - limit: 50, - orderBy: [ - { column: t => t.createdAt, direction: 'desc' }, - { column: t => t.id, direction: 'desc' } - ] - }); -// { data, nextCursor: string | null, hasMore: boolean } -``` - -The opt-in `orderBy` form controls the full sort, replacing earlier ordering. -Mixed directions, projections, and eager loading are supported. Sort fields must -be non-null scalar columns and include a schema-declared primary/unique key. -Required eager relations filter parents before the cursor page limit is applied. -Offsets, flat joins, distinct/grouped/aggregate queries, malformed cursors, and -cursors from a different table/order are rejected. The source builder is not -mutated. The original `column`/`direction` form is unchanged. - -Cursors are versioned opaque strings preserving database timestamp precision -and numeric values without Date/number round-trips. Clients must not parse them. -Reapply access filters on every request and discard cursors when filters change: -they are positions, not authorization. They do not provide snapshot isolation; -sort-key updates can move records across the cursor. Sequential paging does not -support arbitrary page-number jumps; counts remain separate queries. Indexes -and representative query-plan measurements remain application work. - -## Integration verification - -From the repository root, run `npm run test:queries:integration` with -`QUERY_TEST_DATABASE_URL` pointing to a dedicated PostgreSQL test database. -The suite creates/drops only its randomly named fixture tables and fails if the -URL is missing. CI runs PostgreSQL 16 integration tests alongside unit/type tests. diff --git a/libs/knex-schema/READ-SCHEMAS.md b/libs/knex-schema/READ-SCHEMAS.md deleted file mode 100644 index b4e65cc5..00000000 --- a/libs/knex-schema/READ-SCHEMAS.md +++ /dev/null @@ -1,217 +0,0 @@ -# Projection-aware reads and synchronous mapping - -`withRowSchema()` is an **opt-in PostgreSQL read API**. Existing queries and -`getMapper()` retain their existing behavior. Schema-aware queries are immutable, -detached read plans: capture the returned value when adding filters or includes. -They do not track entities, save changes, or run SQL when inspecting metadata. - -## Before and after - -Previously, a projection needed a separately maintained source schema: - -```ts -const Source = object({ id: number(), name: string(), lastSeen: date().nullable() }); -const registry = mapper().configure(Source, PublicUser, m => m - .for(t => t.lastSeen).compute(s => s.lastSeen ?? undefined)); -const toUser = registry.getMapper(Source, PublicUser); -const result = await Promise.all(rows.map(toUser)); -``` - -The query now supplies that schema, and pure mapping needs no promises: - -```ts -const read = db.users.withRowSchema().select(u => ({ - id: u.id, name: u.name, lastSeen: u.lastSeen -})); -const Source = read.rowSchema; -const toUser = mapper().configure(Source, PublicUser, m => m - .for(t => t.lastSeen).compute(s => s.lastSeen ?? undefined)) - .getSyncMapper(Source, PublicUser); -const result = (await read.where(u => u.active, true)).map(toUser); -``` - -Select sensitive fields explicitly. The mapper does not fetch data, authorize -access, enrich rows, or decide how database nulls should appear in public DTOs. - -## Definitions can live in separate files - -```ts -// user-read.ts -import { createQuery, date, number, object, string } from '@cleverbrush/knex-schema'; -import { knex } from './database.js'; - -const UserTable = object({ - id: number().primaryKey(), name: string(), - lastSeen: date().optional().hasColumnName('last_seen'), - secret: string() -}).hasTableName('users'); - -export const userRead = createQuery(knex)(UserTable).withRowSchema() - .select(u => ({ id: u.id, name: u.name, lastSeen: u.lastSeen })); -export const UserRow = userRead.rowSchema; -``` - -```ts -// user-mapping.ts -import { date, number, object, string } from '@cleverbrush/schema'; -import { mapper } from '@cleverbrush/mapper'; -import { UserRow } from './user-read.js'; - -export const PublicUser = object({ - id: number(), name: string(), lastSeen: date().optional() -}); -export const toPublicUser = mapper().configure(UserRow, PublicUser, m => m - .for(t => t.lastSeen).compute(row => row.lastSeen ?? undefined)) - .getSyncMapper(UserRow, PublicUser); -``` - -```ts -// user-service.ts -import { userRead } from './user-read.js'; -import { toPublicUser } from './user-mapping.js'; - -export async function findPublicUser(id: number) { - const row = await userRead.where(u => u.id, id).first(); - return row === undefined ? undefined : toPublicUser(row); -} -``` - -Configure reusable mappings once. `where`, ordering, limits, offsets and -transaction clones retain the same `rowSchema` object. A different projection or -include produces a different schema. Independently created queries do not share -schema identity; the mapper registry keys mappings by schema identity. - -## What values does the schema describe? - -| Stored value | Decoded read value | -| --- | --- | -| Required integer/float | Finite JavaScript `number` | -| `number().bigint()` or `.decimal(p, s)` | Exact `string` | -| Optional or nullable SQL column | Present property containing its value or `null` | -| Date/timestamp | `Date`, including inside JSON relation graphs | -| Missing optional JSON property | Absent property, unlike SQL null | -| Missing optional object relation | `null` | -| Missing collection relation | `[]` | - -Exact numeric fields are cast to text **before** PostgreSQL JSON aggregation and -driver parsing. Converting a rounded JavaScript number to a string is not used. -Use the SQL-type builder methods to declare storage accurately; unknown SQL types -are rejected. A widened dynamic numeric SQL type has a conservative -`number | string` read type. Driver custom parsers must still honor the declared -representation, or decoding fails. - -Timezone-less SQL dates/timestamps are interpreted as UTC in this opt-in mode; -explicit offsets preserve their instant. Native date fields are projected as text -before decoding, so root and nested values do not depend on a driver's local-time -date parser. This is a deliberate opt-in convention, not a change to legacy reads. - -Input defaults, preprocessors and input-only validators are not replayed on stored -rows. Read schemas are structural output schemas. Optional schemas with input -defaults are rejected: `optional().default(...)` hides the storage requirement -in the inferred input/output type. Keep defaults in a separate input schema, -and use an accurately required/optional storage schema for these reads. -JavaScript `Date` has -millisecond precision: use explicit application representations if an API must -expose microseconds. Composite cursor tokens retain native timestamp precision -in private text columns, independently of the public date values. - -## Projections, aliases and aggregates - -```ts -const read = query(knex, alias(UserTable, 'user')).withRowSchema() - .leftJoin(alias(ProfileTable, 'profile'), t => eq(t.user.id, t.profile.userId)) - .select(t => ({ id: t.user.id, displayName: t.profile.displayName })); -// displayName is nullable even if ProfileTable declares it required. -const rows = await read; -read.rowSchema.validate(rows[0]); -``` - -Aliased reads require an explicit selection before execution or accessing -`rowSchema`. Declared named projections use `.projected('name')` on ordinary -readers. Typed aggregates work in object selections: count returns a safe number, -sum/average preserve exact text, and empty extrema/sums remain nullable. An explicit -Framework output schema replaces aggregate decoding and is parsed once; opaque -parser objects without schema introspection are rejected in this mode. - -## Nested graphs - -Declare relations on entities as usual, and return the child query from customizers: - -```ts -const read = db.projects.withRowSchema() - .select(p => ({ id: p.id, name: p.name })) - .include(r => r.tasks, tasks => tasks - .select(t => ({ title: t.title, createdAt: t.createdAt })) - .orderBy(t => t.id, 'desc').limit(3) - .include(r => r.notes, notes => notes.select(n => ({ body: n.body })))); -``` - -This executes one SQL statement. Child scopes, filters, ordering, projections and -limits apply independently per parent. Collections are not lazy-loaded. Required -belongs-to joins filter missing parents; `{ optional: true }` belongs-to and has-one -reads expose nullable objects. `joinOne(spec, customize)` and -`joinMany(spec, customize)` support explicit local/foreign keys without declaring -an entity relation. Use their typed child customizer for ordering/projections; -raw `foreignQuery` and post-load `mappers` cannot supply trustworthy row metadata. - -Numbered `.paginate({ page, pageSize })` performs a count and a page query. -`.paginateAfter({ limit, cursor, orderBy })` on ordinary readers reuses lossless -composite cursors, including unique-key validation. Cursor fields need not be in -the public projection. Reapply authorization filters for every page; a cursor is -not a permission or a transaction snapshot. Grouped/aggregate cursor reads are -rejected. - -## Polymorphic graphs and explicit dispatch - -STI/CTI entities produce a genuine union `rowSchema` and an object schema for each -discriminator in `variantRowSchemas`. All declared branch bodies are selected by -default. Use `selectVariants(['photo'])` to narrow the returned union, or -`forVariant()` to project a branch or load its relations: - -```ts -const read = db.assets.withRowSchema() - .forVariant('photo', q => q.include(r => r.tags)) - .forVariant('text', q => q.select(a => ({ id: a.id, kind: a.kind, body: a.body }))); - -const photoSource = read.variantRowSchemas.photo; -const textSource = read.variantRowSchemas.text; -const registry = mapper() - .configure(photoSource, PublicPhoto, configurePhoto) - .configure(textSource, PublicText, configureText); -const photo = registry.getSyncMapper(photoSource, PublicPhoto); -const text = registry.getSyncMapper(textSource, PublicText); -const result = (await read).map(row => row.kind === 'photo' ? photo(row) : text(row)); -``` - -Keep the original discriminator in branch projections. Framework intentionally -does not choose a public DTO or automatically dispatch a union mapper. Polymorphic -readers also work inside ordinary includes. A missing required CTI body or unknown -discriminator fails decoding. Explicit `allowOrphan: true` makes body fields -nullable. Union ordering/pagination applies to the combined branches, not to each -branch separately. Use `forVariant()` for branch-specific filtering/includes. - -## Boundaries and migration - -- Enter read mode **before** legacy select/include/join, ordering/pagination, - raw callbacks or variant-specific operations. Continue configuration on the - immutable reader. Default scopes may filter rows but must not preselect, - order or paginate them. -- The opt-in surface is deliberately read-only. It is not a replacement for - entity writes or tracked queries, and has no raw SQL shape escape hatch. -- Reads are PostgreSQL-oriented; this does not promise equivalent JSON/CTI SQL - behavior on other Knex dialects. -- Declared graph metadata must match storage. Unsupported opaque shapes throw - rather than pretending an entity schema describes their output. Explicit - TypeScript assertions such as `hasType()` remain the caller's responsibility. -- Existing queries keep their old mutability and driver-value behavior. Migrate - one read at a time; do not replace all application nulls or numeric values - globally. -- `getSyncMapper()` accepts only complete mappings with synchronous final steps - and nested mappings. It never probes callbacks. Known async mappings are - rejected; a disguised thenable throws when invoked. Keep `getMapper()` for - asynchronous work. Fetch/enrich data explicitly before pure mapping. - -Run the mapper-only benchmark with -`npm run bench -- --project benchmarks mapper.bench.ts`. It compares prepared -sync/async functions with identical rows and excludes SQL/network time. Do not -interpret its result as an endpoint-latency guarantee. diff --git a/libs/knex-schema/README.md b/libs/knex-schema/README.md index 75815930..0811875a 100644 --- a/libs/knex-schema/README.md +++ b/libs/knex-schema/README.md @@ -10,24 +10,6 @@ npm install @cleverbrush/knex-schema **Peer dependency:** `knex >= 3.1.0` -## Opt-in projection-aware reads - -Call `.withRowSchema()` before selecting or including fields to get an immutable, -detached PostgreSQL read query. Its `rowSchema` describes the actual decoded -projection, including SQL nulls, nested dates and exact decimal/bigint strings. - -```ts -const read = query(knex, UserSchema).withRowSchema() - .select(u => ({ id: u.id, createdAt: u.createdAt })); -const SourceSchema = read.rowSchema; // metadata only; no SQL -const rows = await read.where(u => u.id, 42); -``` - -Supports typed flat joins/aggregates, declared and explicit nested relations, -named projections, composite cursors and STI/CTI branch schemas. Existing query -behavior is unchanged. See the [consumer guide](./READ-SCHEMAS.md) for multi-file -mapping examples, representation rules, supported operations and migration limits. - ## Quick Start ```typescript @@ -480,9 +462,387 @@ The schema's `hasColumnName()` metadata is used to map `firstName` → `first_na --- +## Composable read queries + +Use aliases for flat results, aggregate expressions for summaries, and composite +cursors for deterministic sequential paging. Nested eager loading returns graphs. + +### Typed flat joins + +```ts +import { alias, eq, query } from '@cleverbrush/knex-schema'; + +const task = alias(TaskSchema, 'task'); +const owner = alias(UserSchema, 'owner'); +const rows = await query(knex, task) + .leftJoin(owner, t => eq(t.task.ownerId, t.owner.id)) + .where(t => t.task.projectId, projectId) + .orderBy(t => t.task.id, 'desc') + .select(t => ({ id: t.task.id, ownerName: t.owner.name })); +// ownerName includes null because owner is left-joined. +``` + +Aliases do not mutate schemas. Each source retains default scopes and soft-delete +filters; filtering the right-hand source does not turn a left join into an inner +join. `createQuery(knex)` also accepts aliased schemas. `eq`, `and`, and `or` +compose column-based join conditions. Duplicate aliases are errors. + +Both `and` and `or` accept multiple predicates and can be nested. Each group +becomes a parenthesized SQL expression, preserving the intended precedence: + +```ts +import { alias, and, eq, or, query } from '@cleverbrush/knex-schema'; + +const rows = await query(knex, alias(TaskSchema, 'task')) + .join(alias(UserSchema, 'owner'), t => or( + eq(t.task.ownerId, t.owner.id), + and( + eq(t.task.approverId, t.owner.id), + or( + eq(t.task.teamId, t.owner.teamId), + eq(t.task.creatorId, t.owner.id) + ) + ) + )) + .select(t => ({ id: t.task.id, ownerName: t.owner.name })); +``` + +This example assumes the illustrated ID properties exist on the schemas. +Empty `and()`/`or()` groups are rejected. Predicates describe SQL; they do not +execute a JavaScript callback for each returned row. + +`isSqlIdentifier(value)` is an exported type guard used by `alias()`. It accepts +one ASCII identifier (`task_owner2`), not qualified names (`public.tasks`), quoted +names, whitespace or non-string values. This deliberately conservative format +does not describe every valid PostgreSQL identifier and does not replace Knex +identifier quoting. Existing table/column metadata APIs are not restricted by it. + +The read-only aliased builder requires an explicit, non-empty projection and +supports `where`, `whereIn`, `whereNull`, `whereNotNull`, `orderBy`, `orderByRaw`, +`groupBy`, `having`, `limit`, `offset`, `first`, `execute`, `transacting`, and +awaiting the query. `apply`/`toKnexQuery` remain raw escape hatches whose effects +on result shape/cardinality are the caller's responsibility. Values remain bound +and identifiers quoted. Flat collection joins can repeat parents; they do not +deduplicate or fetch one related row at a time. Choose ORM eager loading for +nested related objects instead. + +For reusable connection/transaction handling, ordinary and aliased schemas retain +the same inference through `createQuery(knex)`, `withTransaction(trx)`, and +`transaction(callback)`. Only ordinary-schema calls accept a custom Knex base +query. These APIs and their JSDoc are also available through `@cleverbrush/orm`. + +### Aggregates with optional output schemas + +```ts +import { aggregate, number } from '@cleverbrush/knex-schema'; + +const count = await query(knex, TaskSchema).countValue(); // number +const total = await query(knex, TaskSchema) + .sumValue(t => t.estimate); // string | null + +const grouped = await query(knex, TaskSchema) + .groupBy(t => t.ownerId) + .select(t => ({ + ownerId: t.ownerId, + count: aggregate.count(), + total: aggregate.sum(t.estimate) + })); + +// Explicit floating-point conversion when appropriate for your domain. +const average = await query(knex, TaskSchema) + .avgValue(t => t.estimate, { + output: number().isFloat().coerce().nullable() + }); // number | null +``` + +| API | Default result | +| --- | --- | +| `countValue(options?)`, `countValue(column, options?)` | Safe number; counts rows or non-null values | +| `countDistinctValue(column, options?)` | Safe number | +| `sumValue(column, options?)`, `avgValue(column, options?)` | Database numeric text, or null | +| `minValue(column, options?)`, `maxValue(column, options?)` | Column's database representation, or null | + +The corresponding `aggregate.count/countDistinct/sum/avg/min/max` expressions +work in ordinary and aliased object projections. Expression options are the +second argument: `aggregate.count(undefined, { output: schema })` customizes +`COUNT(*)`. Aliased `having` also accepts aggregate expressions; its comparisons +use native SQL values, not decoded/text-formatted values. + +Counts reject malformed results and integers outside JavaScript's safe range. +Sum/average preserve PostgreSQL's result as text without changing global driver +parsers. This does not make floating-point source columns exact. Numeric/decimal/ +bigint extrema retain strings; because existing SQL overrides are not fully +represented in schema types, numeric extrema are conservatively typed as +`number | string | null`. Date extrema return `Date | null`. + +An optional **output schema replaces the default decoder**. Its synchronous +`parse` receives the raw driver value, including null, before default conversion. +Its schema output type determines the result, including nullable/optional +modifiers. PostgreSQL counts normally reach it as strings, so a number schema +needs explicit coercion. Validation failures reject the query. Custom parsers +may return bigint/domain decimal types; JSON serialization remains application +code. With custom parsers, the application owns their conversion/precision policy. + +Scalar helpers clone the source, ignore its limit/offset/order, and retain +filters, semantic joins, scopes, and transactions. They reject grouped, HAVING, +distinct, and already aggregated queries; use aggregate projections for those. +An empty scalar count is zero; other empty/all-null aggregates are null. An +empty grouped query returns no rows. Legacy `.count()`, `.sum()`, etc. keep their +existing behavior and signatures. + +### Eager-loading order + +```ts +const tasks = await query(knex, TaskSchema) + .orderBy(t => t.createdAt, 'desc') + .orderBy(t => t.id, 'desc') + .joinMany({ + foreignSchema: NoteSchema, + localColumn: t => t.id, + foreignColumn: t => t.taskId, + as: 'notes' + }) + .limit(20); +``` + +The final SELECT retains parent order, including bound raw ordering expressions. +Limits/offsets select parents, not expanded child rows. Internal fields are +removed from mapped results. Parent ordering, child ordering, and relation +filtering are separate operations. Add a unique tie-breaker for deterministic +ordering of tied parents. + +### Composite cursors + +```ts +const page = await query(knex, TaskSchema) + .where(t => t.projectId, projectId) + .select(t => ({ id: t.id, title: t.title })) + .paginateAfter({ + cursor: previousPage?.nextCursor, + limit: 50, + orderBy: [ + { column: t => t.createdAt, direction: 'desc' }, + { column: t => t.id, direction: 'desc' } + ] + }); +// { data, nextCursor: string | null, hasMore: boolean } +``` + +The opt-in `orderBy` form controls the full sort, replacing earlier ordering. +Mixed directions, projections, and eager loading are supported. Sort fields must +be non-null scalar columns and include a schema-declared primary/unique key. +Required eager relations filter parents before the cursor page limit is applied. +Offsets, flat joins, distinct/grouped/aggregate queries, malformed cursors, and +cursors from a different table/order are rejected. The source builder is not +mutated. The original `column`/`direction` form is unchanged. + +Cursors are versioned opaque strings preserving database timestamp precision +and numeric values without Date/number round-trips. Clients must not parse them. +Reapply access filters on every request and discard cursors when filters change: +they are positions, not authorization. They do not provide snapshot isolation; +sort-key updates can move records across the cursor. Sequential paging does not +support arbitrary page-number jumps; counts remain separate queries. Indexes +and representative query-plan measurements remain application work. + +### Integration verification + +From the repository root, run `npm run test:queries:integration` with +`QUERY_TEST_DATABASE_URL` pointing to a dedicated PostgreSQL test database. +The suite creates/drops only its randomly named fixture tables and fails if the +URL is missing. CI runs PostgreSQL 16 integration tests alongside unit/type tests. + +## Projection-aware reads + +`withRowSchema()` is an **opt-in PostgreSQL read API**. Schema-aware queries are immutable, +detached read plans: capture the returned value when adding filters or includes. +They do not track entities, save changes, or run SQL when inspecting metadata. + +### Definitions can live in separate files + +```ts +// user-read.ts +import { createQuery, date, number, object, string } from '@cleverbrush/knex-schema'; +import { knex } from './database.js'; + +const UserTable = object({ + id: number().primaryKey(), name: string(), + lastSeen: date().optional().hasColumnName('last_seen'), + secret: string() +}).hasTableName('users'); + +export const userRead = createQuery(knex)(UserTable).withRowSchema() + .select(u => ({ id: u.id, name: u.name, lastSeen: u.lastSeen })); +export const UserRow = userRead.rowSchema; +``` + +```ts +// user-mapping.ts +import { date, number, object, string } from '@cleverbrush/schema'; +import { mapper } from '@cleverbrush/mapper'; +import { UserRow } from './user-read.js'; + +export const PublicUser = object({ + id: number(), name: string(), lastSeen: date().optional() +}); +export const toPublicUser = mapper().configure(UserRow, PublicUser, m => m + .for(t => t.lastSeen).compute(row => row.lastSeen ?? undefined)) + .getSyncMapper(UserRow, PublicUser); +``` + +```ts +// user-service.ts +import { userRead } from './user-read.js'; +import { toPublicUser } from './user-mapping.js'; + +export async function findPublicUser(id: number) { + const row = await userRead.where(u => u.id, id).first(); + return row === undefined ? undefined : toPublicUser(row); +} +``` + +Configure reusable mappings once. `where`, ordering, limits, offsets and +transaction clones retain the same `rowSchema` object. A different projection or +include produces a different schema. Independently created queries do not share +schema identity; the mapper registry keys mappings by schema identity. + +### What values does the schema describe? + +| Stored value | Decoded read value | +| --- | --- | +| Required integer/float | Finite JavaScript `number` | +| `number().bigint()` or `.decimal(p, s)` | Exact `string` | +| Optional or nullable SQL column | Present property containing its value or `null` | +| Date/timestamp | `Date`, including inside JSON relation graphs | +| Missing optional JSON property | Absent property, unlike SQL null | +| Missing optional object relation | `null` | +| Missing collection relation | `[]` | + +Exact numeric fields are cast to text **before** PostgreSQL JSON aggregation and +driver parsing. Converting a rounded JavaScript number to a string is not used. +Use the SQL-type builder methods to declare storage accurately; unknown SQL types +are rejected. A widened dynamic numeric SQL type has a conservative +`number | string` read type. Driver custom parsers must still honor the declared +representation, or decoding fails. + +Timezone-less SQL dates/timestamps are interpreted as UTC in this opt-in mode; +explicit offsets preserve their instant. Native date fields are projected as text +before decoding, so root and nested values do not depend on a driver's local-time +date parser. This is a deliberate opt-in convention, not a change to legacy reads. + +Input defaults, preprocessors and input-only validators are not replayed on stored +rows. Read schemas are structural output schemas. Optional schemas with input +defaults are rejected: `optional().default(...)` hides the storage requirement +in the inferred input/output type. Keep defaults in a separate input schema, +and use an accurately required/optional storage schema for these reads. +JavaScript `Date` has +millisecond precision: use explicit application representations if an API must +expose microseconds. Composite cursor tokens retain native timestamp precision +in private text columns, independently of the public date values. + +### Projections, aliases and aggregates + +```ts +const read = query(knex, alias(UserTable, 'user')).withRowSchema() + .leftJoin(alias(ProfileTable, 'profile'), t => eq(t.user.id, t.profile.userId)) + .select(t => ({ id: t.user.id, displayName: t.profile.displayName })); +// displayName is nullable even if ProfileTable declares it required. +const rows = await read; +read.rowSchema.validate(rows[0]); +``` + +Aliased reads require an explicit selection before execution or accessing +`rowSchema`. Declared named projections use `.projected('name')` on ordinary +readers. Typed aggregates work in object selections: count returns a safe number, +sum/average preserve exact text, and empty extrema/sums remain nullable. An explicit +Framework output schema replaces aggregate decoding and is parsed once; opaque +parser objects without schema introspection are rejected in this mode. + +### Nested graphs + +Declare relations on entities as usual, and return the child query from customizers: + +```ts +const read = db.projects.withRowSchema() + .select(p => ({ id: p.id, name: p.name })) + .include(r => r.tasks, tasks => tasks + .select(t => ({ title: t.title, createdAt: t.createdAt })) + .orderBy(t => t.id, 'desc').limit(3) + .include(r => r.notes, notes => notes.select(n => ({ body: n.body })))); +``` + +This executes one SQL statement. Child scopes, filters, ordering, projections and +limits apply independently per parent. Collections are not lazy-loaded. Required +belongs-to joins filter missing parents; `{ optional: true }` belongs-to and has-one +reads expose nullable objects. `joinOne(spec, customize)` and +`joinMany(spec, customize)` support explicit local/foreign keys without declaring +an entity relation. Use their typed child customizer for ordering/projections; +raw `foreignQuery` and post-load `mappers` cannot supply trustworthy row metadata. + +Numbered `.paginate({ page, pageSize })` performs a count and a page query. +`.paginateAfter({ limit, cursor, orderBy })` on ordinary readers reuses lossless +composite cursors, including unique-key validation. Cursor fields need not be in +the public projection. Reapply authorization filters for every page; a cursor is +not a permission or a transaction snapshot. Grouped/aggregate cursor reads are +rejected. + +### Polymorphic graphs and explicit dispatch + +STI/CTI entities produce a genuine union `rowSchema` and an object schema for each +discriminator in `variantRowSchemas`. All declared branch bodies are selected by +default. Use `selectVariants(['photo'])` to narrow the returned union, or +`forVariant()` to project a branch or load its relations: + +```ts +const read = db.assets.withRowSchema() + .forVariant('photo', q => q.include(r => r.tags)) + .forVariant('text', q => q.select(a => ({ id: a.id, kind: a.kind, body: a.body }))); + +const photoSource = read.variantRowSchemas.photo; +const textSource = read.variantRowSchemas.text; +const registry = mapper() + .configure(photoSource, PublicPhoto, configurePhoto) + .configure(textSource, PublicText, configureText); +const photo = registry.getSyncMapper(photoSource, PublicPhoto); +const text = registry.getSyncMapper(textSource, PublicText); +const result = (await read).map(row => row.kind === 'photo' ? photo(row) : text(row)); +``` + +Keep the original discriminator in branch projections. Framework intentionally +does not choose a public DTO or automatically dispatch a union mapper. Polymorphic +readers also work inside ordinary includes. A missing required CTI body or unknown +discriminator fails decoding. Explicit `allowOrphan: true` makes body fields +nullable. Union ordering/pagination applies to the combined branches, not to each +branch separately. Use `forVariant()` for branch-specific filtering/includes. + +### API boundaries + +- Enter read mode **before** legacy select/include/join, ordering/pagination, + raw callbacks or variant-specific operations. Continue configuration on the + immutable reader. Default scopes may filter rows but must not preselect, + order or paginate them. +- The opt-in surface is deliberately read-only. It is not a replacement for + entity writes or tracked queries, and has no raw SQL shape escape hatch. +- Reads are PostgreSQL-oriented; this does not promise equivalent JSON/CTI SQL + behavior on other Knex dialects. +- Declared graph metadata must match storage. Unsupported opaque shapes throw + rather than pretending an entity schema describes their output. Explicit + TypeScript assertions such as `hasType()` remain the caller's responsibility. +- Ordinary queries are mutable and retain their driver-value behavior. + Read mode is opt-in; it does not change application nulls or numeric values + globally. +- `getSyncMapper()` accepts only complete mappings with synchronous final steps + and nested mappings. It never probes callbacks. Known async mappings are + rejected; a disguised thenable throws when invoked. Keep `getMapper()` for + asynchronous work. Fetch/enrich data explicitly before pure mapping. + +Run the mapper-only benchmark with +`npm run bench -- --project benchmarks mapper.bench.ts`. It compares prepared +sync/async functions with identical rows and excludes SQL/network time. Do not +interpret its result as an endpoint-latency guarantee. + ## API Reference -See [Composable read queries](./COMPOSABLE_QUERIES.md) for typed flat joins with +See [Composable read queries](#composable-read-queries) for typed flat joins with `alias`, all aggregate families with optional output schemas, preserved eager-load ordering, and multi-column cursor pagination. These APIs preserve existing calls and include runtime, type, and PostgreSQL integration coverage. diff --git a/libs/knex-schema/package.json b/libs/knex-schema/package.json index 46c60b9e..d7bb3a5a 100644 --- a/libs/knex-schema/package.json +++ b/libs/knex-schema/package.json @@ -12,9 +12,7 @@ }, "description": "Type-safe schema-driven query builder for Knex using @cleverbrush/schema — strongly typed CRUD, eager loading, and column mapping for PostgreSQL", "files": [ - "dist", - "COMPOSABLE_QUERIES.md", - "READ-SCHEMAS.md" + "dist" ], "homepage": "https://docs.cleverbrush.com/knex-schema", "keywords": [ diff --git a/libs/knex-schema/src/extension.ts b/libs/knex-schema/src/extension.ts index cbd16f47..e5875aac 100644 --- a/libs/knex-schema/src/extension.ts +++ b/libs/knex-schema/src/extension.ts @@ -1,6 +1,4 @@ // @cleverbrush/knex-schema — Schema extension: hasColumnName / hasTableName -export { READ_SQL_TYPE } from './read-storage.js'; - import type { AnySchemaBuilder, ArraySchemaBuilder, @@ -19,6 +17,7 @@ import type { import { arrayExtensions, defineExtension, + defineMetadataMethod, EXTRA_TYPE_BRAND, METHOD_LITERAL_BRAND, NumberSchemaBuilder as NumberSchemaBuilderClass, @@ -57,6 +56,9 @@ export const PRIMARY_KEY_BRAND: unique symbol = Symbol.for( '@cleverbrush/knex-schema:primaryKey' ); +/** @internal Named primary-key result so exported consumer schemas emit portable declarations. */ +export type PrimaryKeyColumn = S & { readonly [PRIMARY_KEY_BRAND]?: true }; + /** * Phantom-type brand placed on an object schema by `.hasPrimaryKey([cols])` * to record the composite primary-key column tuple at the type level. @@ -335,34 +337,19 @@ export const ddlExtension = defineExtension({ return this.withExtension('unique', name ?? true); }, /** Override the SQL column type (e.g. `'bigint'`, `'smallint'`). */ - columnType( - this: NumberSchemaBuilder, - type: string - ) { - return this.withExtension('columnType', type); - }, + columnType: defineMetadataMethod('columnType').argument(), /** Shorthand for `.columnType('bigint')`. */ - bigint(this: NumberSchemaBuilder) { - return this.withExtension('columnType', 'bigint'); - }, + bigint: defineMetadataMethod('columnType').value('bigint'), /** Shorthand for `.columnType('smallint')`. */ - smallint(this: NumberSchemaBuilder) { - return this.withExtension('columnType', 'smallint'); - }, + smallint: defineMetadataMethod('columnType').value('smallint'), /** Shorthand for `.columnType('decimal(p,s)')` — exact numeric. * @param precision - Total digits. * @param scale - Digits after decimal point. */ - decimal( - this: NumberSchemaBuilder, - precision: number, - scale: number - ) { - return this.withExtension( - 'columnType', - `decimal(${precision},${scale})` - ); - }, + decimal: defineMetadataMethod('columnType').compute( + (precision: number, scale: number) => + `decimal(${precision},${scale})` as const + ), /** Set a raw SQL default expression. * @param expression - Raw SQL expression (e.g. `"nextval('my_seq')"`). */ @@ -1216,9 +1203,7 @@ declare module '@cleverbrush/schema' { /** Mark this column as a primary key. * @param opts - Options. `autoIncrement` defaults to `true`. */ - primaryKey(opts?: { autoIncrement?: boolean }): this & { - readonly [PRIMARY_KEY_BRAND]?: true; - }; + primaryKey(opts?: { autoIncrement?: boolean }): PrimaryKeyColumn; } interface StringSchemaBuilder< @@ -1229,9 +1214,7 @@ declare module '@cleverbrush/schema' { TExtensions > { /** Mark this column as a primary key (non-auto-increment). */ - primaryKey(): this & { - readonly [PRIMARY_KEY_BRAND]?: true; - }; + primaryKey(): PrimaryKeyColumn; } interface ObjectSchemaBuilder< diff --git a/libs/knex-schema/src/index.ts b/libs/knex-schema/src/index.ts index f583f211..90904f0b 100644 --- a/libs/knex-schema/src/index.ts +++ b/libs/knex-schema/src/index.ts @@ -52,6 +52,7 @@ export type { } from './expressions.js'; export { aggregate } from './expressions.js'; // Schema extension (hasColumnName / hasTableName + DDL/ORM) +export type { PrimaryKeyColumn } from './extension.js'; export { any, array, @@ -118,8 +119,6 @@ export type { SchemaForValue } from './read-schema.js'; export { ReadSchemaError } from './read-schema.js'; -export type { SqlNumber } from './read-storage.js'; -export { READ_SQL_TYPE } from './read-storage.js'; export type { BoundQuery } from './SchemaQueryBuilder.js'; // Main entry point export { diff --git a/libs/knex-schema/src/read-consumer.test.ts b/libs/knex-schema/src/read-consumer.test.ts new file mode 100644 index 00000000..5cfb3d9f --- /dev/null +++ b/libs/knex-schema/src/read-consumer.test.ts @@ -0,0 +1,166 @@ +import { spawnSync } from 'node:child_process'; +import { + mkdtempSync, + readFileSync, + rmSync, + symlinkSync, + writeFileSync +} from 'node:fs'; +import { tmpdir } from 'node:os'; +import { dirname, join, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { expect, test } from 'vitest'; + +const repository = resolve(dirname(fileURLToPath(import.meta.url)), '../../..'); + +test('documentation and multi-file metadata consumers compile against published declarations', () => { + const directory = mkdtempSync(join(tmpdir(), 'framework-read-consumer-')); + try { + symlinkSync( + join(repository, 'node_modules'), + join(directory, 'node_modules'), + 'dir' + ); + const write = (name: string, text: string) => + writeFileSync(join(directory, name), text); + write('package.json', JSON.stringify({ type: 'module' })); + const llms = readFileSync( + join(repository, 'websites/docs/public/llms.txt'), + 'utf8' + ); + const queryDocs = readFileSync( + join(repository, 'libs/knex-schema/README.md'), + 'utf8' + ); + const schemaDocs = readFileSync( + join(repository, 'libs/schema/README.md'), + 'utf8' + ); + const namedBlocks = (text: string) => [ + ...text.matchAll( + /```(?:typescript|ts)\n\/\/ ([\w-]+\.ts)\n([\s\S]*?)```/g + ) + ]; + expect(namedBlocks(llms)).toHaveLength(4); + expect(namedBlocks(queryDocs)).toHaveLength(3); + for (const [, name, content] of [ + ...namedBlocks(llms), + ...namedBlocks(queryDocs) + ]) + write(name, content); + const metadataDocs = schemaDocs + .split('### Typed metadata methods\n')[1] + .split('### Stacking Extensions')[0]; + write( + 'metadata-doc.ts', + metadataDocs.match(/```ts\n([\s\S]*?)```/)![1] + ); + write( + 'database.ts', + `import Knex from 'knex'; export const knex = Knex({ client: 'pg' });` + ); + write( + 'storage.ts', + ` +import { number, object, string } from '@cleverbrush/knex-schema'; +import { defineExtension, defineMetadataMethod, withExtensions } from '@cleverbrush/schema'; +export const Account = object({ + id: number().primaryKey().bigint(), + balance: number().decimal(24, 6).optional().hasColumnName('balance_value'), + label: string() +}).hasTableName('accounts') + .projection('summary', 'id', 'label') + .projection('withBalance', a => a.id, a => a.balance); +export const tagged = withExtensions(defineExtension({ + number: { unit: defineMetadataMethod('unit').argument() } +})).number().unit('metres').optional(); +` + ); + write( + 'storage-consumer.ts', + ` +import { type InferExtensionMetadata, type InferType, number } from '@cleverbrush/schema'; +import { query } from '@cleverbrush/knex-schema'; +import { mapper } from '@cleverbrush/mapper'; +import { object, string } from '@cleverbrush/schema'; +import { Account, tagged } from './storage.js'; +import { knex } from './database.js'; +const unit: InferExtensionMetadata['unit'] = 'metres'; +const value: InferType = undefined; +// @ts-expect-error metadata literal must not widen to string +const invalidUnit: InferExtensionMetadata['unit'] = 'seconds'; +// @ts-expect-error importing database libraries cannot install global storage methods +number().bigint(); +export const read = query(knex, Account).withRowSchema().select(a => ({ id: a.id, balance: a.balance })); +const PublicAccount = object({ id: string(), balance: string().nullable() }); +export const convert = mapper().configure(read.rowSchema, PublicAccount, m => m) + .getSyncMapper(read.rowSchema, PublicAccount); +const row: InferType = { id: '9007199254740993', balance: null }; +const dto: { id: string; balance: string | null } = convert(row); +// @ts-expect-error exact numeric storage is text, never a rounded JS number +const invalid: InferType = { id: 1, balance: 2 }; +` + ); + write( + 'function-consumer.ts', + ` +import { ServiceCollection } from '@cleverbrush/di'; +import { func, number, string } from '@cleverbrush/schema'; +const Dependency = string(); +const Result = number(); +const factory = func().addParameter(Dependency).hasReturnType(Result); +const services = new ServiceCollection().addSingleton(Dependency, 'hello'); +services.addSingletonFromSchema(Result, factory, text => text.length); +services.addScopedFromSchema(Result, factory, text => text.length); +services.addTransientFromSchema(Result, factory, text => text.length); +const provider = services.buildServiceProvider(); +export const result: number = provider.invoke(factory, text => text.length); +const scope = provider.createScope(); +export const scoped: number = scope.serviceProvider.invoke(factory, text => text.length); +// @ts-expect-error dependency types must not widen to any +provider.invoke(factory, (value: number) => value); +// @ts-expect-error implementation must honor the declared return schema +provider.invoke(factory, text => text); +// @ts-expect-error schema-based registration retains parameter types +services.addSingletonFromSchema(Result, factory, (value: number) => value); +` + ); + write( + 'tsconfig.json', + JSON.stringify({ + compilerOptions: { + target: 'ES2022', + module: 'ESNext', + moduleResolution: 'bundler', + strict: true, + skipLibCheck: false, + declaration: true, + emitDeclarationOnly: true, + outDir: 'dist', + types: ['node'], + lib: ['ES2022', 'DOM', 'ESNext.Disposable'] + }, + include: ['*.ts'] + }) + ); + const result = spawnSync( + process.execPath, + [ + join(repository, 'node_modules/typescript/lib/tsc.js'), + '-p', + join(directory, 'tsconfig.json') + ], + { encoding: 'utf8', timeout: 60000 } + ); + expect(result.status, `${result.stdout}\n${result.stderr}`).toBe(0); + expect( + readFileSync(join(directory, 'dist/storage.d.ts'), 'utf8') + ).toContain('Account'); + for (const text of [llms, queryDocs]) { + expect(text).not.toContain('READ-SCHEMAS.md'); + expect(text).not.toContain('COMPOSABLE_QUERIES.md'); + } + } finally { + rmSync(directory, { recursive: true, force: true }); + } +}, 90000); diff --git a/libs/knex-schema/src/read-schema.ts b/libs/knex-schema/src/read-schema.ts index 0803b794..a075e2f2 100644 --- a/libs/knex-schema/src/read-schema.ts +++ b/libs/knex-schema/src/read-schema.ts @@ -3,6 +3,7 @@ import { array, boolean, date, + type InferExtensionMetadata, type InferType, number, type ObjectSchemaBuilder, @@ -12,7 +13,6 @@ import { union } from '@cleverbrush/schema'; import type { Knex } from 'knex'; -import { READ_SQL_TYPE } from './read-storage.js'; /** A schema builder accepted by the database-read schema compiler. */ export type ReadSchema = SchemaBuilder; @@ -53,20 +53,21 @@ export type SchemaForValue = 0 extends 1 & T null extends T ? true : false >; -type StorageValue = S extends { - readonly [READ_SQL_TYPE]: infer SQL extends string; -} - ? string extends SQL - ? string | NonNullable> - : Lowercase extends - | 'bigint' - | 'bigserial' - | 'int8' - | `decimal${string}` - | `numeric${string}` - ? string - : NonNullable> - : NonNullable>; +type StorageValue = + InferExtensionMetadata extends { + columnType: infer SQL extends string; + } + ? string extends SQL + ? string | NonNullable> + : Lowercase extends + | 'bigint' + | 'bigserial' + | 'int8' + | `decimal${string}` + | `numeric${string}` + ? string + : NonNullable> + : NonNullable>; /** Database columns are present; optional persisted values are represented by SQL null. */ export type ReadValue = | StorageValue diff --git a/libs/knex-schema/src/read-storage.test-d.ts b/libs/knex-schema/src/read-storage.test-d.ts index c0571fcf..251b5178 100644 --- a/libs/knex-schema/src/read-storage.test-d.ts +++ b/libs/knex-schema/src/read-storage.test-d.ts @@ -1,7 +1,11 @@ -import type { InferType } from '@cleverbrush/schema'; +import { + type InferExtensionMetadata, + type InferType, + number as plainNumber +} from '@cleverbrush/schema'; import { expectTypeOf, test } from 'vitest'; -import { number } from './extension.js'; -import type { READ_SQL_TYPE } from './read-storage.js'; +import { number, type PRIMARY_KEY_BRAND } from './extension.js'; +import type { ReadValue } from './read-schema.js'; test('numeric storage metadata survives schema modifiers', () => { const price = number() @@ -10,8 +14,8 @@ test('numeric storage metadata survives schema modifiers', () => { .hasColumnName('price_value'); expectTypeOf>().toEqualTypeOf(); expectTypeOf< - (typeof price)[typeof READ_SQL_TYPE] - >().toEqualTypeOf<'decimal'>(); + InferExtensionMetadata['columnType'] + >().toEqualTypeOf<`decimal(${number},${number})`>(); const named = number() .hasColumnName('price_value') .decimal(20, 4) @@ -19,11 +23,40 @@ test('numeric storage metadata survives schema modifiers', () => { .index(); expectTypeOf>().toEqualTypeOf(); expectTypeOf< - (typeof named)[typeof READ_SQL_TYPE] - >().toEqualTypeOf<'decimal'>(); + InferExtensionMetadata['columnType'] + >().toEqualTypeOf<`decimal(${number},${number})`>(); const overridden = named.columnType('integer').required().notNullable(); expectTypeOf< - (typeof overridden)[typeof READ_SQL_TYPE] + InferExtensionMetadata['columnType'] >().toEqualTypeOf<'integer'>(); expectTypeOf>().toEqualTypeOf(); }); + +test('storage inference retains precision, dynamic types and other brands', () => { + const id = number().primaryKey().bigint().optional().hasColumnName('key'); + expectTypeOf>().toEqualTypeOf(); + expectTypeOf< + NonNullable<(typeof id)[typeof PRIMARY_KEY_BRAND]> + >().toEqualTypeOf(); + const small = id.smallint().required(); + expectTypeOf>().toEqualTypeOf(); + const exact = small.columnType('NUMERIC(24,6)').nullable().index(); + expectTypeOf>().toEqualTypeOf(); + const dynamic = (type: string) => number().columnType(type).optional(); + expectTypeOf>>().toEqualTypeOf< + number | string | null + >(); + // @ts-expect-error storage types must be strings + number().columnType(5); +}); + +test('database methods do not augment plain schema numbers', () => { + // @ts-expect-error database storage methods require the database factory + plainNumber().bigint(); + // @ts-expect-error database storage methods require the database factory + plainNumber().decimal(10, 2); + // @ts-expect-error database storage methods require the database factory + plainNumber().columnType('integer'); + // @ts-expect-error database storage methods require the database factory + plainNumber().smallint(); +}); diff --git a/libs/knex-schema/src/read-storage.test.ts b/libs/knex-schema/src/read-storage.test.ts new file mode 100644 index 00000000..c97559bc --- /dev/null +++ b/libs/knex-schema/src/read-storage.test.ts @@ -0,0 +1,25 @@ +import { number as plainNumber } from '@cleverbrush/schema'; +import { expect, test } from 'vitest'; +import { number } from './extension.js'; +import { compileReadSchema } from './read-schema.js'; + +test('native storage metadata is immutable and does not install global methods', () => { + const initial = number().decimal(24, 6).optional().hasColumnName('amount'); + const changed = initial.columnType('integer').required().index(); + expect(initial.introspect().extensions).toMatchObject({ + columnType: 'decimal(24,6)', + columnName: 'amount' + }); + expect(changed.introspect().extensions).toMatchObject({ + columnType: 'integer', + columnName: 'amount', + index: true + }); + expect( + compileReadSchema(initial).decode('123456789012345678.123456', 'amount') + ).toBe('123456789012345678.123456'); + expect(compileReadSchema(changed).decode(42, 'amount')).toBe(42); + for (const method of ['columnType', 'bigint', 'smallint', 'decimal']) { + expect(method in plainNumber()).toBe(false); + } +}); diff --git a/libs/knex-schema/src/read-storage.ts b/libs/knex-schema/src/read-storage.ts deleted file mode 100644 index 96a22a23..00000000 --- a/libs/knex-schema/src/read-storage.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { NumberSchemaBuilder } from '@cleverbrush/schema'; - -/** SQL storage type retained by numeric column builders for schema-aware reads. */ -export const READ_SQL_TYPE: unique symbol = Symbol.for( - '@cleverbrush/knex-schema:read-sql-type' -); - -type Preserved = { - [K in Exclude< - keyof E, - typeof READ_SQL_TYPE | 'columnType' | 'bigint' | 'smallint' | 'decimal' - >]: E[K] extends (...args: infer A) => any - ? (this: S, ...args: A) => S - : E[K]; -} & { readonly [READ_SQL_TYPE]: SQL }; - -/** A numeric validation schema whose SQL representation survives ordinary modifiers. */ -export type SqlNumber< - T, - R extends boolean, - N extends boolean, - D extends boolean, - E, - SQL extends string -> = NumberSchemaBuilder> & Preserved; - -declare module '@cleverbrush/schema' { - interface NumberSchemaBuilder< - TResult, - TRequired extends boolean, - TNullable extends boolean, - THasDefault extends boolean, - TExtensions - > { - /** Set a SQL storage type; schema-aware reads retain its representation. */ - columnType( - type: SQL - ): SqlNumber< - TResult, - TRequired, - TNullable, - THasDefault, - TExtensions, - SQL - >; - /** Set bigint storage; schema-aware reads return exact strings. */ - bigint(): SqlNumber< - TResult, - TRequired, - TNullable, - THasDefault, - TExtensions, - 'bigint' - >; - /** Set smallint storage; schema-aware reads return numbers. */ - smallint(): SqlNumber< - TResult, - TRequired, - TNullable, - THasDefault, - TExtensions, - 'smallint' - >; - /** Set decimal storage; schema-aware reads return exact strings. */ - decimal( - precision: number, - scale: number - ): SqlNumber< - TResult, - TRequired, - TNullable, - THasDefault, - TExtensions, - 'decimal' - >; - } -} - -// Match the declaration augmentation for base-schema factories too, just as the -// package's primary-key augmentation does. Every method still returns a clone. -const prototype = NumberSchemaBuilder.prototype as any; -const methods = { - columnType(this: NumberSchemaBuilder, type: string) { - return this.withExtension('columnType', type); - }, - bigint(this: NumberSchemaBuilder) { - return this.withExtension('columnType', 'bigint'); - }, - smallint(this: NumberSchemaBuilder) { - return this.withExtension('columnType', 'smallint'); - }, - decimal(this: NumberSchemaBuilder, precision: number, scale: number) { - return this.withExtension( - 'columnType', - `decimal(${precision},${scale})` - ); - } -}; -for (const [name, method] of Object.entries(methods)) - if (typeof prototype[name] !== 'function') - Object.defineProperty(prototype, name, { - value: method, - configurable: true, - writable: true - }); diff --git a/libs/knex-schema/src/unit.test.ts b/libs/knex-schema/src/unit.test.ts index 70ece32b..18a70a4e 100644 --- a/libs/knex-schema/src/unit.test.ts +++ b/libs/knex-schema/src/unit.test.ts @@ -104,12 +104,12 @@ describe('schema extension', () => { it('hasColumnName survives .optional() chaining', () => { const schema = string().hasColumnName('col_name').optional(); - expect(schema.getExtension('columnName')).toBe('col_name'); + expect(schema.introspect().extensions.columnName).toBe('col_name'); }); it('hasColumnName survives .required() chaining', () => { const schema = number().hasColumnName('col_a').optional().required(); - expect(schema.getExtension('columnName')).toBe('col_a'); + expect(schema.introspect().extensions.columnName).toBe('col_a'); }); it('hasTableName survives .optional()/.required() chaining', () => { @@ -117,7 +117,7 @@ describe('schema extension', () => { .hasTableName('my_table') .optional() .required(); - expect(schema.getExtension('tableName')).toBe('my_table'); + expect(schema.introspect().extensions.tableName).toBe('my_table'); }); }); diff --git a/libs/mapper/README.md b/libs/mapper/README.md index e1c6a6c2..4f0a7a5a 100644 --- a/libs/mapper/README.md +++ b/libs/mapper/README.md @@ -40,32 +40,6 @@ npm install @cleverbrush/mapper **Peer dependency:** `@cleverbrush/schema` -## Synchronous mapping - -Use the same `configure()` API and retrieve a synchronous mapper when every final -step and nested mapping is synchronous: - -```ts -const registry = mapper().configure(Source, Target, m => m - .for(t => t.label).compute(s => s.name.toUpperCase())); -const toTarget = registry.getSyncMapper(Source, Target); -const results = rows.map(toTarget); // ordinary values, not promises -``` - -Completeness checking, `.from()`, ignores, nested objects/arrays and compatible -auto-mapping still apply. Async computations or nested async mappings reject -`getSyncMapper()` at compile time; runtime guards cover JavaScript and unsafe -casts too. Callbacks are never probed during configuration. A function falsely -typed as synchronous that returns a promise/thenable throws when invoked. -`getMapper()` still always returns an async function. There is no separate -`configureSync()` API. - -Configure once and reuse the same source/target schema instances. Queries can -provide their projection schema through `.withRowSchema().rowSchema`; see the -[projection-aware read guide](../knex-schema/READ-SCHEMAS.md), including separate -definition/mapping/service files and explicit polymorphic dispatch. The mapper -performs no database calls or application enrichment. - ## Quick Start ```typescript @@ -112,7 +86,7 @@ const dto = await mapFn({ 1. **Define schemas** — use `@cleverbrush/schema` to define source and target shapes 2. **Configure mappings** — use `.for()` to select a target property, then `.from()`, `.compute()`, or `.ignore()` to define how it's populated 3. **Auto-mapping fills the gaps** — properties with the same name and compatible type are mapped automatically -4. **Get a mapper function** — `registry.getMapper(from, to)` returns an async function that transforms objects +4. **Get a mapper function** — use `getMapper(from, to)` for an async function or `getSyncMapper(from, to)` when all steps are synchronous 5. **TypeScript enforces completeness** — if any target property is unmapped, you get a compile-time error ## Compile-Time Safety @@ -251,6 +225,32 @@ Every non-auto-mappable target property must be either mapped or explicitly igno - A **compile-time TypeScript type error** — a type-assignability mismatch that includes the unmapped property names in the type parameters - A **runtime `MapperConfigurationError`** if type checks are bypassed +## Synchronous mapping + +Use the same `configure()` API and retrieve a synchronous mapper when every final +step and nested mapping is synchronous: + +```ts +const registry = mapper().configure(Source, Target, m => m + .for(t => t.label).compute(s => s.name.toUpperCase())); +const toTarget = registry.getSyncMapper(Source, Target); +const results = rows.map(toTarget); // ordinary values, not promises +``` + +Completeness checking, `.from()`, ignores, nested objects/arrays and compatible +auto-mapping still apply. Async computations or nested async mappings reject +`getSyncMapper()` at compile time; runtime guards cover JavaScript and unsafe +casts too. Callbacks are never probed during configuration. A function falsely +typed as synchronous that returns a promise/thenable throws when invoked. +`getMapper()` still always returns an async function. There is no separate +`configureSync()` API. + +Configure once and reuse the same source/target schema instances. Queries can +provide their projection schema through `.withRowSchema().rowSchema`; see the +[projection-aware read guide](../knex-schema/README.md#projection-aware-reads), including separate +definition/mapping/service files and explicit polymorphic dispatch. The mapper +performs no database calls or application enrichment. + ## API ### `mapper()` @@ -278,6 +278,13 @@ const mapFn = registry.getMapper(ApiUser, DomainUser); const result = await mapFn(sourceObject); ``` +### `registry.getSyncMapper(fromSchema, toSchema)` + +Retrieves an ordinary function for a complete, synchronous mapping. It returns +the target value directly and can be passed to `rows.map(...)`. Async final steps +or nested async mappings are rejected. See [Synchronous mapping](#synchronous-mapping) +for runtime guards and schema identity requirements. + ### `Mapper` A fluent builder for configuring how each target property is populated: diff --git a/libs/orm/README.md b/libs/orm/README.md index d4ec01cf..5d78ac10 100644 --- a/libs/orm/README.md +++ b/libs/orm/README.md @@ -21,29 +21,6 @@ npm install @cleverbrush/orm `knex` is a peer dependency (install it alongside `@cleverbrush/orm`). `@cleverbrush/knex-schema` is a direct dependency and is installed automatically. -## Detached reads with result schemas - -`db.users.withRowSchema()` enters an immutable read-only API whose `rowSchema` -matches its decoded selection and includes. Results remain **detached even when -the context uses `{ tracking: true }`**. This avoids attaching partial projections -as incomplete tracked entities. Ordinary entity queries keep their old behavior. - -```ts -const read = db.users.withRowSchema() - .select(u => ({ id: u.id, name: u.name })); -const Source = read.rowSchema; -const toDto = mapper().configure(Source, UserDto, m => m) - .getSyncMapper(Source, UserDto); -const users = (await read).map(toDto); -``` - -Typed relation customizers return their configured query; nested graphs are -decoded in one SQL statement. STI/CTI readers expose `variantRowSchemas` for -explicit application mapping. See the [read-schema consumer guide](../knex-schema/READ-SCHEMAS.md) -for numeric/null/date rules, examples and compatibility boundaries. - ---- - ## Quick start ### 1. Define a schema and entity @@ -103,6 +80,7 @@ const updated = await db.users.save({ id: 1, email: 'alice@example.com', name: ' | `.include(t => t.rel)` | Eager-loads a relation (chainable) | | `.save(graph)` | Insert or update a row graph (transactional) | | `.ofVariant(key)` | Return a typed `VariantDbSet` scoped to a polymorphic variant | +| `.withRowSchema()` | Creates a detached read-only query with a matching result schema | | `.query()` | Returns the underlying `EntityQuery` for advanced querying | | `.withTransaction(trx)` | Returns a new `DbSet` bound to an existing transaction | @@ -233,6 +211,29 @@ async function updateUser(userId: number) { --- +## Detached reads with result schemas + +`db.users.withRowSchema()` enters an immutable read-only API whose `rowSchema` +matches its decoded selection and includes. Results remain **detached even when +the context uses `{ tracking: true }`**. This avoids attaching partial projections +as incomplete tracked entities. Ordinary entity queries keep their old behavior. + +```ts +const read = db.users.withRowSchema() + .select(u => ({ id: u.id, name: u.name })); +const Source = read.rowSchema; +const toDto = mapper().configure(Source, UserDto, m => m) + .getSyncMapper(Source, UserDto); +const users = (await read).map(toDto); +``` + +Typed relation customizers return their configured query; nested graphs are +decoded in one SQL statement. STI/CTI readers expose `variantRowSchemas` for +explicit application mapping. See the [read-schema consumer guide](../knex-schema/README.md#projection-aware-reads) +for numeric/null/date rules, examples and compatibility boundaries. + +--- + ## Polymorphic entities (STI / CTI) ### Single-Table Inheritance (STI) @@ -392,7 +393,7 @@ schema, including variant queries when the relation schema is known. `paginateAfter({ limit, cursor, orderBy: [...] })` supports non-null scalar sorts with a declared unique tie-breaker; single-column cursor calls are unchanged. -See the [complete query guide](../knex-schema/COMPOSABLE_QUERIES.md) for defaults, +See the [complete query guide](../knex-schema/README.md#composable-read-queries) for defaults, precision policy, grouped aggregates, cursor restrictions, and migration examples. ## Related packages diff --git a/libs/schema/README.md b/libs/schema/README.md index e8c5cf37..36bf1af8 100644 --- a/libs/schema/README.md +++ b/libs/schema/README.md @@ -1565,6 +1565,55 @@ console.log(priceSchema.introspect().extensions.currency); // { maxDecimals: 4 } — structured metadata, not the raw args ``` +### Typed metadata methods + +Use `defineMetadataMethod()` when a method only records metadata and its value +must also be available to TypeScript consumers. It works inside the same +`defineExtension()` / `withExtensions()` system: + +```ts +import { + defineExtension, defineMetadataMethod, withExtensions, + type InferExtensionMetadata, type InferType +} from '@cleverbrush/schema'; + +const labels = defineExtension({ + string: { + label: defineMetadataMethod('label').argument(), + internal: defineMetadataMethod('visibility').value('internal'), + lengthHint: defineMetadataMethod('lengthHint').compute( + (min: number, max: number) => ({ min, max }) + ) + } +}); +const s = withExtensions(labels); +const title = s.string().label('Title').internal().optional(); +type Value = InferType; // string | undefined +type Label = InferExtensionMetadata['label']; // 'Title' + +const renamed = title.label('Display name').lengthHint(1, 80); +type UpdatedLabel = InferExtensionMetadata['label']; // 'Display name' +renamed.introspect().extensions.lengthHint; // { min: 1, max: 80 } +title.introspect().extensions.label; // 'Title' — original is unchanged +``` + +- `.argument()` creates a one-argument method constrained to `T` and retains + the caller's literal type. Omit `T` to accept any metadata value. +- `.value(value)` creates a zero-argument method storing a fixed value. +- `.compute(fn)` retains the callback's parameter and return types. Use a literal + or template-literal return type when that precision matters; arbitrary callback + results cannot be evaluated by TypeScript. + +The key passed to `defineMetadataMethod` controls runtime storage independently +of the method name. A subsequent write replaces that key's value and inferred +type. Metadata and ordinary extension methods compose through native modifiers +without resetting optionality, nullability or defaults. Only factories produced +by `withExtensions()` receive the methods; global builder prototypes are not +modified. Metadata is descriptive: these helpers do not add validators, transform +schema values or assign domain meaning to keys. Consumers decide how to use it. +Ordinary `defineExtension()` methods remain appropriate for validation and other +behavior; use `this.withExtension()` inside them for runtime-only metadata. + ### Stacking Extensions Multiple extensions can be stacked — their methods are merged per builder type. A runtime error is thrown if two extensions define the same method name on the same builder type: diff --git a/libs/schema/src/builders/AnySchemaBuilder.ts b/libs/schema/src/builders/AnySchemaBuilder.ts index 451a85c1..85341c0c 100644 --- a/libs/schema/src/builders/AnySchemaBuilder.ts +++ b/libs/schema/src/builders/AnySchemaBuilder.ts @@ -41,6 +41,16 @@ export class AnySchemaBuilder< THasDefault, TExtensions > { + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + declare readonly __cleverbrush_builder_type__: readonly [ + 'any', + TRequired, + TNullable, + TExplicitType, + THasDefault, + TResult + ]; + /** * @hidden */ diff --git a/libs/schema/src/builders/ArraySchemaBuilder.ts b/libs/schema/src/builders/ArraySchemaBuilder.ts index 2d41dba6..0cca75e6 100644 --- a/libs/schema/src/builders/ArraySchemaBuilder.ts +++ b/libs/schema/src/builders/ArraySchemaBuilder.ts @@ -112,6 +112,17 @@ export class ArraySchemaBuilder< THasDefault, TExtensions > { + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + declare readonly __cleverbrush_builder_type__: readonly [ + 'array', + TElementSchema, + TRequired, + TNullable, + TExplicitType, + THasDefault, + TResult + ]; + #minLength?: number; #defaultMinLengthErrorMessageProvider: ValidationErrorMessageProvider< ArraySchemaBuilder diff --git a/libs/schema/src/builders/BooleanSchemaBuilder.ts b/libs/schema/src/builders/BooleanSchemaBuilder.ts index 2a3815f4..6b9a83d2 100644 --- a/libs/schema/src/builders/BooleanSchemaBuilder.ts +++ b/libs/schema/src/builders/BooleanSchemaBuilder.ts @@ -55,6 +55,17 @@ export class BooleanSchemaBuilder< THasDefault, TExtensions > { + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + declare readonly __cleverbrush_builder_type__: readonly [ + 'boolean', + TResult, + TRequired, + TNullable, + TExplicitType, + THasDefault, + TFinalResult + ]; + #equalsTo?: boolean; #defaultEqualsToErrorMessageProvider: ValidationErrorMessageProvider< BooleanSchemaBuilder diff --git a/libs/schema/src/builders/DateSchemaBuilder.ts b/libs/schema/src/builders/DateSchemaBuilder.ts index 161efd5d..006eb8d7 100644 --- a/libs/schema/src/builders/DateSchemaBuilder.ts +++ b/libs/schema/src/builders/DateSchemaBuilder.ts @@ -86,6 +86,15 @@ export class DateSchemaBuilder< THasDefault, TExtensions > { + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + declare readonly __cleverbrush_builder_type__: readonly [ + 'date', + TResult, + TRequired, + TNullable, + THasDefault + ]; + #min?: Date; #defaultMinErrorMessageProvider: ValidationErrorMessageProvider< DateSchemaBuilder diff --git a/libs/schema/src/builders/FunctionSchemaBuilder.ts b/libs/schema/src/builders/FunctionSchemaBuilder.ts index b8aa381b..31d85da2 100644 --- a/libs/schema/src/builders/FunctionSchemaBuilder.ts +++ b/libs/schema/src/builders/FunctionSchemaBuilder.ts @@ -87,6 +87,18 @@ export class FunctionSchemaBuilder< THasDefault, TExtensions > { + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + declare readonly __cleverbrush_builder_type__: readonly [ + 'func', + TRequired, + TNullable, + TExplicitType, + THasDefault, + TParameters, + TReturnTypeSchema, + TResult + ]; + #parameters: SchemaBuilder[] = []; #returnType?: SchemaBuilder; diff --git a/libs/schema/src/builders/GenericSchemaBuilder.ts b/libs/schema/src/builders/GenericSchemaBuilder.ts index 54dd9566..4e6b40e2 100644 --- a/libs/schema/src/builders/GenericSchemaBuilder.ts +++ b/libs/schema/src/builders/GenericSchemaBuilder.ts @@ -113,6 +113,17 @@ export class GenericSchemaBuilder< THasDefault, TExtensions > { + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + declare readonly __cleverbrush_builder_type__: readonly [ + 'generic', + TFn, + TRequired, + TNullable, + TExplicitType, + THasDefault, + TResult + ]; + #templateFn?: (...args: any[]) => SchemaBuilder; #defaults?: readonly any[]; #cachedDefaultSchema?: SchemaBuilder; diff --git a/libs/schema/src/builders/NumberSchemaBuilder.ts b/libs/schema/src/builders/NumberSchemaBuilder.ts index 951dc148..d15d4b22 100644 --- a/libs/schema/src/builders/NumberSchemaBuilder.ts +++ b/libs/schema/src/builders/NumberSchemaBuilder.ts @@ -63,6 +63,15 @@ export class NumberSchemaBuilder< THasDefault, TExtensions > { + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + declare readonly __cleverbrush_builder_type__: readonly [ + 'number', + TResult, + TRequired, + TNullable, + THasDefault + ]; + #min?: number; #defaultMinErrorMessageProvider: ValidationErrorMessageProvider< NumberSchemaBuilder diff --git a/libs/schema/src/builders/ObjectSchemaBuilder.ts b/libs/schema/src/builders/ObjectSchemaBuilder.ts index a21c58a8..3be56a3c 100644 --- a/libs/schema/src/builders/ObjectSchemaBuilder.ts +++ b/libs/schema/src/builders/ObjectSchemaBuilder.ts @@ -378,6 +378,17 @@ export class ObjectSchemaBuilder< THasDefault, TExtensions > { + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + declare readonly __cleverbrush_builder_type__: readonly [ + 'object', + TProperties, + TRequired, + TNullable, + TExplicitType, + THasDefault, + TConstructorSchemas + ]; + #properties: TProperties = {} as any; #acceptUnknownProps = false; #propKeys: string[] = []; diff --git a/libs/schema/src/builders/PromiseSchemaBuilder.ts b/libs/schema/src/builders/PromiseSchemaBuilder.ts index b1c2f594..61da354d 100644 --- a/libs/schema/src/builders/PromiseSchemaBuilder.ts +++ b/libs/schema/src/builders/PromiseSchemaBuilder.ts @@ -73,6 +73,17 @@ export class PromiseSchemaBuilder< THasDefault, TExtensions > { + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + declare readonly __cleverbrush_builder_type__: readonly [ + 'promise', + TRequired, + TNullable, + TExplicitType, + THasDefault, + TResolvedTypeSchema, + TResult + ]; + #resolvedType?: SchemaBuilder; /** diff --git a/libs/schema/src/builders/RecordSchemaBuilder.ts b/libs/schema/src/builders/RecordSchemaBuilder.ts index 18c6ac3b..ab865908 100644 --- a/libs/schema/src/builders/RecordSchemaBuilder.ts +++ b/libs/schema/src/builders/RecordSchemaBuilder.ts @@ -243,6 +243,18 @@ export class RecordSchemaBuilder< THasDefault, TExtensions > { + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + declare readonly __cleverbrush_builder_type__: readonly [ + 'record', + TKeySchema, + TValueSchema, + TRequired, + TNullable, + TExplicitType, + THasDefault, + TResult + ]; + #keySchema!: TKeySchema; #valueSchema!: TValueSchema; diff --git a/libs/schema/src/builders/StringSchemaBuilder.ts b/libs/schema/src/builders/StringSchemaBuilder.ts index 5323b96c..166b9406 100644 --- a/libs/schema/src/builders/StringSchemaBuilder.ts +++ b/libs/schema/src/builders/StringSchemaBuilder.ts @@ -80,6 +80,15 @@ export class StringSchemaBuilder< THasDefault, TExtensions > { + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + declare readonly __cleverbrush_builder_type__: readonly [ + 'string', + TResult, + TRequired, + TNullable, + THasDefault + ]; + #minLength?: number; #defaultMinLengthErrorMessageProvider: ValidationErrorMessageProvider< StringSchemaBuilder diff --git a/libs/schema/src/builders/TupleSchemaBuilder.ts b/libs/schema/src/builders/TupleSchemaBuilder.ts index 9f95b748..0fb1c9d1 100644 --- a/libs/schema/src/builders/TupleSchemaBuilder.ts +++ b/libs/schema/src/builders/TupleSchemaBuilder.ts @@ -162,6 +162,18 @@ export class TupleSchemaBuilder< THasDefault, TExtensions > { + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + declare readonly __cleverbrush_builder_type__: readonly [ + 'tuple', + TElements, + TRequired, + TNullable, + TExplicitType, + THasDefault, + TRestSchema, + TResult + ]; + #elements!: TElements; #restSchema: | (TRestSchema & SchemaBuilder) diff --git a/libs/schema/src/builders/UnionSchemaBuilder.ts b/libs/schema/src/builders/UnionSchemaBuilder.ts index 2aaf8e4b..ede1d90e 100644 --- a/libs/schema/src/builders/UnionSchemaBuilder.ts +++ b/libs/schema/src/builders/UnionSchemaBuilder.ts @@ -174,6 +174,16 @@ export class UnionSchemaBuilder< THasDefault, TExtensions > { + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + declare readonly __cleverbrush_builder_type__: readonly [ + 'union', + TOptions, + TRequired, + TNullable, + TExplicitType, + THasDefault + ]; + #options!: TOptions; #discriminatorKey: string | null = null; #discriminatorMap: Map< diff --git a/libs/schema/src/core.ts b/libs/schema/src/core.ts index 8a8d60f7..c177c919 100644 --- a/libs/schema/src/core.ts +++ b/libs/schema/src/core.ts @@ -87,13 +87,21 @@ export type { CleanExtended, ExtensionConfig, ExtensionDescriptor, + ExtraProperties, ExtraTypeBrandSymbol, FixedMethods, HiddenExtensionMethods, + InferExtensionMetadata, + MetadataExtended, + MetadataMethod, + MetadataMethodBuilder, + MetadataMethods, + MetadataState, MethodLiteralBrandSymbol } from './extension.js'; export { defineExtension, + defineMetadataMethod, EXTRA_TYPE_BRAND, METHOD_LITERAL_BRAND, withExtensions diff --git a/libs/schema/src/extension.ts b/libs/schema/src/extension.ts index 9569434c..ba53cf5a 100644 --- a/libs/schema/src/extension.ts +++ b/libs/schema/src/extension.ts @@ -91,6 +91,19 @@ import type { import { StringSchemaBuilder, string } from './builders/StringSchemaBuilder.js'; import { TupleSchemaBuilder, tuple } from './builders/TupleSchemaBuilder.js'; import { UnionSchemaBuilder, union } from './builders/UnionSchemaBuilder.js'; +import type { MetadataExtended } from './metadata-extension.js'; +import { isMetadataMethod } from './metadata-extension.js'; + +export type { + ExtraProperties, + InferExtensionMetadata, + MetadataExtended, + MetadataMethod, + MetadataMethodBuilder, + MetadataMethods, + MetadataState +} from './metadata-extension.js'; +export { defineMetadataMethod } from './metadata-extension.js'; // --------------------------------------------------------------------------- // Builder type name mapping @@ -432,9 +445,7 @@ export type FixedMethods< * `withExtension` / `getExtension` overridden to `never` so they * don't appear as callable in consumer code. */ -export type CleanExtended = TBuilder & - FixedMethods & - HiddenExtensionMethods; +export type CleanExtended = MetadataExtended; // -- Factory types that return builders with corrected extension methods ------ @@ -747,6 +758,10 @@ export function defineExtension( `Extension method "${builderName}.${methodName}" must be a function` ); } + if (isMetadataMethod(origMethod)) { + wrappedConfig[builderName][methodName] = origMethod; + continue; + } // Wrap the method to auto-infer extension key if not already set wrappedConfig[builderName][methodName] = function ( this: any, diff --git a/libs/schema/src/metadata-extension.test-d.ts b/libs/schema/src/metadata-extension.test-d.ts new file mode 100644 index 00000000..34c569f2 --- /dev/null +++ b/libs/schema/src/metadata-extension.test-d.ts @@ -0,0 +1,210 @@ +import { expectTypeOf, test } from 'vitest'; +import { + defineExtension, + defineMetadataMethod, + EXTRA_TYPE_BRAND, + type InferExtensionMetadata, + METHOD_LITERAL_BRAND, + withExtensions +} from './extension.js'; +import { + type DateSchemaBuilder, + type InferType, + type NumberSchemaBuilder, + number, + type ObjectSchemaBuilder, + type object, + string +} from './index.js'; + +const tagged = defineExtension({ + number: { + unit: defineMetadataMethod('unit').argument(), + metres: defineMetadataMethod('unit').value('m'), + rangeHint: defineMetadataMethod('range').compute( + (min: number, max: number) => [min, max] as const + ), + positive(this: NumberSchemaBuilder) { + return this.min(0); + } + }, + string: { label: defineMetadataMethod('label').argument() }, + object: { tag: defineMetadataMethod('tag').argument() } +}); + +test('ordinary extensions retain receiver types even without typed metadata methods', () => { + const labels = defineExtension({ + date: { + label( + this: DateSchemaBuilder, + text: string + ) { + return this.withExtension('label', text); + } + } + }); + const value = withExtensions(labels) + .date() + .optional() + .label('Updated') + .nullable(); + expectTypeOf>().toEqualTypeOf< + Date | undefined | null + >(); + expectTypeOf>().not.toBeAny(); +}); + +test('metadata replacement and native modifiers preserve precise value types', () => { + const s = withExtensions(tagged); + const base = s.number().unit('cm').optional().nullable().positive(); + expectTypeOf>().toEqualTypeOf< + number | undefined | null + >(); + expectTypeOf< + InferExtensionMetadata['unit'] + >().toEqualTypeOf<'cm'>(); + const changed = base.metres().rangeHint(0, 10).required().notNullable(); + expectTypeOf>().toEqualTypeOf(); + expectTypeOf< + InferExtensionMetadata['unit'] + >().toEqualTypeOf<'m'>(); + expectTypeOf< + InferExtensionMetadata['range'] + >().toEqualTypeOf(); + const defaulted = base.default(2).unit('km'); + expectTypeOf>().toEqualTypeOf(); + // @ts-expect-error metadata argument constraints are enforced + base.unit(12); + // @ts-expect-error computed metadata arguments remain typed + base.rangeHint('min', 'max'); +}); + +test('metadata is independent of builder kind and retains structural edits', () => { + const s = withExtensions(tagged); + const text = s.string().label('Title').optional().minLength(1); + expectTypeOf>().toEqualTypeOf(); + expectTypeOf< + InferExtensionMetadata['label'] + >().toEqualTypeOf<'Title'>(); + const record = s + .object({ name: string() }) + .tag('input') + .addProp('title', text) + .tag('output'); + expectTypeOf>().toEqualTypeOf<{ + name: string; + title?: string; + }>(); + expectTypeOf< + InferExtensionMetadata['tag'] + >().toEqualTypeOf<'output'>(); + expectTypeOf< + InferExtensionMetadata> + >().toEqualTypeOf<{}>(); +}); + +test('metadata works across every extension factory kind', () => { + const methods = { tag: defineMetadataMethod('tag').argument() }; + const s = withExtensions( + defineExtension({ + boolean: methods, + date: methods, + array: methods, + tuple: methods, + record: methods, + union: methods, + any: methods, + promise: methods, + generic: methods, + func: methods + }) + ); + const bool = s.boolean().optional().tag('bool').nullable(); + const date = s.date().tag('date').optional(); + const array = s.array(number()).tag('array').optional(); + const tuple = s.tuple([string(), number()]).tag('tuple').optional(); + const record = s.record(string(), number()).tag('record').optional(); + const union = s.union(string()).or(number()).tag('union').optional(); + const any = s.any().hasType<{ value: string }>().tag('any').optional(); + const promise = s.promise(string()).tag('promise').optional(); + const generic = s.generic((value: string) => string(value)).tag('generic'); + const fn = s + .func() + .addParameter(string()) + .hasReturnType(number()) + .tag('function'); + expectTypeOf>().toEqualTypeOf< + boolean | undefined | null + >(); + expectTypeOf>().toEqualTypeOf(); + expectTypeOf>().toEqualTypeOf< + number[] | undefined + >(); + expectTypeOf>().toEqualTypeOf< + [string, number] | undefined + >(); + expectTypeOf>().toEqualTypeOf< + Record | undefined + >(); + expectTypeOf>().toEqualTypeOf< + string | number | undefined + >(); + expectTypeOf>().toEqualTypeOf< + { value: string } | undefined + >(); + expectTypeOf>().toEqualTypeOf< + Promise | undefined + >(); + expectTypeOf< + InferExtensionMetadata['tag'] + >().toEqualTypeOf<'generic'>(); + expectTypeOf>().toEqualTypeOf< + (arg: string) => number + >(); +}); + +test('metadata composes with existing literal-name and property-list extensions', () => { + const naming = defineExtension({ + object: { + named(this: ObjectSchemaBuilder, name: string) { + return this.withExtension('name', name) as typeof this & { + readonly [METHOD_LITERAL_BRAND]?: string; + }; + }, + fields( + this: ObjectSchemaBuilder, + name: string, + ...fields: string[] + ) { + return this.withExtension(name, fields) as typeof this & { + readonly [EXTRA_TYPE_BRAND]?: Record< + string, + readonly string[] + >; + }; + } + } + }); + const s = withExtensions(tagged, naming) + .object({ name: string(), age: number() }) + .named('first') + .tag('input') + .fields('summary', 'name') + .optional() + .named('second') + .tag('output'); + expectTypeOf< + NonNullable<(typeof s)[typeof METHOD_LITERAL_BRAND]> + >().toEqualTypeOf<'first' | 'second'>(); + expectTypeOf< + NonNullable<(typeof s)[typeof EXTRA_TYPE_BRAND]>['summary'] + >().toEqualTypeOf(); + expectTypeOf< + InferExtensionMetadata['tag'] + >().toEqualTypeOf<'output'>(); + expectTypeOf>().toEqualTypeOf< + { name: string; age: number } | undefined + >(); + // @ts-expect-error extension-author methods stay hidden after fluent calls + s.withExtension('tag', 'unsafe'); +}); diff --git a/libs/schema/src/metadata-extension.test.ts b/libs/schema/src/metadata-extension.test.ts new file mode 100644 index 00000000..46e1bada --- /dev/null +++ b/libs/schema/src/metadata-extension.test.ts @@ -0,0 +1,96 @@ +import { describe, expect, it } from 'vitest'; +import { + defineExtension, + defineMetadataMethod, + withExtensions +} from './extension.js'; +import { number, type StringSchemaBuilder, string } from './index.js'; + +const labels = defineExtension({ + string: { + label: defineMetadataMethod('label').argument(), + internal: defineMetadataMethod('visibility').value('internal'), + external: defineMetadataMethod('visibility').value('external'), + lengthHint: defineMetadataMethod('lengthHint').compute( + (min: number, max: number) => ({ min, max }) + ), + trim(this: StringSchemaBuilder) { + return this.addPreprocessor(v => + typeof v === 'string' ? v.trim() : v + ); + } + } +}); + +describe('typed metadata extensions', () => { + it('stores only the declared key, including explicit undefined values', () => { + const s = withExtensions( + defineExtension({ + string: { + label: defineMetadataMethod('label').value(undefined), + anonymous: defineMetadataMethod('label').compute( + () => undefined + ), + internal: + defineMetadataMethod('visibility').value('internal') + } + }) + ); + expect(s.string().label().introspect().extensions).toEqual({ + label: undefined + }); + expect( + s.string().anonymous().internal().introspect().extensions + ).toEqual({ label: undefined, visibility: 'internal' }); + }); + it('stores literal, constant and computed values through immutable chains', () => { + const s = withExtensions(labels); + const original = s.string().label('Title').internal(); + const changed = original + .optional() + .nullable() + .lengthHint(1, 20) + .external() + .trim() + .label('Name'); + expect(original.introspect().extensions).toMatchObject({ + label: 'Title', + visibility: 'internal' + }); + expect(changed.introspect().extensions).toMatchObject({ + label: 'Name', + visibility: 'external', + lengthHint: { min: 1, max: 20 } + }); + expect(changed.parse(' Name ')).toBe('Name'); + expect(changed.parse(null)).toBeNull(); + expect(changed.parse(undefined)).toBeUndefined(); + }); + + it('isolates factories and never mutates global builder prototypes', () => { + const tagged = withExtensions(labels).string(); + expect(typeof tagged.label).toBe('function'); + expect('label' in string()).toBe(false); + expect('label' in number()).toBe(false); + expect('label' in withExtensions().string()).toBe(false); + }); + + it('composes with ordinary extensions and overwrites metadata', () => { + const other = defineExtension({ + string: { + searchable: defineMetadataMethod('searchable').value(true) + } + }); + const s = withExtensions(labels, other) + .string() + .label('First') + .searchable() + .trim() + .label('Second'); + expect(s.introspect().extensions).toMatchObject({ + label: 'Second', + searchable: true + }); + expect(s.parse(' x ')).toBe('x'); + }); +}); diff --git a/libs/schema/src/metadata-extension.ts b/libs/schema/src/metadata-extension.ts new file mode 100644 index 00000000..2e727b26 --- /dev/null +++ b/libs/schema/src/metadata-extension.ts @@ -0,0 +1,375 @@ +import type { AnySchemaBuilder } from './builders/AnySchemaBuilder.js'; +import type { ArraySchemaBuilder } from './builders/ArraySchemaBuilder.js'; +import type { BooleanSchemaBuilder } from './builders/BooleanSchemaBuilder.js'; +import type { DateSchemaBuilder } from './builders/DateSchemaBuilder.js'; +import type { FunctionSchemaBuilder } from './builders/FunctionSchemaBuilder.js'; +import type { GenericSchemaBuilder } from './builders/GenericSchemaBuilder.js'; +import type { NumberSchemaBuilder } from './builders/NumberSchemaBuilder.js'; +import type { ObjectSchemaBuilder } from './builders/ObjectSchemaBuilder.js'; +import type { PromiseSchemaBuilder } from './builders/PromiseSchemaBuilder.js'; +import type { RecordSchemaBuilder } from './builders/RecordSchemaBuilder.js'; +import type { + PropertyDescriptorTree, + SchemaBuilder +} from './builders/SchemaBuilder.js'; +import type { StringSchemaBuilder } from './builders/StringSchemaBuilder.js'; +import type { TupleSchemaBuilder } from './builders/TupleSchemaBuilder.js'; +import type { UnionSchemaBuilder } from './builders/UnionSchemaBuilder.js'; +import type { + EXTRA_TYPE_BRAND, + HiddenExtensionMethods, + METHOD_LITERAL_BRAND +} from './extension.js'; + +const metadataMethods = new WeakSet(); + +/** @internal Metadata helpers own their key, including explicitly undefined values. */ +export function isMetadataMethod(method: Function): boolean { + return metadataMethods.has(method); +} + +/** Metadata recorded by typed extension methods; unannotated builders yield `{}`. */ +export type InferExtensionMetadata = S extends { + readonly __cleverbrush_extension_metadata__: infer M; +} + ? M + : {}; + +/** @internal Description carried on a metadata method's type, not on schemas. */ +export type MetadataMethod = (( + this: SchemaBuilder, + ...args: A +) => SchemaBuilder) & { + readonly __cleverbrush_metadata_method__: { key: K; value: V; mode: Mode }; +}; + +/** Defines the source of a typed metadata value for an extension method. */ +export interface MetadataMethodBuilder { + /** Store the caller's argument, retaining its literal type. */ + argument(): MetadataMethod< + K, + [value: TValue], + TValue, + 'argument' + >; + /** Create a zero-argument method that stores a fixed value. */ + value(value: TValue): MetadataMethod; + /** Compute metadata from typed arguments; inference uses the callback's return type. */ + compute( + compute: (...args: TArgs) => TValue + ): MetadataMethod; +} + +/** + * Define an immutable metadata-only method for use inside `defineExtension()`. + * + * Unlike ordinary extension methods, its stored value is also available through + * `InferExtensionMetadata`. Repeated writes replace the value for that key. + * The method does not validate input or change the schema's inferred value type. + * Methods are installed only on factories returned by `withExtensions()`. + * + * @param key - Runtime introspection key, independent of the fluent method name. + * @example + * ```ts + * const labels = defineExtension({ + * string: { + * label: defineMetadataMethod('label').argument(), + * internal: defineMetadataMethod('visibility').value('internal') + * } + * }); + * const s = withExtensions(labels).string().label('Title').optional(); + * type Label = InferExtensionMetadata['label']; // 'Title' + * ``` + */ +export function defineMetadataMethod( + key: K +): MetadataMethodBuilder { + const method = (compute: (...args: any[]) => unknown) => { + const apply = function ( + this: SchemaBuilder, + ...args: any[] + ) { + return this.withExtension(key, compute(...args)); + }; + metadataMethods.add(apply); + return apply; + }; + return { + argument: () => method(value => value), + value: value => method(() => value), + compute: method + } as MetadataMethodBuilder; +} + +/** @internal Rebuild a native builder with new extension state, preserving its value flags. */ +type WithExtensions = S extends { + readonly __cleverbrush_builder_type__: infer P; +} + ? P extends readonly [ + 'number', + infer T, + infer R extends boolean, + infer N extends boolean, + infer D extends boolean + ] + ? NumberSchemaBuilder + : P extends readonly [ + 'string', + infer T, + infer R extends boolean, + infer N extends boolean, + infer D extends boolean + ] + ? StringSchemaBuilder + : P extends readonly [ + 'date', + infer T, + infer R extends boolean, + infer N extends boolean, + infer D extends boolean + ] + ? DateSchemaBuilder + : P extends readonly [ + 'object', + infer P extends Record< + string, + SchemaBuilder + >, + infer R extends boolean, + infer N extends boolean, + infer T, + infer D extends boolean, + infer C extends SchemaBuilder[] + ] + ? ObjectSchemaBuilder + : P extends readonly [ + 'array', + infer P extends SchemaBuilder, + infer R extends boolean, + infer N extends boolean, + infer T, + infer D extends boolean, + infer V + ] + ? ArraySchemaBuilder + : P extends readonly [ + 'boolean', + infer T, + infer R extends boolean, + infer N extends boolean, + infer X, + infer D extends boolean, + infer V + ] + ? BooleanSchemaBuilder + : P extends readonly [ + 'tuple', + infer P extends readonly SchemaBuilder< + any, + any, + any, + any, + any + >[], + infer R extends boolean, + infer N extends boolean, + infer T, + infer D extends boolean, + infer Rest extends + | SchemaBuilder + | undefined, + infer V + ] + ? TupleSchemaBuilder + : P extends readonly [ + 'record', + infer K extends StringSchemaBuilder< + any, + any, + any, + any + >, + infer P extends SchemaBuilder< + any, + any, + any, + any, + any + >, + infer R extends boolean, + infer N extends boolean, + infer T, + infer D extends boolean, + infer V + ] + ? RecordSchemaBuilder + : P extends readonly [ + 'union', + infer P extends readonly SchemaBuilder< + any, + any, + any, + any, + any + >[], + infer R extends boolean, + infer N extends boolean, + infer T, + infer D extends boolean + ] + ? UnionSchemaBuilder + : P extends readonly [ + 'func', + infer R extends boolean, + infer N extends boolean, + infer T, + infer D extends boolean, + infer P extends SchemaBuilder< + any, + any, + any, + any, + any + >[], + infer Return extends + | SchemaBuilder + | undefined, + infer V + ] + ? FunctionSchemaBuilder + : P extends readonly [ + 'promise', + infer R extends boolean, + infer N extends boolean, + infer T, + infer D extends boolean, + infer P extends + | SchemaBuilder + | undefined, + infer V + ] + ? PromiseSchemaBuilder + : P extends readonly [ + 'generic', + infer F extends ( + ...args: any[] + ) => SchemaBuilder, + infer R extends boolean, + infer N extends boolean, + infer T, + infer D extends boolean, + infer V + ] + ? GenericSchemaBuilder + : P extends readonly [ + 'any', + infer R extends boolean, + infer N extends boolean, + infer T, + infer D extends boolean, + infer V + ] + ? AnySchemaBuilder + : never + : never; + +/** @internal Named declaration support for metadata-aware fluent builders. */ +export type MetadataState = + MetadataMethods & + HiddenExtensionMethods & + Extras & { + readonly __cleverbrush_extension_metadata__: Metadata; + }; + +/** @internal A metadata-aware factory result; state survives native builder modifiers. */ +export type MetadataExtended< + S, + Methods, + Metadata = {}, + Extras = ExtraProperties +> = WithExtensions> & + MetadataState; + +/** @internal Preserve author-defined type brands without intersecting stale metadata or methods. */ +export type ExtraProperties = Pick< + S, + Exclude< + keyof S, + | keyof WithExtensions + | keyof Methods + | '__cleverbrush_extension_metadata__' + > +>; + +type ExtraTypes = S extends { readonly [EXTRA_TYPE_BRAND]?: infer T } + ? T + : {}; +type LiteralNames = S extends { readonly [METHOD_LITERAL_BRAND]?: infer T } + ? T + : never; +type WithBrand = MetadataExtended< + S, + Methods, + InferExtensionMetadata, + Omit, K> & { readonly [P in K]?: V } +>; + +type SetMetadata = MetadataExtended< + S, + Methods, + Omit, K> & Record +>; + +/** Describe fields without recursively inspecting the receiver's fluent methods. */ +type MetadataPropertyTree = S extends { + readonly __cleverbrush_builder_type__: readonly [ + 'object', + infer P extends Record>, + ...unknown[] + ]; +} + ? PropertyDescriptorTree, ObjectSchemaBuilder

> + : never; + +/** @internal Named declaration support for extension method signatures. */ +export type MetadataMethods = { + [M in keyof Methods]: Methods[M] extends MetadataMethod< + infer K, + infer A, + infer V, + infer Mode + > + ? Mode extends 'argument' + ? ( + this: S, + value: Value + ) => SetMetadata + : (this: S, ...args: A) => SetMetadata + : Methods[M] extends (this: any, ...args: infer A) => infer R + ? typeof EXTRA_TYPE_BRAND extends keyof R + ? ( + this: S, + name: Name, + ...columns: ReadonlyArray< + Key | ((t: MetadataPropertyTree) => any) + > + ) => WithBrand< + S, + Methods, + typeof EXTRA_TYPE_BRAND, + ExtraTypes & Record + > + : typeof METHOD_LITERAL_BRAND extends keyof R + ? ( + this: S, + name: Name, + ...rest: A extends [any, ...infer Rest] ? Rest : [] + ) => WithBrand< + S, + Methods, + typeof METHOD_LITERAL_BRAND, + LiteralNames | Name + > + : (this: S, ...args: A) => S + : Methods[M]; +}; diff --git a/websites/docs/app/knex-schema/page.tsx b/websites/docs/app/knex-schema/page.tsx index 7cae6e15..917f8b4a 100644 --- a/websites/docs/app/knex-schema/page.tsx +++ b/websites/docs/app/knex-schema/page.tsx @@ -18,37 +18,6 @@ export default function KnexSchemaPage() {

- - {/* ── Installation ─────────────────────────────────── */} t.id, taskId);`) -
-

Composable read queries

-

- Use alias(schema, name) with typed flat - joins and object projections for DTOs. Left-joined - fields include null; source scopes and soft deletion are - retained. -

-
 eq(t.task.ownerId, t.owner.id))
-    .select(t => ({ id: t.task.id, ownerName: t.owner.name }));`)
-                        }}
-                    />
-                    

Aggregates and optional output schemas

-

- Count helpers return checked numbers; sum and average - preserve database numeric text or null. Min/max follow - the column representation. Optional output schemas - replace decoding and receive raw driver values, - including null. Typed aggregate expressions support - grouped results. -

-
 t.estimate, {
-    output: number().isFloat().coerce().nullable()
-});`)
-                        }}
-                    />
-                    

Ordering and composite cursors

-

- Eager loading preserves final parent order and page - size. Composite cursors retain timestamp precision and - require non-null scalar columns with a declared unique - tie-breaker. Reapply access filters; cursors are not - authorization. -

-
 t.createdAt, direction: 'desc' },
-        { column: t => t.id, direction: 'desc' }
-    ]
-});`)
-                        }}
-                    />
-                    

- Existing APIs remain unchanged. Read the{' '} - - complete query guide - {' '} - for examples, precision policy, and restrictions. -

-
- {/* ── Quick Start ──────────────────────────────────── */}

Quick Start

@@ -412,6 +319,99 @@ const activeUsers = await query(db, UserSchema, base)
+
+

Composable read queries

+

+ Use alias(schema, name) with typed flat + joins and object projections for DTOs. Left-joined + fields include null; source scopes and soft deletion are + retained. +

+
 eq(t.task.ownerId, t.owner.id))
+    .select(t => ({ id: t.task.id, ownerName: t.owner.name }));`)
+                        }}
+                    />
+                    

Aggregates and optional output schemas

+

+ Count helpers return checked numbers; sum and average + preserve database numeric text or null. Min/max follow + the column representation. Optional output schemas + replace decoding and receive raw driver values, + including null. Typed aggregate expressions support + grouped results. +

+
 t.estimate, {
+    output: number().isFloat().coerce().nullable()
+});`)
+                        }}
+                    />
+                    

Ordering and composite cursors

+

+ Eager loading preserves final parent order and page + size. Composite cursors retain timestamp precision and + require non-null scalar columns with a declared unique + tie-breaker. Reapply access filters; cursors are not + authorization. +

+
 t.createdAt, direction: 'desc' },
+        { column: t => t.id, direction: 'desc' }
+    ]
+});`)
+                        }}
+                    />
+                    

+ Existing APIs remain unchanged. Read the{' '} + + complete query guide + {' '} + for examples, precision policy, and restrictions. +

+
+ +
+

Opt-in projection-aware reads

+

+ Start with withRowSchema() before selecting or including + fields. The immutable PostgreSQL reader exposes the + actual decoded result schema: SQL null stays null, dates + are Date objects at every depth, and decimal/bigint + values are exact strings before JSON parsing. +

+
+                         ({ title: t.title, amount: t.amount }));
+const Source = read.rowSchema;
+const rows = await read.where(t => t.id, taskId);`)
+                            }}
+                        />
+                    
+

+ Typed aliases, aggregates, named projections and nested + graphs retain their selected shape. Polymorphic readers + expose a union rowSchema and per-variant object schemas. + Raw shapes are rejected; existing query behavior is + unchanged. +

+ + Read representation, pagination and migration details + +
+ {/* ── API Reference ────────────────────────────────── */}

API Reference

diff --git a/websites/docs/app/mapper/page.tsx b/websites/docs/app/mapper/page.tsx index 55e0f844..fdf8aed4 100644 --- a/websites/docs/app/mapper/page.tsx +++ b/websites/docs/app/mapper/page.tsx @@ -17,38 +17,6 @@ export default function MapperPage() {

-
-

Synchronous mapping and query row schemas

-

- Keep the existing configure() API. When the final - computations and nested mappings are synchronous, - getSyncMapper() returns ordinary values while retaining - completeness checks. getMapper() remains asynchronous. -

-
-                         ({ id: u.id, name: u.name }));
-const Source = read.rowSchema; // no SQL
-const toDto = mapper().configure(Source, UserDto, m => m)
-    .getSyncMapper(Source, UserDto);
-const result = (await read).map(toDto);`)
-                            }}
-                        />
-                    
-

- Known async mappings are rejected; disguised promises or - thenables throw at invocation. Configuration never - probes callbacks. Fetching, enrichment, authorization - and union dispatch remain explicit application code. -

- - Read the multi-file consumer guide and compatibility - rules - -
- {/* ── Install ─────────────────────────────────────── */}

Installation

@@ -250,6 +218,38 @@ const registry = mapper()
+
+

Synchronous mapping and query row schemas

+

+ Keep the existing configure() API. When the final + computations and nested mappings are synchronous, + getSyncMapper() returns ordinary values while retaining + completeness checks. getMapper() remains asynchronous. +

+
+                         ({ id: u.id, name: u.name }));
+const Source = read.rowSchema; // no SQL
+const toDto = mapper().configure(Source, UserDto, m => m)
+    .getSyncMapper(Source, UserDto);
+const result = (await read).map(toDto);`)
+                            }}
+                        />
+                    
+

+ Known async mappings are rejected; disguised promises or + thenables throw at invocation. Configuration never + probes callbacks. Fetching, enrichment, authorization + and union dispatch remain explicit application code. +

+ + Read the multi-file consumer guide and compatibility + rules + +
+ {/* ── Compile-time safety ─────────────────────────── */}

Compile-time completeness

diff --git a/websites/docs/app/orm/page.tsx b/websites/docs/app/orm/page.tsx index 45b1433a..610c276b 100644 --- a/websites/docs/app/orm/page.tsx +++ b/websites/docs/app/orm/page.tsx @@ -19,37 +19,6 @@ export default function OrmPage() {

-
-

Detached reads with projection schemas

-

- db.users.withRowSchema() returns an immutable read-only - query with runtime metadata matching its projection and - relation graph. Results stay detached even in a tracking - context, so partial selections cannot silently become - incomplete tracked entities. -

-
-                         ({ id: p.id, name: p.name }))
-    .include(r => r.tasks, tasks => tasks
-        .select(t => ({ title: t.title })));
-const Source = read.rowSchema; // nested task schema included
-const projects = await read; // one SQL statement`)
-                            }}
-                        />
-                    
-

- Return child queries from customizers. STI/CTI reads - expose variantRowSchemas for explicit mapper dispatch. - Ordinary entity reads and writes remain unchanged. -

- - Projection-aware consumer guide - -
- {/* ── Installation ─────────────────────────────────── */} +
+

Detached reads with projection schemas

+

+ db.users.withRowSchema() returns an immutable read-only + query with runtime metadata matching its projection and + relation graph. Results stay detached even in a tracking + context, so partial selections cannot silently become + incomplete tracked entities. +

+
+                         ({ id: p.id, name: p.name }))
+    .include(r => r.tasks, tasks => tasks
+        .select(t => ({ title: t.title })));
+const Source = read.rowSchema; // nested task schema included
+const projects = await read; // one SQL statement`)
+                            }}
+                        />
+                    
+

+ Return child queries from customizers. STI/CTI reads + expose variantRowSchemas for explicit mapper dispatch. + Ordinary entity reads and writes remain unchanged. +

+ + Projection-aware consumer guide + +
+ {/* ── Polymorphic entities ─────────────────────────── */}

Polymorphic Entities (STI / CTI)

diff --git a/websites/docs/public/llms.txt b/websites/docs/public/llms.txt index 68120c88..a43783c6 100644 --- a/websites/docs/public/llms.txt +++ b/websites/docs/public/llms.txt @@ -1,418 +1,219 @@ # Cleverbrush Framework -> A schema-first TypeScript web framework. Define schemas once — get a type-safe HTTP server, auto-typed client with resilience, OpenAPI 3.1 docs, auth, dependency injection, schema-driven forms, and object mapping. Zero codegen, zero type duplication. - -The key differentiator is **contract-first architecture**: a shared API contract (defined with `@cleverbrush/schema`) is the single source of truth for both server and client. TypeScript enforces exhaustive handler mapping at compile time — add an endpoint to the contract and forget a handler? Compilation fails. - -## Packages - -| Package | Description | Docs | -|---------|-------------|------| -| `@cleverbrush/server` | HTTP server with typed endpoints, middleware, batching, WebSocket | [/server](/server) | -| `@cleverbrush/client` | Auto-typed REST client with retry, timeout, dedup, cache, batching | [/client/getting-started](/client/getting-started) | -| `@cleverbrush/auth` | JWT, cookies, OAuth2, OIDC, policy-based authorization | [/auth](/auth) | -| `@cleverbrush/di` | Dependency injection with schema-as-key tokens | [/di](/di) | -| `@cleverbrush/server-openapi` | OpenAPI 3.1 generation (links, callbacks, webhooks, security) | [/server-openapi](/server-openapi) | -| `@cleverbrush/env` | Typed environment config with schema validation | [/env](/env) | -| `@cleverbrush/knex-schema` | Schema-aware Knex query builder (`.hasTableName()`, `.hasColumnName()`) | [/knex-schema](/knex-schema) | -| `@cleverbrush/react-form` | Headless schema-driven React forms | [/react-form](/react-form) | -| `@cleverbrush/mapper` | Schema-to-schema object mapping with compile-time completeness | [/mapper](/mapper) | -| `@cleverbrush/scheduler` | Job scheduling with worker thread isolation | [/scheduler](/scheduler) | -| `@cleverbrush/schema` | Schema validation library (see [schema.cleverbrush.com](https://schema.cleverbrush.com)) | — | - -## Projection-aware reads and synchronous mapping - -`query(knex, Schema).withRowSchema()` and `db.entities.withRowSchema()` opt into -immutable detached PostgreSQL reads. `rowSchema` matches the selected decoded -shape, including nested relations, SQL nulls, Date values and exact decimal/bigint -strings. Metadata access never executes SQL. STI/CTI readers expose -`variantRowSchemas` for explicit application discriminator dispatch. Legacy reads -are unchanged. See [/knex-schema#row-schemas](/knex-schema#row-schemas) and -[/orm#detached-read-schemas](/orm#detached-read-schemas). - -`mapper().configure(Source, Target, configure).getSyncMapper(Source, Target)` -returns a synchronous complete mapping when all final steps and nested mappings -are synchronous. Async or disguised thenables are rejected; callbacks are not -probed at configuration time. `getMapper()` remains asynchronous. Reuse schemas -and prepared mappings; do not fetch data inside pure mapping. See -[/mapper#synchronous-mapping](/mapper#synchronous-mapping). - -## Core Workflow - -### 1. Define schemas (shared) - -```typescript -import { object, string, number, array } from '@cleverbrush/schema'; - -const CreateTodoBody = object({ - title: string().minLength(1).maxLength(200), - description: string().optional(), +> Schema-first TypeScript libraries for validation, HTTP APIs, typed clients, +> database access, forms and object mapping. Libraries compose without codegen. + +Start with schemas, share a browser-safe API contract, implement its handlers on +the server, then create a client from that same contract. Database schemas and +public response schemas can differ; select and map fields explicitly. + +## Package map + +| Area | Package | Documentation | +| --- | --- | --- | +| Validation and extensions | `@cleverbrush/schema` | [Schema](https://schema.cleverbrush.com) | +| JSON Schema conversion | `@cleverbrush/schema-json` | [README](https://github.com/cleverbrush/framework/tree/development/libs/schema-json) | +| HTTP contracts and handlers | `@cleverbrush/server` | [Server](/server) | +| HTTP clients and React hooks | `@cleverbrush/client` | [Client](/client/getting-started) | +| API specifications | `@cleverbrush/server-openapi` | [OpenAPI / AsyncAPI](/server-openapi) | +| Authentication and authorization | `@cleverbrush/auth` | [Auth](/auth) | +| Dependency injection | `@cleverbrush/di` | [DI](/di) | +| Environment configuration | `@cleverbrush/env` | [Env](/env) | +| SQL queries and schema metadata | `@cleverbrush/knex-schema` | [Queries](/knex-schema) | +| Entities, relations and tracking | `@cleverbrush/orm` | [ORM](/orm) | +| Database migrations | `@cleverbrush/orm-cli` | [README](https://github.com/cleverbrush/framework/tree/development/libs/orm-cli) | +| Object transformations | `@cleverbrush/mapper` | [Mapper](/mapper) | +| Schema-driven React forms | `@cleverbrush/react-form` | [Forms](/react-form) | +| Worker-thread jobs | `@cleverbrush/scheduler` | [Scheduler](/scheduler) | + +## Core workflow + +This small example uses an in-memory collection, not persistent storage. Keep +`contracts.ts` shared; do not import server implementations into browser bundles. + +### 1. Define schemas and the shared contract + +```typescript +// contracts.ts +import { defineApi, endpoint } from '@cleverbrush/server/contract'; +import { array, boolean, number, object, string } from '@cleverbrush/schema'; + +export const Todo = object({ + id: number(), + title: string(), + completed: boolean() }); - -const Todo = object({ - id: number().integer(), - title: string(), - description: string().optional(), - completed: boolean(), +const CreateTodo = object({ title: string().minLength(1).maxLength(200) }); + +export const api = defineApi({ + todos: { + list: endpoint.get('/api/todos').responses({ 200: array(Todo) }), + create: endpoint.post('/api/todos') + .body(CreateTodo).responses({ 201: Todo }) + } }); ``` -### 2. Define the API contract (shared) +### 2. Implement the handlers ```typescript -import { defineApi, endpoint } from '@cleverbrush/server'; - -const api = defineApi({ - todos: { - list: endpoint.get('/api/todos').returns(array(Todo)), - create: endpoint.post('/api/todos').body(CreateTodoBody).returns(Todo), - update: endpoint.patch('/api/todos/:id').body(UpdateTodoBody).returns(Todo), - delete: endpoint.delete('/api/todos/:id'), - }, -}); -``` - -### 3. Server — exhaustive handler mapping - -```typescript -import { createServer, mapHandlers } from '@cleverbrush/server'; - -const server = createServer() - .useAuthentication({ defaultScheme: 'jwt', schemes: [jwtScheme({ secret })] }) - .useAuthorization() - .services(svc => configureDI(svc)) - .useBatching() - .withHealthcheck(); - -mapHandlers(server, api, { - todos: { - list: async ({ query }) => db.todos.findAll(query), - create: async ({ body }) => db.todos.insert(body), - update: async ({ params, body }) => db.todos.update(params.id, body), - delete: async ({ params }) => db.todos.delete(params.id), - // TypeScript error if any endpoint is missing - }, -}); - -server.listen(3000); -``` - -### 4. Client — typed, resilient +// todos.ts +import { ActionResult, implement } from '@cleverbrush/server'; +import type { InferType } from '@cleverbrush/schema'; +import { api, Todo } from './contracts.js'; -```typescript -import { createClient, retry, timeout, dedupe, throttlingCache, batching } from '@cleverbrush/client'; - -const client = createClient(api, { - baseUrl: 'http://localhost:3000', - getToken: () => loadToken(), - middlewares: [ - retry({ limit: 3 }), - timeout({ timeout: 10_000 }), - dedupe(), - throttlingCache({ throttle: 2000 }), - batching({ maxSize: 10 }), - ], +const rows: InferType[] = []; +let nextId = 1; +export const todosModule = implement(api).group('todos').withHandlers({ + list: () => rows, + create: ({ body }) => { + const todo = { id: nextId++, title: body.title, completed: false }; + rows.push(todo); + return ActionResult.created(todo); + } }); - -// Fully typed — autocomplete on endpoints and params -const todos = await client.todos.list(); -const newTodo = await client.todos.create({ body: { title: 'Buy milk' } }); ``` -## @cleverbrush/server - -Install: `npm install @cleverbrush/server @cleverbrush/schema` +For large APIs, export a configured scope and define each handler in its own file +using `Handler`. Compose feature modules at the +root. See the [multi-file example](https://github.com/cleverbrush/framework/blob/development/libs/server/README.md#large-apis-and-shared-error-handling). -### Endpoint builder +### 3. Register the complete implementation ```typescript -import { endpoint, route } from '@cleverbrush/server'; - -const myEndpoint = endpoint - .get('/api/users/:id') // HTTP method + path (path params auto-typed) - .query(QuerySchema) // query string schema - .body(BodySchema) // request body schema - .headers(HeadersSchema) // typed request headers - .returns(ResponseSchema) // 200 response schema - .responses({ // multi-status responses - 200: SuccessSchema, - 404: NotFoundSchema, - }) - .produces('application/json') // content type(s) - .producesFile() // binary file response - .deprecated() // OpenAPI deprecated flag - .tags('users') // OpenAPI tags - .summary('Get user by ID') // OpenAPI summary - .description('...') // OpenAPI description - .example({ ... }) // OpenAPI request example - .examples([...]) // multiple examples - .links({ ... }) // OpenAPI response links - .callbacks({ ... }) // OpenAPI callbacks (webhooks) - .security([{ bearerAuth: [] }]); // OpenAPI security schemes -``` - -### Server setup +// server.ts +import { createServer, implement } from '@cleverbrush/server'; +import { api } from './contracts.js'; +import { todosModule } from './todos.js'; -```typescript -const server = createServer() - .use(myMiddleware) // global middleware - .services(svc => { svc.addSingleton(Token, impl); }) // DI registration - .useAuthentication({ defaultScheme, schemes }) // auth middleware - .useAuthorization() // authorization middleware - .withHealthcheck() // GET /health - .useBatching(); // request batching support +const server = createServer().withHealthcheck(); +server.handleAll(implement(api).use(todosModule).complete()); +await server.listen(3000); ``` -### ActionResult helpers +`complete()` checks contract coverage. Server request validation and response +types come from the endpoint schemas. Application persistence, permissions and +business rules remain application code. -```typescript -import { ActionResult } from '@cleverbrush/server'; - -// In handlers: -return ActionResult.ok(data); // 200 -return ActionResult.created(data); // 201 -return ActionResult.noContent(); // 204 -return ActionResult.notFound(); // 404 -return ActionResult.conflict(); // 409 -return ActionResult.redirect(url); // 302 -return ActionResult.file(buffer, mime); // binary file -return ActionResult.stream(readable); // streaming response -``` - -### WebSocket subscriptions - -```typescript -const api = defineApi({ - live: { - updates: endpoint.ws('/ws/updates') - .receives(ClientMessageSchema) - .sends(ServerMessageSchema), - }, -}); -``` - -## @cleverbrush/client - -Install: `npm install @cleverbrush/client @cleverbrush/schema` - -### Client creation +### 4. Call the API from a typed client ```typescript +// client.ts import { createClient } from '@cleverbrush/client'; -// Or for React: import { createClient } from '@cleverbrush/client/react'; - -const client = createClient(api, { - baseUrl: 'http://localhost:3000', - getToken: () => localStorage.getItem('token'), - middlewares: [...], -}); -``` - -### Resilience middleware - -| Middleware | Purpose | -|-----------|---------| -| `retry({ limit, backoff, jitter })` | Retry failed requests with exponential backoff | -| `timeout({ timeout })` | Abort requests after N ms | -| `dedupe()` | Deduplicate identical concurrent GET requests | -| `throttlingCache({ throttle })` | TTL cache for GET requests | -| `batching({ maxSize, delay })` | Batch multiple requests into one HTTP call | - -### React integration - -```typescript -import { createClient } from '@cleverbrush/client/react'; - -const client = createClient(api, { baseUrl, getToken }); - -// In components: -const { data, error, loading } = client.todos.list.useQuery({ query: { page: 1 } }); -``` - -## @cleverbrush/auth - -Install: `npm install @cleverbrush/auth @cleverbrush/schema` - -```typescript -import { jwtScheme, signJwt } from '@cleverbrush/auth'; - -// Configure JWT auth scheme -const jwt = jwtScheme({ - secret: process.env.JWT_SECRET, - mapClaims: (claims) => ({ - userId: claims.sub, - role: claims.role, - }), -}); - -// Sign tokens -const token = await signJwt({ sub: user.id, role: 'admin' }, secret, { expiresIn: '1h' }); - -// Server setup -server.useAuthentication({ - defaultScheme: 'jwt', - schemes: [jwt], -}); - -// Per-endpoint authorization -endpoint.get('/admin/users') - .authorize('admin') // role-based - .authorize((principal) => principal.role === 'admin'); // policy-based -``` +import { timeout } from '@cleverbrush/client/timeout'; +import { api } from './contracts.js'; -## @cleverbrush/di - -Install: `npm install @cleverbrush/di @cleverbrush/schema` - -Uses schema builders as DI tokens — fully typed, no string keys or decorators. - -```typescript -import { any } from '@cleverbrush/schema'; - -// Define tokens -const DbToken = any().hasType(); -const LoggerToken = any().hasType(); - -// Register services -server.services(svc => { - svc.addSingleton(DbToken, () => new Database(config)); - svc.addScoped(LoggerToken, () => new Logger()); -}); - -// Resolve in handlers (injected via context) -const handler = async ({ services }) => { - const db = services.resolve(DbToken); // typed as Database - const logger = services.resolve(LoggerToken); // typed as Logger -}; -``` - -## @cleverbrush/server-openapi - -Install: `npm install @cleverbrush/server-openapi` - -```typescript -import { generateOpenApiSpec, serveAsyncApi } from '@cleverbrush/server-openapi'; - -// Generate OpenAPI 3.1 spec -const spec = generateOpenApiSpec(server, api, { - info: { title: 'My API', version: '1.0.0' }, - servers: [{ url: 'https://api.example.com' }], +export const client = createClient(api, { + baseUrl: 'http://localhost:3000', + middlewares: [timeout({ timeout: 10_000 })] }); - -// Serve at GET /openapi.json -server.get('/openapi.json', () => ActionResult.ok(spec)); - -// AsyncAPI for WebSocket endpoints -const asyncSpec = serveAsyncApi(server, api, { ... }); -``` - -Features: response links, callbacks, webhooks, response headers, security schemes, discriminated union `discriminator` mapping, tags, deprecation. - -## @cleverbrush/env - -Install: `npm install @cleverbrush/env @cleverbrush/schema` - -```typescript -import { env, parseEnv } from '@cleverbrush/env'; -import { string, number } from '@cleverbrush/schema'; - -const config = parseEnv({ - db: { - host: env('DB_HOST', string().default('localhost')), - port: env('DB_PORT', number().coerce().default(5432)), - name: env('DB_NAME', string()), - }, - jwt: { - secret: env('JWT_SECRET', string().minLength(32)), - }, - port: env('PORT', number().coerce().default(3000)), -}); -// config is fully typed: { db: { host: string; port: number; name: string }; ... } -// Throws with clear error messages if env vars are missing or invalid -``` - -## @cleverbrush/knex-schema - -Install: `npm install @cleverbrush/knex-schema @cleverbrush/schema knex` - -Schema-aware Knex query builder. Attach table/column metadata to schemas, then query with type-safe selectors. - -```typescript -import { object, string, number } from '@cleverbrush/schema'; - -// Attach DB metadata to schemas -const UserSchema = object({ - id: number().integer(), - name: string(), - email: string().email(), - createdAt: date().hasColumnName('created_at'), -}).hasTableName('users'); - -// Query with type-safe selectors -import { createQuery } from '@cleverbrush/knex-schema'; - -const db = createQuery(knex); -const users = await db(UserSchema) - .where(u => u.email, 'alice@example.com') - .orderBy(u => u.createdAt, 'desc') - .select(); -``` - -## @cleverbrush/mapper - -Install: `npm install @cleverbrush/mapper @cleverbrush/schema` - -Schema-to-schema object mapping with compile-time completeness. Unmapped target properties are TypeScript errors. - -```typescript -import { mapper } from '@cleverbrush/mapper'; - -const registry = mapper() - .configure(SourceSchema, TargetSchema, (m) => - m - .for(t => t.fullName).compute(s => `${s.firstName} ${s.lastName}`) - .for(t => t.age).from(s => s.birthYear) // auto-transform - .for(t => t.internal).ignore() - // Same-name, same-type properties are auto-mapped - ); - -const mapFn = registry.getMapper(SourceSchema, TargetSchema); -const result = await mapFn(sourceObject); -``` - -## @cleverbrush/scheduler - -Install: `npm install @cleverbrush/scheduler` - -Job scheduling with worker thread isolation, retries, and event streaming. Requires Node.js 16+. - -```typescript -import { JobScheduler } from '@cleverbrush/scheduler'; - -const scheduler = new JobScheduler({ rootFolder: './jobs' }); - -scheduler.addJob({ - id: 'cleanup', - path: 'cleanup.js', - schedule: { every: 'day', interval: 1, hour: 3, minute: 0 }, - timeout: 60_000, - maxRetries: 3, - noConcurrentRuns: true, -}); - -scheduler.on('job:end', ({ jobId }) => console.log(`${jobId} done`)); -scheduler.on('job:error', ({ jobId, error }) => console.error(jobId, error)); - -scheduler.start(); -``` - -Schedule types: `minute`, `day`, `week`, `month`, `year` — each with `interval` and time fields. - -## Links - -- [Getting Started](/getting-started): End-to-end tutorial -- [Why Cleverbrush?](/why): Problem statement and design philosophy -- [Comparisons](/comparisons): Feature matrix vs tRPC, ts-rest, Hono -- [Examples](/examples): Full-stack Todo app demo -- [Schema Library](https://schema.cleverbrush.com): Schema validation docs, playground, benchmarks -- [GitHub](https://github.com/cleverbrush/framework): Source code +const todos = await client.todos.list(); +const created = await client.todos.create({ body: { title: 'Buy milk' } }); +``` + +## Schemas and extension authoring + +Schemas are immutable. Capture the returned builder when adding properties, +validators or modifiers. `number()` validates integers by default; +`.clearIsInteger()` permits fractional values. Use `.coerce()` explicitly when +parsing strings such as query parameters. `InferType` derives the +value type. Named schemas and `schemaRef()` support composition across packages. + +Define custom methods with `defineExtension()` and apply them with +`withExtensions()`. Metadata is available from `schema.introspect().extensions`. +For metadata-only methods whose values must also survive in TypeScript, use +`defineMetadataMethod(key).argument()`, `.value(value)` or `.compute(fn)` and +`InferExtensionMetadata`. These do not alter global builder prototypes or +interpret application-specific metadata. See [schema extensions](https://github.com/cleverbrush/framework/blob/development/libs/schema/README.md#extensions). + +## HTTP APIs and supporting services + +- **Server:** endpoint builders describe request schemas, response statuses, + injection and authorization. `route()` supports schema-typed path parameters. + `implement()` binds modular handlers; `errorMap()` / `withErrors()` translate + known exceptions only into responses declared by the endpoint. `ActionResult` + supplies status-specific, file and streaming results. Unexpected errors retain + the server's Problem Details handling. [Server reference](/server). +- **Subscriptions:** use `endpoint.subscription()` with `.incoming()` and + `.outgoing()` schemas and async-generator handlers. Subscriptions participate + in implementation coverage but do not use HTTP error policies. [Subscriptions](https://github.com/cleverbrush/framework/blob/development/libs/server/README.md#websocket-subscriptions). +- **Client:** `createClient(contract, options)` infers calls from the contract. + Middleware is imported from subpaths such as `/retry`, `/timeout`, `/dedupe`, + `/cache` and `/batching`. Authentication, retry and cache policy must match the + application. The `/react` client adds TanStack Query hooks including + `.useQuery()` and `.useMutation()`; query state uses `isLoading`. + `decodeValidationIssues()` extracts structured request-validation issues. + [Client reference](/client/getting-started). +- **OpenAPI / AsyncAPI:** configure `serveOpenApi({ server, info })` or + `serveAsyncApi({ server, info })` as middleware before listening. For generation + without middleware, pass registration metadata to `generateOpenApiSpec()` or + `generateAsyncApiSpec()`. Named schemas become reusable components. + [Specification generation](/server-openapi). +- **Authentication:** configure authentication schemes and authorization policies + on the server; declare endpoint principal requirements with `.authorize()`. + JWT, cookies, OAuth2 and OIDC are supported. Keep signing keys and server-only + configuration out of shared contracts. [Authentication](/auth). +- **Dependency injection:** schemas act as typed service tokens. Register values + or factories with singleton/scoped/transient lifetimes. Endpoint `.inject()` + declares dependencies supplied as the handler's second argument. + [Dependency injection](/di). +- **Environment:** `env(name, schema)` binds leaves in a nested configuration; + `parseEnv()` validates and resolves it. `parseEnvFlat()` supports flat configs. + Use explicit coercion and `envBoolean()` for environment boolean conventions. + [Environment configuration](/env). + +## Database queries, entities and result mapping + +Import database-capable schema factories from `@cleverbrush/knex-schema` or +`@cleverbrush/orm`, not plain `@cleverbrush/schema`. Table and column metadata +belong to these packages. Knex is a peer dependency; PostgreSQL also needs `pg`. + +- **Queries:** `query(knex, schema)` / `createQuery(knex)` provide typed selectors, + CRUD, scopes, named projections, eager loading and transactions. Aliases express + flat joins; aggregate expressions support summaries and explicit output schemas. + Composite cursors require a deterministic, non-null sort with a unique + tie-breaker. [Query guide](/knex-schema). +- **ORM:** `defineEntity(schema)` declares relations; `createDb(knex, entities)` + exposes typed DbSets. Ordinary entity queries support identity tracking, + change persistence, optimistic concurrency and STI/CTI variants. Use + `@cleverbrush/orm-cli` for migrations. [ORM guide](/orm). +- **Projection-aware reads:** enter `.withRowSchema()` before selecting or + including. It returns an immutable, read-only query. `rowSchema` describes the + decoded selection, not the full table, and accessing it never executes SQL. + Results are detached even in tracking contexts. SQL nulls stay `null`, dates + decode to `Date` throughout nested graphs, and declared decimal/bigint columns + retain exact strings. Input defaults and preprocessors are not replayed. + [Read schemas](/knex-schema#row-schemas), [detached ORM reads](/orm#detached-read-schemas). +- **Nested and polymorphic reads:** child customizers return their configured + queries. Nested includes execute in one SQL statement. STI/CTI readers expose + a union `rowSchema` and per-variant `variantRowSchemas`; DTO selection and + discriminator dispatch remain explicit application code. +- **Mapping:** `mapper().configure(Source, Target, configure)` checks that every + target property is mapped, auto-mapped or ignored. `.from()` copies values; + `.compute()` transforms them. `getMapper()` returns an asynchronous function. + `getSyncMapper()` returns ordinary values when all final steps and nested + mappings are synchronous; known async mappings are rejected and disguised + thenables throw when invoked. Configuration does not probe callbacks. Reuse + schema instances and configured mappings; the registry uses schema identity. + Mapping does not fetch data or authorize access. [Mapper guide](/mapper), + [synchronous mapping](/mapper#synchronous-mapping). + +For separate query, mapping and service files, storage representation rules and +supported read operations, see the [complete query README](https://github.com/cleverbrush/framework/blob/development/libs/knex-schema/README.md#projection-aware-reads). + +## Forms and background work + +- **React Form:** schema-driven fields, validation and submission state. + Structured `FormIssue` values carry server validation errors to nested fields; + application business errors require explicit paths. [Forms](/react-form). +- **Scheduler:** `JobScheduler` runs configured jobs in worker threads with + scheduling, retry, timeout and lifecycle events. Configure job files and + timezone explicitly. [Scheduler](/scheduler). + +## Further reading + +- [Getting Started](/getting-started): full-stack tutorial +- [Examples](/examples): Todo application +- [Why Cleverbrush?](/why): design goals +- [Schema library](https://schema.cleverbrush.com): validation and playground +- [GitHub](https://github.com/cleverbrush/framework): source and tests diff --git a/websites/schema/app/mapper/page.tsx b/websites/schema/app/mapper/page.tsx index 36cce506..b2d75974 100644 --- a/websites/schema/app/mapper/page.tsx +++ b/websites/schema/app/mapper/page.tsx @@ -17,42 +17,6 @@ export default function MapperPage() {

-
-

Synchronous mapping

-

- Use the existing configure() chain, then - getSyncMapper(Source, Target) for pure synchronous - mappings. Completeness and nested-mapping checks remain. - Async computations are rejected, and a disguised - promise/thenable throws when invoked. getMapper() keeps - its async behavior. -

-

- Opt-in Framework database reads expose projection-aware - rowSchema metadata, so source schemas need not be copied - by hand. Reuse schema instances and configure once; - fetching and domain conversions remain - application-owned. -

- - Query mapping examples and consumer guide - -
- - - {/* ── Installation ─────────────────────────────────── */} +
+

Synchronous mapping

+

+ Use the existing configure() chain, then + getSyncMapper(Source, Target) for pure synchronous + mappings. Completeness and nested-mapping checks remain. + Async computations are rejected, and a disguised + promise/thenable throws when invoked. getMapper() keeps + its async behavior. +

+

+ Opt-in Framework database reads expose projection-aware + rowSchema metadata, so source schemas need not be copied + by hand. Reuse schema instances and configure once; + fetching and domain conversions remain + application-owned. +

+ + Query mapping examples and consumer guide + +
+ + + {/* ── API Reference ────────────────────────────────── */}

API Reference

diff --git a/websites/schema/app/playground/schemaDeclarations.ts b/websites/schema/app/playground/schemaDeclarations.ts index d94e918d..11108581 100644 --- a/websites/schema/app/playground/schemaDeclarations.ts +++ b/websites/schema/app/playground/schemaDeclarations.ts @@ -25,6 +25,15 @@ type AnySchemaBuilderCreateProps = Partial extends SchemaBuilder { #private; + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + readonly __cleverbrush_builder_type__: readonly [ + 'any', + TRequired, + TNullable, + TExplicitType, + THasDefault, + TResult + ]; /** * @hidden */ @@ -167,6 +176,16 @@ type ArraySchemaBuilderCreateProps, TRequired extends boolean = true, TNullable extends boolean = false, TExplicitType = undefined, THasDefault extends boolean = false, TExtensions = {}, TResult = TExplicitType extends undefined ? TElementSchema extends undefined ? Array : TElementSchema extends SchemaBuilder ? Array>> : never : TExplicitType> extends SchemaBuilder { #private; + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + readonly __cleverbrush_builder_type__: readonly [ + 'array', + TElementSchema, + TRequired, + TNullable, + TExplicitType, + THasDefault, + TResult + ]; /** * @hidden */ @@ -271,6 +290,7 @@ export declare class ArraySchemaBuilder TResult) | undefined; description: string | undefined; schemaName: string | undefined; + referenceTarget: SchemaBuilder | undefined; hasCatch: boolean; catchValue: TResult | (() => TResult) | undefined; example: unknown; @@ -372,6 +392,16 @@ type BooleanSchemaBuilderCreateProps = Partial extends SchemaBuilder { #private; + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + readonly __cleverbrush_builder_type__: readonly [ + 'boolean', + TResult, + TRequired, + TNullable, + TExplicitType, + THasDefault, + TFinalResult + ]; /** * @hidden */ @@ -401,6 +431,7 @@ export declare class BooleanSchemaBuilder TFinalResult) | undefined; description: string | undefined; schemaName: string | undefined; + referenceTarget: SchemaBuilder | undefined; hasCatch: boolean; catchValue: TFinalResult | (() => TFinalResult) | undefined; example: unknown; @@ -544,6 +575,14 @@ type DateSchemaBuilderCreateProps = Partial< */ export declare class DateSchemaBuilder extends SchemaBuilder { #private; + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + readonly __cleverbrush_builder_type__: readonly [ + 'date', + TResult, + TRequired, + TNullable, + THasDefault + ]; /** * @hidden */ @@ -625,6 +664,7 @@ export declare class DateSchemaBuilder TResult) | undefined; description: string | undefined; schemaName: string | undefined; + referenceTarget: SchemaBuilder | undefined; hasCatch: boolean; catchValue: TResult | (() => TResult) | undefined; example: unknown; @@ -908,6 +948,7 @@ export declare class ExternSchemaBuilder TResult) | undefined; description: string | undefined; schemaName: string | undefined; + referenceTarget: SchemaBuilder | undefined; hasCatch: boolean; catchValue: TResult | (() => TResult) | undefined; example: unknown; @@ -1053,6 +1094,17 @@ type InferParameters[]> = */ export declare class FunctionSchemaBuilder[] = [], TReturnTypeSchema extends SchemaBuilder | undefined = undefined, TResult = TExplicitType extends undefined ? (...args: TParameters extends [] ? any[] : InferParameters) => TReturnTypeSchema extends SchemaBuilder ? InferType : any : TExplicitType> extends SchemaBuilder { #private; + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + readonly __cleverbrush_builder_type__: readonly [ + 'func', + TRequired, + TNullable, + TExplicitType, + THasDefault, + TParameters, + TReturnTypeSchema, + TResult + ]; /** * @hidden */ @@ -1109,6 +1161,7 @@ export declare class FunctionSchemaBuilder TResult) | undefined; description: string | undefined; schemaName: string | undefined; + referenceTarget: SchemaBuilder | undefined; hasCatch: boolean; catchValue: TResult | (() => TResult) | undefined; example: unknown; @@ -1339,6 +1392,16 @@ type GenericSchemaBuilderCreateProps = Partial */ export declare class GenericSchemaBuilder SchemaBuilder, TRequired extends boolean = true, TNullable extends boolean = false, TExplicitType = undefined, THasDefault extends boolean = false, TExtensions = {}, TResult = TExplicitType extends undefined ? ReturnType extends SchemaBuilder ? R : any : TExplicitType> extends SchemaBuilder { #private; + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + readonly __cleverbrush_builder_type__: readonly [ + 'generic', + TFn, + TRequired, + TNullable, + TExplicitType, + THasDefault, + TResult + ]; /** * Applies the template function with concrete schema arguments, returning * a fully typed concrete schema builder. TypeScript infers the result type @@ -1404,6 +1467,7 @@ export declare class GenericSchemaBuilder Schema defaultValue: TResult | (() => TResult) | undefined; description: string | undefined; schemaName: string | undefined; + referenceTarget: SchemaBuilder | undefined; hasCatch: boolean; catchValue: TResult | (() => TResult) | undefined; example: unknown; @@ -1573,6 +1637,7 @@ export declare class IntersectionSchemaBuilder : TExplicitType) | (() => TExplicitType extends undefined ? SchemaIntersection : TExplicitType) | undefined; description: string | undefined; schemaName: string | undefined; + referenceTarget: SchemaBuilder | undefined; hasCatch: boolean; catchValue: (TExplicitType extends undefined ? SchemaIntersection : TExplicitType) | (() => TExplicitType extends undefined ? SchemaIntersection : TExplicitType) | undefined; example: unknown; @@ -1741,6 +1806,7 @@ export declare class LazySchemaBuilder TResult) | undefined; description: string | undefined; schemaName: string | undefined; + referenceTarget: SchemaBuilder | undefined; hasCatch: boolean; catchValue: TResult | (() => TResult) | undefined; example: unknown; @@ -2044,6 +2110,14 @@ type NumberSchemaBuilderCreateProps = Part */ export declare class NumberSchemaBuilder extends SchemaBuilder { #private; + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + readonly __cleverbrush_builder_type__: readonly [ + 'number', + TResult, + TRequired, + TNullable, + THasDefault + ]; /** * @hidden */ @@ -2123,6 +2197,7 @@ export declare class NumberSchemaBuilder TResult) | undefined; description: string | undefined; schemaName: string | undefined; + referenceTarget: SchemaBuilder | undefined; hasCatch: boolean; catchValue: TResult | (() => TResult) | undefined; example: unknown; @@ -2523,6 +2598,16 @@ export type ObjectSchemaValidationResult> = {}, TRequired extends boolean = true, TNullable extends boolean = false, TExplicitType = undefined, THasDefault extends boolean = false, TExtensions = {}, TConstructorSchemas extends SchemaBuilder[] = []> extends SchemaBuilder> : TExplicitType, TRequired, TNullable, THasDefault, TExtensions> { #private; + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + readonly __cleverbrush_builder_type__: readonly [ + 'object', + TProperties, + TRequired, + TNullable, + TExplicitType, + THasDefault, + TConstructorSchemas + ]; /** Marks this builder as having sub-properties for descriptor tree recursion. */ readonly [SYMBOL_HAS_PROPERTIES] = true; /** @@ -2564,6 +2649,7 @@ export declare class ObjectSchemaBuilder> : TExplicitType) | (() => undefined extends TExplicitType ? WithConstructors> : TExplicitType) | undefined; description: string | undefined; schemaName: string | undefined; + referenceTarget: SchemaBuilder | undefined; hasCatch: boolean; catchValue: (undefined extends TExplicitType ? WithConstructors> : TExplicitType) | (() => undefined extends TExplicitType ? WithConstructors> : TExplicitType) | undefined; example: unknown; @@ -3120,6 +3206,7 @@ export declare class ParseStringSchemaBuilder TResult) | undefined; description: string | undefined; schemaName: string | undefined; + referenceTarget: SchemaBuilder | undefined; hasCatch: boolean; catchValue: TResult | (() => TResult) | undefined; example: unknown; @@ -3290,6 +3377,16 @@ type PromiseSchemaBuilderCreateProps = Partial | undefined = undefined, TResult = TExplicitType extends undefined ? TResolvedTypeSchema extends SchemaBuilder ? Promise> : Promise : TExplicitType> extends SchemaBuilder { #private; + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + readonly __cleverbrush_builder_type__: readonly [ + 'promise', + TRequired, + TNullable, + TExplicitType, + THasDefault, + TResolvedTypeSchema, + TResult + ]; /** * @hidden */ @@ -3337,6 +3434,7 @@ export declare class PromiseSchemaBuilder TResult) | undefined; description: string | undefined; schemaName: string | undefined; + referenceTarget: SchemaBuilder | undefined; hasCatch: boolean; catchValue: TResult | (() => TResult) | undefined; example: unknown; @@ -3716,6 +3814,17 @@ type RecordSchemaBuilderCreateProps, TValueSchema extends SchemaBuilder, TRequired extends boolean = true, TNullable extends boolean = false, TExplicitType = undefined, THasDefault extends boolean = false, TExtensions = {}, TResult = TExplicitType extends undefined ? Record, InferType> : TExplicitType> extends SchemaBuilder { #private; + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + readonly __cleverbrush_builder_type__: readonly [ + 'record', + TKeySchema, + TValueSchema, + TRequired, + TNullable, + TExplicitType, + THasDefault, + TResult + ]; /** * @hidden */ @@ -3781,6 +3890,7 @@ export declare class RecordSchemaBuilder TResult) | undefined; description: string | undefined; schemaName: string | undefined; + referenceTarget: SchemaBuilder | undefined; hasCatch: boolean; catchValue: TResult | (() => TResult) | undefined; example: unknown; @@ -4066,6 +4176,8 @@ export type SchemaBuilderProps = { hasCatch?: boolean; description?: string; schemaName?: string; + /** @internal Canonical named definition for a use-site-only derivative. */ + referenceTarget?: SchemaBuilder; example?: unknown; }; export type ValidationContext = SchemaBuilder> = { @@ -4278,8 +4390,18 @@ export type PropertyDescriptor, TRootSchema extends ObjectSchemaBuilder = TSchema, TAssignableTo = any, TParentPropertyDescriptor = undefined> = PropertyDescriptor & (TSchema extends ObjectSchemaBuilder ? { - [K in keyof TProperties]: TProperties[K] extends ObjectSchemaBuilder ? PropertyDescriptorTree> : TProperties[K] extends ExternSchemaBuilder ? PropertyDescriptor, K & string> & ExternOutputPropertyDescriptors, K & string>> : TProperties[K] extends ArraySchemaBuilder ? TArrayElement extends ObjectSchemaBuilder ? PropertyDescriptor, K & string> : InferType extends TAssignableTo ? PropertyDescriptor, K & string> : never : InferType extends TAssignableTo ? PropertyDescriptor, K & string> : never; + [K in keyof TProperties]: TProperties[K] extends ObjectSchemaBuilder ? PropertyDescriptorTree> : TProperties[K] extends ExternSchemaBuilder ? PropertyDescriptor, K & string> & ExternOutputPropertyDescriptors, K & string>> : TProperties[K] extends ArraySchemaBuilder ? TArrayElement extends ObjectSchemaBuilder ? IndexedPropertyDescriptor, K & string> : InferType extends TAssignableTo ? IndexedPropertyDescriptor, K & string> : never : InferType extends TAssignableTo ? PropertyDescriptor, K & string> : never; } : never); +/** + * A descriptor that preserves its array binding and exposes lazy indexed child + * descriptors. Indices are non-negative integers; they are positions, not item + * identities. Object and nested-array elements retain their schema types. + * + * @example \`object.getPropertiesFor(schema).addresses[0].city\` + */ +export type IndexedPropertyDescriptor, TSchema, TParent, TKey extends string = string> = PropertyDescriptor & (TSchema extends ObjectSchemaBuilder ? PropertyDescriptorTree : TSchema extends ArraySchemaBuilder ? { + readonly [index: number]: IndexedPropertyDescriptor>; +} : {}); /** * Recursively maps the keys of an extern schema's output type into * property descriptors. When a value is a plain-object type its keys @@ -4340,13 +4462,13 @@ export declare abstract class SchemaBuilder\` format: * - Success: \`{ value: }\` * - Failure: \`{ issues: [{ message: string }, …] }\` @@ -4400,6 +4522,17 @@ export declare abstract class SchemaBuilder | undefined; /** * Whether a catch/fallback value has been set on this schema via \`.catch()\`. */ @@ -4635,7 +4776,10 @@ export declare abstract class SchemaBuilder TResult)): this; + catch(value: ResolvedSchemaType | (() => ResolvedSchemaType)): this; /** * Removes the default value set by a previous call to \`.default()\`. */ @@ -4719,6 +4863,15 @@ export declare abstract class SchemaBuilder, options?: { + addPreprocessor(preprocessor: (object: TResult) => ResolvedSchemaType | Promise>, options?: { mutates?: boolean; }): this; /** @@ -4973,6 +5132,14 @@ type StringSchemaBuilderCreateProps = Part */ export declare class StringSchemaBuilder extends SchemaBuilder { #private; + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + readonly __cleverbrush_builder_type__: readonly [ + 'string', + TResult, + TRequired, + TNullable, + THasDefault + ]; /** * @hidden */ @@ -5053,6 +5220,7 @@ export declare class StringSchemaBuilder TResult) | undefined; description: string | undefined; schemaName: string | undefined; + referenceTarget: SchemaBuilder | undefined; hasCatch: boolean; catchValue: TResult | (() => TResult) | undefined; example: unknown; @@ -5297,6 +5465,17 @@ export declare class TupleSchemaBuilder; } : TExplicitType> extends SchemaBuilder { #private; + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + readonly __cleverbrush_builder_type__: readonly [ + 'tuple', + TElements, + TRequired, + TNullable, + TExplicitType, + THasDefault, + TRestSchema, + TResult + ]; /** * @hidden */ @@ -5381,6 +5560,7 @@ export declare class TupleSchemaBuilder TResult) | undefined; description: string | undefined; schemaName: string | undefined; + referenceTarget: SchemaBuilder | undefined; hasCatch: boolean; catchValue: TResult | (() => TResult) | undefined; example: unknown; @@ -5553,6 +5733,15 @@ type TakeExceptIndex[], TRequired extends boolean = true, TNullable extends boolean = false, TExplicitType = undefined, THasDefault extends boolean = false, TExtensions = {}> extends SchemaBuilder : TExplicitType, TRequired, TNullable, THasDefault, TExtensions> { #private; + /** Native type parameters for extension rebinding; never emitted at runtime. @internal */ + readonly __cleverbrush_builder_type__: readonly [ + 'union', + TOptions, + TRequired, + TNullable, + TExplicitType, + THasDefault + ]; /** * @hidden */ @@ -5583,6 +5772,7 @@ export declare class UnionSchemaBuilder : TExplicitType) | (() => TExplicitType extends undefined ? SchemaArrayToUnion : TExplicitType) | undefined; description: string | undefined; schemaName: string | undefined; + referenceTarget: SchemaBuilder | undefined; hasCatch: boolean; catchValue: (TExplicitType extends undefined ? SchemaArrayToUnion : TExplicitType) | (() => TExplicitType extends undefined ? SchemaArrayToUnion : TExplicitType) | undefined; example: unknown; @@ -5717,15 +5907,15 @@ export { ParseStringSchemaBuilder, parseString } from './builders/ParseStringSch export { PromiseSchemaBuilder, promise } from './builders/PromiseSchemaBuilder.js'; export type { RecordSchemaValidationResult } from './builders/RecordSchemaBuilder.js'; export { RecordSchemaBuilder, record } from './builders/RecordSchemaBuilder.js'; -export type { NestedValidationResult, PropertyDescriptor, PropertyDescriptorInner, PropertyDescriptorTree, PropertySetterOptions, ValidationErrorMessageProvider } from './builders/SchemaBuilder.js'; +export type { IndexedPropertyDescriptor, NestedValidationResult, PropertyDescriptor, PropertyDescriptorInner, PropertyDescriptorTree, PropertySetterOptions, ValidationErrorMessageProvider } from './builders/SchemaBuilder.js'; export { BRAND, Brand, InferType, MakeOptional, SchemaBuilder, SchemaTypeBrand, SchemaValidationError, SYMBOL_HAS_PROPERTIES, SYMBOL_SCHEMA_PROPERTY_DESCRIPTOR, ValidationError, ValidationResult } from './builders/SchemaBuilder.js'; export { StringSchemaBuilder, string } from './builders/StringSchemaBuilder.js'; export type { TupleElementValidationResults, TupleSchemaValidationResult } from './builders/TupleSchemaBuilder.js'; export { TupleSchemaBuilder, tuple } from './builders/TupleSchemaBuilder.js'; export type { OptionValidationResults, UnionSchemaValidationResult } from './builders/UnionSchemaBuilder.js'; export { UnionSchemaBuilder, union } from './builders/UnionSchemaBuilder.js'; -export type { CleanExtended, ExtensionConfig, ExtensionDescriptor, ExtraTypeBrandSymbol, FixedMethods, HiddenExtensionMethods, MethodLiteralBrandSymbol } from './extension.js'; -export { defineExtension, EXTRA_TYPE_BRAND, METHOD_LITERAL_BRAND, withExtensions } from './extension.js'; +export type { CleanExtended, ExtensionConfig, ExtensionDescriptor, ExtraProperties, ExtraTypeBrandSymbol, FixedMethods, HiddenExtensionMethods, InferExtensionMetadata, MetadataExtended, MetadataMethod, MetadataMethodBuilder, MetadataMethods, MetadataState, MethodLiteralBrandSymbol } from './extension.js'; +export { defineExtension, defineMetadataMethod, EXTRA_TYPE_BRAND, METHOD_LITERAL_BRAND, withExtensions } from './extension.js'; `, "file:///node_modules/@cleverbrush/schema/extension.d.ts": `/** * @module extension @@ -5805,6 +5995,9 @@ import type { PropertyDescriptorTree, SchemaBuilder } from './builders/SchemaBui import { StringSchemaBuilder } from './builders/StringSchemaBuilder.js'; import { TupleSchemaBuilder } from './builders/TupleSchemaBuilder.js'; import { UnionSchemaBuilder } from './builders/UnionSchemaBuilder.js'; +import type { MetadataExtended } from './metadata-extension.js'; +export type { ExtraProperties, InferExtensionMetadata, MetadataExtended, MetadataMethod, MetadataMethodBuilder, MetadataMethods, MetadataState } from './metadata-extension.js'; +export { defineMetadataMethod } from './metadata-extension.js'; /** * Maps each builder type name to the corresponding generic builder class. * @@ -6008,7 +6201,7 @@ export type FixedMethods = TBuilder & FixedMethods & HiddenExtensionMethods; +export type CleanExtended = MetadataExtended; type ExtendedStringFactory = { (): CleanExtended, TExt>; (equals: T): CleanExtended, TExt>; @@ -7283,6 +7476,203 @@ export type { TupleElementValidationResults, TupleSchemaValidationResult } from export { TupleSchemaBuilder } from './builders/TupleSchemaBuilder.js'; export * from './core.js'; export { type ArrayBuiltinExtensions, any, array, arrayExtensions, boolean, date, type ExtendedAny, type ExtendedArray, type ExtendedBoolean, type ExtendedDate, type ExtendedFunc, type ExtendedNumber, type ExtendedObject, type ExtendedPromise, type ExtendedRecord, type ExtendedString, type ExtendedTuple, type ExtendedUnion, enumOf, func, type NumberBuiltinExtensions, type NumberOneOfExtension, number, numberExtensions, object, promise, record, type StringBuiltinExtensions, type StringOneOfExtension, string, stringExtensions, tuple, union } from './extensions/index.js'; +`, + "file:///node_modules/@cleverbrush/schema/metadata-extension.d.ts": `import type { AnySchemaBuilder } from './builders/AnySchemaBuilder.js'; +import type { ArraySchemaBuilder } from './builders/ArraySchemaBuilder.js'; +import type { BooleanSchemaBuilder } from './builders/BooleanSchemaBuilder.js'; +import type { DateSchemaBuilder } from './builders/DateSchemaBuilder.js'; +import type { FunctionSchemaBuilder } from './builders/FunctionSchemaBuilder.js'; +import type { GenericSchemaBuilder } from './builders/GenericSchemaBuilder.js'; +import type { NumberSchemaBuilder } from './builders/NumberSchemaBuilder.js'; +import type { ObjectSchemaBuilder } from './builders/ObjectSchemaBuilder.js'; +import type { PromiseSchemaBuilder } from './builders/PromiseSchemaBuilder.js'; +import type { RecordSchemaBuilder } from './builders/RecordSchemaBuilder.js'; +import type { PropertyDescriptorTree, SchemaBuilder } from './builders/SchemaBuilder.js'; +import type { StringSchemaBuilder } from './builders/StringSchemaBuilder.js'; +import type { TupleSchemaBuilder } from './builders/TupleSchemaBuilder.js'; +import type { UnionSchemaBuilder } from './builders/UnionSchemaBuilder.js'; +import type { EXTRA_TYPE_BRAND, HiddenExtensionMethods, METHOD_LITERAL_BRAND } from './extension.js'; +/** @internal Metadata helpers own their key, including explicitly undefined values. */ +export declare function isMetadataMethod(method: Function): boolean; +/** Metadata recorded by typed extension methods; unannotated builders yield \`{}\`. */ +export type InferExtensionMetadata = S extends { + readonly __cleverbrush_extension_metadata__: infer M; +} ? M : {}; +/** @internal Description carried on a metadata method's type, not on schemas. */ +export type MetadataMethod = ((this: SchemaBuilder, ...args: A) => SchemaBuilder) & { + readonly __cleverbrush_metadata_method__: { + key: K; + value: V; + mode: Mode; + }; +}; +/** Defines the source of a typed metadata value for an extension method. */ +export interface MetadataMethodBuilder { + /** Store the caller's argument, retaining its literal type. */ + argument(): MetadataMethod; + /** Create a zero-argument method that stores a fixed value. */ + value(value: TValue): MetadataMethod; + /** Compute metadata from typed arguments; inference uses the callback's return type. */ + compute(compute: (...args: TArgs) => TValue): MetadataMethod; +} +/** + * Define an immutable metadata-only method for use inside \`defineExtension()\`. + * + * Unlike ordinary extension methods, its stored value is also available through + * \`InferExtensionMetadata\`. Repeated writes replace the value for that key. + * The method does not validate input or change the schema's inferred value type. + * Methods are installed only on factories returned by \`withExtensions()\`. + * + * @param key - Runtime introspection key, independent of the fluent method name. + * @example + * \`\`\`ts + * const labels = defineExtension({ + * string: { + * label: defineMetadataMethod('label').argument(), + * internal: defineMetadataMethod('visibility').value('internal') + * } + * }); + * const s = withExtensions(labels).string().label('Title').optional(); + * type Label = InferExtensionMetadata['label']; // 'Title' + * \`\`\` + */ +export declare function defineMetadataMethod(key: K): MetadataMethodBuilder; +/** @internal Rebuild a native builder with new extension state, preserving its value flags. */ +type WithExtensions = S extends { + readonly __cleverbrush_builder_type__: infer P; +} ? P extends readonly [ + 'number', + infer T, + infer R extends boolean, + infer N extends boolean, + infer D extends boolean +] ? NumberSchemaBuilder : P extends readonly [ + 'string', + infer T, + infer R extends boolean, + infer N extends boolean, + infer D extends boolean +] ? StringSchemaBuilder : P extends readonly [ + 'date', + infer T, + infer R extends boolean, + infer N extends boolean, + infer D extends boolean +] ? DateSchemaBuilder : P extends readonly [ + 'object', + infer P extends Record>, + infer R extends boolean, + infer N extends boolean, + infer T, + infer D extends boolean, + infer C extends SchemaBuilder[] +] ? ObjectSchemaBuilder : P extends readonly [ + 'array', + infer P extends SchemaBuilder, + infer R extends boolean, + infer N extends boolean, + infer T, + infer D extends boolean, + infer V +] ? ArraySchemaBuilder : P extends readonly [ + 'boolean', + infer T, + infer R extends boolean, + infer N extends boolean, + infer X, + infer D extends boolean, + infer V +] ? BooleanSchemaBuilder : P extends readonly [ + 'tuple', + infer P extends readonly SchemaBuilder[], + infer R extends boolean, + infer N extends boolean, + infer T, + infer D extends boolean, + infer Rest extends SchemaBuilder | undefined, + infer V +] ? TupleSchemaBuilder : P extends readonly [ + 'record', + infer K extends StringSchemaBuilder, + infer P extends SchemaBuilder, + infer R extends boolean, + infer N extends boolean, + infer T, + infer D extends boolean, + infer V +] ? RecordSchemaBuilder : P extends readonly [ + 'union', + infer P extends readonly SchemaBuilder[], + infer R extends boolean, + infer N extends boolean, + infer T, + infer D extends boolean +] ? UnionSchemaBuilder : P extends readonly [ + 'func', + infer R extends boolean, + infer N extends boolean, + infer T, + infer D extends boolean, + infer P extends SchemaBuilder[], + infer Return extends SchemaBuilder | undefined, + infer V +] ? FunctionSchemaBuilder : P extends readonly [ + 'promise', + infer R extends boolean, + infer N extends boolean, + infer T, + infer D extends boolean, + infer P extends SchemaBuilder | undefined, + infer V +] ? PromiseSchemaBuilder : P extends readonly [ + 'generic', + infer F extends (...args: any[]) => SchemaBuilder, + infer R extends boolean, + infer N extends boolean, + infer T, + infer D extends boolean, + infer V +] ? GenericSchemaBuilder : P extends readonly [ + 'any', + infer R extends boolean, + infer N extends boolean, + infer T, + infer D extends boolean, + infer V +] ? AnySchemaBuilder : never : never; +/** @internal Named declaration support for metadata-aware fluent builders. */ +export type MetadataState = MetadataMethods & HiddenExtensionMethods & Extras & { + readonly __cleverbrush_extension_metadata__: Metadata; +}; +/** @internal A metadata-aware factory result; state survives native builder modifiers. */ +export type MetadataExtended> = WithExtensions> & MetadataState; +/** @internal Preserve author-defined type brands without intersecting stale metadata or methods. */ +export type ExtraProperties = Pick | keyof Methods | '__cleverbrush_extension_metadata__'>>; +type ExtraTypes = S extends { + readonly [EXTRA_TYPE_BRAND]?: infer T; +} ? T : {}; +type LiteralNames = S extends { + readonly [METHOD_LITERAL_BRAND]?: infer T; +} ? T : never; +type WithBrand = MetadataExtended, Omit, K> & { + readonly [P in K]?: V; +}>; +type SetMetadata = MetadataExtended, K> & Record>; +/** Describe fields without recursively inspecting the receiver's fluent methods. */ +type MetadataPropertyTree = S extends { + readonly __cleverbrush_builder_type__: readonly [ + 'object', + infer P extends Record>, + ...unknown[] + ]; +} ? PropertyDescriptorTree, ObjectSchemaBuilder

> : never; +/** @internal Named declaration support for extension method signatures. */ +export type MetadataMethods = { + [M in keyof Methods]: Methods[M] extends MetadataMethod ? Mode extends 'argument' ? (this: S, value: Value) => SetMetadata : (this: S, ...args: A) => SetMetadata : Methods[M] extends (this: any, ...args: infer A) => infer R ? typeof EXTRA_TYPE_BRAND extends keyof R ? (this: S, name: Name, ...columns: ReadonlyArray) => any)>) => WithBrand & Record> : typeof METHOD_LITERAL_BRAND extends keyof R ? (this: S, name: Name, ...rest: A extends [any, ...infer Rest] ? Rest : []) => WithBrand | Name> : (this: S, ...args: A) => S : Methods[M]; +}; +export {}; `, "file:///node_modules/@cleverbrush/schema/utils/transaction.d.ts": `/** * Options for customizing transaction behavior.