From 4a41c6168241b528563761963e08342b0bc481f7 Mon Sep 17 00:00:00 2001 From: Dimitri Anoudis Date: Mon, 12 Aug 2024 13:08:48 +0100 Subject: [PATCH] DOC-215(tanstack-query): It adds the Tanstack Query --- tanstack-query/.eslintrc.cjs | 18 ++++++++ tanstack-query/README.md | 34 ++++++++++++++ tanstack-query/bun.lockb | Bin 0 -> 99656 bytes tanstack-query/index.html | 13 ++++++ tanstack-query/package.json | 31 +++++++++++++ tanstack-query/public/vite.svg | 1 + tanstack-query/src/App.css | 6 +++ tanstack-query/src/App.tsx | 68 ++++++++++++++++++++++++++++ tanstack-query/src/assets/react.svg | 1 + tanstack-query/src/db.ts | 47 +++++++++++++++++++ tanstack-query/src/index.css | 68 ++++++++++++++++++++++++++++ tanstack-query/src/main.tsx | 17 +++++++ tanstack-query/src/vite-env.d.ts | 1 + tanstack-query/tsconfig.app.json | 27 +++++++++++ tanstack-query/tsconfig.json | 11 +++++ tanstack-query/tsconfig.node.json | 13 ++++++ tanstack-query/vite.config.ts | 7 +++ 17 files changed, 363 insertions(+) create mode 100644 tanstack-query/.eslintrc.cjs create mode 100644 tanstack-query/README.md create mode 100755 tanstack-query/bun.lockb create mode 100644 tanstack-query/index.html create mode 100644 tanstack-query/package.json create mode 100644 tanstack-query/public/vite.svg create mode 100644 tanstack-query/src/App.css create mode 100644 tanstack-query/src/App.tsx create mode 100644 tanstack-query/src/assets/react.svg create mode 100644 tanstack-query/src/db.ts create mode 100644 tanstack-query/src/index.css create mode 100644 tanstack-query/src/main.tsx create mode 100644 tanstack-query/src/vite-env.d.ts create mode 100644 tanstack-query/tsconfig.app.json create mode 100644 tanstack-query/tsconfig.json create mode 100644 tanstack-query/tsconfig.node.json create mode 100644 tanstack-query/vite.config.ts diff --git a/tanstack-query/.eslintrc.cjs b/tanstack-query/.eslintrc.cjs new file mode 100644 index 0000000..d6c9537 --- /dev/null +++ b/tanstack-query/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/tanstack-query/README.md b/tanstack-query/README.md new file mode 100644 index 0000000..8993943 --- /dev/null +++ b/tanstack-query/README.md @@ -0,0 +1,34 @@ +# How to Use SurrealDB with Tanstack Query + +This tutorial will guide you through the steps to integrate SurrealDB with a React application using Tanstack Query (formerly React Query). We'll cover setting up the database, fetching data, and displaying it in a React component. + +## Prerequisites + +- Node.js and npm installed +- Basic knowledge of React and TypeScript +- SurrealDB installed + +## Step 1: Setting Up SurrealDB + +First, ensure that SurrealDB is installed and running. + +```bash +surreal start --user root --pass root +``` + +## Step 2: Create the React Application + +Create a new React application using Create React App with TypeScript. In this example we use Vite. + +```bash +npm create vite@latest surrealdb-query --template react-ts +cd surrealdb-query +``` + +## Step 3: Install Dependencies + +Install Tanstack Query (React Query) and SurrealDB client. + +```bash +npm install @tanstack/react-query surrealdb.js +``` \ No newline at end of file diff --git a/tanstack-query/bun.lockb b/tanstack-query/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..51e16da40935b8af96f12ac63390f0db14e58e9b GIT binary patch literal 99656 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�GfcRAiXk}||Iku*U-m)PFl>w3o#m0$3g@?Se@cRX?iHg)Jq`L4RP2uN(~Zxa z2?EDw7jCGvTKP?VL_hD-{Yw?(VL71J>-qMLHie17sq?S#_D_l3I$YjWt+e7|I~ z{2RPP)dTaD>6wR4u@hZ!4>6uNbuj{^tB=;*;GY>85NRfm3yM&_f7E{L;xdbLN51Sh zVbB?^ugWTA8D$2&{NC<$wzYIGY@%;V(z^GXq>DWCvG+0_h}oW%gVHrX>%I$5)0x^K zYFZgSB%541DG-&Ctu=L(>$5AJg7vt{>w8rzdlN?<$vOmL(pkL9*`f;K9E=H>kK*s< z;v&0nK>~eT7@~D0H>8Q)F?G$JIdQ==hSt%5T)QpfX5HPah2y)3q-8gP4P}oPJl=Pz ztMhC+qo{fiS<=06D-L{XN~n76{hzuO1KqHw4PWyxLmFMruk07QH4%{-T6t6qTW19@m73MRe3;4`O*MN*9fi4 zGJo_@L{z?rD6O@b-~ySLMYNeK=?ligQmo%i?{a0!wbEUU6}ET28|-}8OS4U1axw!<-S{Kas-*g! zh4XZ(+D)A1Nw1Z*uM4erUDs@})UK^F*8e!zL+hB2(ltiwYW1HMztuw^<-=UK&xp0z z!5~w)O~{bupg9?v>&el+%hc^5PyC692sjU=-<+bkXd198VN^h8Qe2>(*m6DoRxnEU zG+KAk(P_iGIJx*!AAYYunCIQPT+97jUQvb>k#l_*r+r%Yu8yeXKqjXKsx@4CK4-{S~ttS_i(2%JNygq7 zS<^G`jqQ04q&Vq(e#hEROCYSR+qgqOWOR^IXzip$wJ`QR7JD3{co zwdFU7Z+B|eAf^y~sZA>MYPZORAN|o3i?VJDGrjMwK4hT&uo&8Zub#}9{AQ#d+l#Ov ziu_nkRJ>+r-BdlVmrwNif>Tsjc}Z`!j;YsjSSmH?t3D%aeRyf|A)idwWUN>ubnH!mq+PZpmh&V@o_k) zjpcLMy0JM-|p-=g3*y2$ZniPnu>Z*T}YYH3hzEEPq*@LJ+5JLkFa!?|`37+l&!$6m!Ty`ySS78m5rL}@G6sPtxtO=d^E1F^li2TnyPYXD0eMnYpb8uE4np3Ge;vCC0hDi zZlr=wcHy*&7k<@byE{r3erJdnVO;m+;A>?H@wBo`tZwp`GzqRb_~x(g+x^edH$<$CX72?;Dip-Wv9$ma|=TBS-)Yjz-D*RDV7|UmXc@`9Cef8zJ6!C(n zoQV4Cf^hPp+HHmWbW}i z(Ee5Rz3m@|oC4hJlWiAVvUtvL97E~aqjk+1`9+F9oGZ>dAlu<{D0q@XGO0c9MQT(^a}6vfqw5NciyasP8YbgNgNU9b!jyBmh?|i zvz30?k|iXA~IbzAf`Au3)MwC=&t=wk)xad%gD-%U~wvyasx zYZF@}-Il`4vYJ2FJ-EV8@bMryvyr?T{u~GQ$PH^EVTRAlcPVLWrmMO9rCSzIx~^zl zWmRpNTO|dzYhAItJ$L0rD*|{%~U;8@T&%Ke} zO+YetBEHm`GR#OA8c)ntyn@p8 zK~Z5# z`;U7#Bnf>LP!_Wx?kYroALWVGou4tt9vxsfVz}@r$f)4zKzAN@1iRwPLFU(_2l_Qw z1A@a$I64zz=yizWO@AwmR(O5=EAKPKMW=HfFZ zWIq$88ltYqEOM*Py|%l#Z)&F)_Pri<{csko%S07!#H?f3{&j^?$}-o?CU*D$eX^zU z2QO{w(I+;WH09NA8i~GT^)>z@! z&)5jZa~>e=IjKU1Cp>d;$3z)jWXv(Tu80R!<)byW(Lpk~92!qnokj)b#1&4LvmdF) ze?4?}dPn6x2b8WaTKCiG{PsBk`=;^xBtyfO*$3)6^_u#kZj_0vu9laCk9@}0>G@7b zT$wq=89$U5bZ zZ^Ky*;=$L4l(^*&!M~$}%!hMm-8+@Z_C`E+9*r>s-lgJ}_))DNiI-+edY{p$>|j_- zn3uFm!0t5j(f1x-VoYdv_-&?%^r&dAJ46RHrZfEzH9@aS0?@hzg-$E67U$*hFG?zy zG1=^`INW{F`ZJ$l*)0kV%HYq9nYBSP{Fd1tVkaWA2z}R=q_rMDq+kyzo#N&jrPS#O zLB$)0)-7#OZo1~_vafR?p=mS}o6A$sInro(Hxi*Zlgq$(EGT)`_ zA2|^Ab2a~@&`j=E;3ceiXOJnxJw+yi9RmQqjeJ)&exbl#txI% zhS!$qpRqq@b}7F1iWrZh{$Ok+v+h93EzY@pFYVar5^2O7IcU~XUIb99ho)p(*NVi? zv&^FJkAu;=^<}jjiSia&CuYkDFS2AzdIZdRPaFH^@thTZIjY3Bq{!A{5aE4vFYBiX zSGj_Qo10eLY!sHu1k~%VBovp+4N!RqLF=CPzrGYMwj>=K&hU(*OMdw@Mbd3~GVS-2 zV=dyu#G@=Ck`LASrKQiU+R>JWu#sj``)xma*YAYk$v+F0(lE1jj8$6ux~eH|UgKV(*$zOF!=w zpHVci{4P|RRP=F$m|O^7n5);N4lkF{bC8>c@wcmRR!_#ij-gL>?hX} zW*&M(k=o}pzS7ZN-LD?zl9^nncrT%Ky(Z4So&K!Rq_F?< zMiM)*+55iyoANrbtv|?4Yvp+qva3FwBDL(GINSf4i9Bd7NVkJ>yMa~u!dro;y4!)o zHt6RM5oleJMp@<0iVBCLH9siK9;VE(cT+KuQ=%Ru{E;ox&2~&;c(8Wcw{NBqVT#Uy zYc`!Wf!gZ?JzgLa%<>(QFJayAQb=#!lL|{3o3`0xY`M{M2><)sFg`JM5JX}HR?y-4kmnZa8 zA~M2#PvYR+SD8-|@r*Mzh*?5+x!HyvczuIXBFeyTZu*tV!w3?xvYbw;sHPQ#9Mu!L zgk^%7*U-;tBhk8MtfaFF8TzC`6=o*L+QcI5mef4rcQV_JS}v%bx*!ykL}c-}Z| z@v&gduOaAdg@)?%50f+Hp_irib2_gUzDLCyh1RVf(>=r0IGkm^qs-vq$;x}qE8*R3 ziFKLJV&YTe6+Y0IP@l8-cIea667$0nnPl&)wzSqEiC|LPFC;uOGNy~Z4~RzV9xJ|y z>7$y^?23$dVY?|U`1zPvkQfUEOIs>$o|@Qpf&7Od9TZ+PD+1hn`6%n7w=aM6DZwlXx-}pX9f;BSoYZF4LNQ*GGVsl zozG^?QuA$%j8EWrg`Z!c>B~KCniiVo1{NBh^Rq;Hz9-+$5~8}gZaFY;NW~WW-4*tD zyN=eKnYp!-<#c1<>bv)+a%<{T!dzZ3ic+s z(d$u$kw#*9?9mq1@BS(**zatxx;N0ecO=pdsoh!^hc`~t@;d$k*UF=v!ZlV7nrgqtQgD1Nf z-m1R8?@D{o+U!}!71GI^_Q#4Pr7C)#Q1Qm0b#p%GnCf-tST5~5uY25I%8-KbLkn{n zBk$J|-J7on-#$FOqxF!a2H)9Tp3NMd8wtn6PV9UZG=6w=<6ei2s2n+Z9Tkt({dz@b z+A^-5fl0i0n=>0%`(yW_99`9mRMx2sQg#wgw<^Jt{z>}P$lb^YbQc9z?6{phDT{W?0 z6Qh^rrf#=4&i|I^`&!c|$?kV`Zl8Vxnd9ccJax=CnV zQ^UB7c9$BP@n|Oo2gN>oraQ)@L^jBn3}(sqpu*?dusu#hZfGB^)XvNlX!`mDXvs%Cqwe zOAIw%lb1Rm_FC7_Ig(jBwYNc3%R}+;&@O@<{suQr?Y!&VNv%wL*)(6oKf+nqIE6X%fqbujVmyeA3SA-52@ai2lr{Xy&c@-5 z2r9XN)Oy~dws=aNgJ14veQb2PdTrAwoPzFH!KJqkrOu=Ca0{)wz2o8S>ANquH%?Bw zUrD;8nXLPgsq*BbwShP<{N6_E&a}6iNV~-q z*M&&cl~nTN_IkFf_fSuMS$`^aSEVA*OO)KsHv3y1&4OqOXN+ugf0TY;SE+9CymMZh zrEzvc8cH_mu$mk7*IBfFy z3p)3&x#aH_Aqk9=+UXba{&|IL9-BOUXN-&)>h7o?rIYn=cE!HkfOt7jPooN`;8C3;W(5d%eg+>k4LC zmD0x%U8{b{ZntCJ%{_;*Mekbdr)q0Yxh|<8r&^74p<6Bfvdr&#Hv7)YT`AYN6h0oH zl9lkax2QO!=rQ`e(_OT#W>`vU+bj!#a#8GAcfDRI^4X7RqPKikb8Iej74hP|l5yAm znphNn=?R=${H5kYu;|m+#`U z(7Nu04s|_WlMKmazNwqisOc1X*?zm@!gaN3yQYhTl~twWlfqT=X*|h8jE_>n>jwju ziu~)bwR@;LE{lNCuQ-3Mshoa@0=Oo7D%SJ{`Z z6bCilsy$x4>D7IQ*)8vN+{~sh<>}=q{sH{CXTihO!{Xoff9X%T`hVJc3xFuPE_{5! zE2T3cGLHWZ66nTmDRk=%m*H8X1XqkJmzC`xuip>M#EA=Eb5o} z;=_NwSj*=`+KO{3!LW%cem!+4Qu z>6P8ipA#RCy8NKr!W}mXdD$oR3z|`;4A0&aKCgFaW6zV{#=UwYpI2OTrjWIr)I9U~ zTfNRrvwE_xx-*yk4+o)9JqvIv+Of{K(`bWovyYFmnA8%c3i7mf>TgT^B zJwK3DV%E*|o7{J_u6ECIMSYtI1IBm#Hq7zc{HUpe8xB0O?8NOmuUz~WH5=M`ar-kP zmyBzeGA!!F)h3M!7Vamo_u|>Rp3mE&VW8W*T~>9D6gv1l@pW9PPt~WUb~kOSJ#OZG zxk{<;Wqx>$l3h%RuuSt<=34sXgTy*nRw2_@$?jU+3>p$$b=+_A%6pb_bxODN9bTI^Pm;%q%a#fAuN*UAr1gw9wTf)3VU+%A z*Qnrv$BHy!*VD4~Z6lv|Lfwa3Qny!aIiah4+SKxn3;nO%oMrsfw5!Rc8|Cf>w`{bx zv8PLD@R{0IN<8hbY(eq#w-qvuSHA0SW?3YqNhRksK|Fgm@p;#dth0XpyGI2J)hbY6 z&9lnh(Hn2=nQ)*&o$#oD?zT(hRl48Xnr36N^w*>Aac^n{tra9boF2W@#=W|o)2K$* zYADX~csKKTjp|nadcCE|p=#y!_gWwJp#F-Ox!3NsJRbgdZ@VA8hECf#$|3%X*N`D5 z6^}erloHK+cX0l-*suea=gjDP(A9s>EOy-$>xV6TUQxr09Xs~+zP9IQqNQ2vd)e$I zO)PBfhYlUQr|bQlhc0Av4zMXv%(C>>gcBcscvMXa8a{9KlSSXl4O$R2@7L^MGXA{A zRzC0dhvVw{^w@Cj$b9o2t5e^WIzQ^DpGBbAgFYv_%=_`~Q@_ZJsOTNa=%xK*9wmME zYc}a;xr^s*zKRD4Uj97Z{!`_pJU?vX^RBNlxzJJfHb)DXR*etvao#33JGm*jvvuW` zM#+1Yw;$q__-^;0lLfxTTkUI;@#FEm(LS$C3iW$$S8LuJIzkIna8_>&%4q8-H_eec8r}={iJ()kHb=<$B%b9KJ(aSW;*M7vu8U` zDAuW*D>^lE9BVz@rOa0+pYC@nL>???yyB^7>8X@?X~8_+oqXOg@489tN8k6^TyR{1 zs8ZO++*TpRQlX*S7y`@SaaZL)h7a@o~C*rM{ICTFrvjyHMsw$|%; zP1YyA=JD?0^OmUJrfbH{rmg!wk5LqPcw(PRtFS_jUsII9w+8gL-PAj!jnDO&AIFGS zEqA!rqejKnRu5X=EajbI*Cug6)J;pvv~@h*-F)6!vY*bfOzWP73yn7Ii;7oBQbN;~#^*|LFI&)~tK|PmlgC>|s2)q)l?IJ;A+ZR39?$c-DAj z_6P^tszuKG&OYlJal$Ehjv0@4FQ2zi<@9|{Gb_DXd&8_{uT#$LlTVfHHFe>EBPZPJ zE-n1+itXyQpBEGJLX?I)f!Xy+E| zVIS@uzS-@o%ZR&^s>Ejmyc)Nv(c2jd%JjZ1%*yoadMs`BA^+Nsop#pm{nqdJ&~+IH z-Cbjq<%X79cbaGKem?K5vV+`HY6QM3AS~SQVX>=OS3KuFD`@nz>)IZk-CEsy)%dB| zLBD#HvMfheUfru{M}OBR_p4c)j^^<3`e&{yU zE9Tw!CB0k4tP}}e6)x8MuzQQ$J3qAbcyFrJ}{5rGDMwMT|aLizZLO_O4mH)cHG!>V(yMcXC9t?KX}xP+ew2TRoFY~!Nnti zW4kY#bueZ8`S!lY@4bE7;scNOFrT;3@gi4j+ZKEko?6ZFx_iHV1(RIf%+2V0abNw8 zRlB+DY1^SrUFR=Pr6s+>ewug`u=i}W%)9J^();c&nfq(;&vk+sJl-RG-qLm3uH0a< zd$P0Wb1T2NJL3dxy=4L0R{WTDaIufQt8l+qYLa=GryustJ=h^i(b7D7_B4J!e~iz&e_QCf%HCZHZJfD2zU$GU zYYUI6UUSE4*=v)n!Num!vDC-y8FR66cUY5$6orVN|8@a3TvLt3=`>b~}E z7=OO{IG?wfvST7*@z(f8&*Y}uoAxx2NF zxi|W}>qyVJ>noob^JSLtvnkeA0WC|i-;=TZ<_SLUrlkSb9#!_T`rPJ}WAn%sZXN-5 z-Jkedv|kc z;+fN-*Eh3P9x^h1AGIng&B|o-kE$nZ6U)9kfBpPhhm!qEY)bEK#p6BA=Y17&DL&Tc zh$z$9y>+ZjliGFGn2mndtA_oA+rz96_HKXU+0_BzU*C$GWZK)5?KUU5+#Ba^CEvDt zU~7J}Xv_B(%k$R-o#FFlZ7!&2a^6o~r*}|vTWgh1{B-rtYBQI^=;;p05B;o%?C z9*gxVQ9se8r}#`{FO7r|fV3Wn9neb?WkX&+~b! zyL=BGR=~#Gzih+iQ58Cd)?Fj69yjb#@h>KeW!*cOn2cF7WZBB*!o{18RhzkASn^uM z;a#ua>4o)A%g+B=nmzl+zHK3+%QlF*x_4-S@V&+4YteaLT&SsK(MSqf19zJ>31msYl;=ychYr4ae{8<8yCH zjrt{~Kfh^gxw*)>m1~Qgn&tH=%lgBLg_ox{-{v6g@ubYi^(&_w7}K|4{CE2uGq?8j z^l!HEevv*McP8?9FY$R@8k7i`IInm(J_``PuIuX>dFb`!NkdN#oW1FAhkK{C$|Ju1 zeCzSPSwQBc(Y_NBdtRJ&{zCQzuR)vNEE@mAzu6{79`9v7Z()2oyKD2)rms`a-QIqz z?VO5(GE20szG(RKnVHGqn~fTbUm0fn;(FgV();6@IahM;w9@g@>N=C21iP1Bkv8k` zBK|tDD}3IwW<~dJnlNU@^Dn85Hojig^<{a>;r3sw#h(`TKRWUBJXtdrv*hfNCAa*X z+t*}QpC_q`@3*^l2~M_O|Lm!gaz@EOp1tXO-q$6^WI67=d(zm?@9~i@TQ=5tCK&K@ zp?m*_Z#P^YC>@hE$optyTBxd<|B4y&M|D^nd?IC6T&?bsPbTN=ru&8$Dazx$%IEDW zY3OitUdXnCJ7cO0s59k_={|=etYhIo;zS;7x~4P@fBnT z%^#e5k=eA|=Xs^%B`OE*&S==D%BacLha^`&b1r?=x`I7wf8z0G@OcM}D%@KpSgGp zf8UN9eBLsf#yHhnbnV8)x9U7<=FBWuqBcL@XU0{i)84FPB$@x;>5gys(b> z{uxfw3J*}aK5;32q}CK3?=3!Wh2A}GJYD~(r|Zd6jV4dFwmn;G}rD zsOV6^xN`k(CwCh-?4ytE-jh`ZM@`!qn1TJ}<6ayu5iWBb=+R<{{Nw zON$xWVOgP(3m@KHWi_`@_ZIb!J{uf*>r?!0oBqY-cAfaXZQSTlau?Z zEHf=Ws#tuHp7B@I}>C$24>i7QyuCi` z+ljI6D+?>OF0VG!%FlZTkM{weH}r@6yZPir2}_&?$=;m!u*PJ{m0^*GDjxI-k{9e* zZq~$KGY0Q(7+K%*hNrS`tz(ti6yEeG`SjM&MI!xP24r|n;y-UbS82ZNS` zxhziJuz_dqBR=ogc}qWgxSttTK-6B+;LZVQ+sz9)MYaDvd|a{W1-3u&SrNa$rf*jK z&?cov&&{ee#Cu@JvMzz$J6$U%o&R~^ryF%T@OU5ddAk%Sx@=GHH$kCumPh}(SE$>z zXUXG__+KucwPBL4-S^Xqw`Z#qi{G_+(arfjC4${PZjbk}slUV2wAR<|&y&}ud&cp2 zpYVArE`Ki>()f6B*AoX4Ubd?oaMeEJs>@^P#$WHge>@}{ls@=y8LQ<-yt8YyJ088G z`Go}zHLlJ~eVtHqzVU@Zy(%>0KLl5QAD@vSL=g{2VVoSpF@z-K{ zS4z+7ai>nR%wA^?%$>B{HpuoXl$>xiGfU#AXGX7Tj5(*U2+H-WPn{C4*CT8FfDND{Vv5 zny-drJXjS~s=zjT!Jr=wK8wv3`dqk~y=d6hY8G35wQYW|Y`ELn*Gn!g-&fRnyQK5g z^~Y{+_u%oq%x!q;;8oC9UTLAWt^YW z=5FE0?rraNwZ0dhz3ABvhpDC7xB1wtcB4r@c)YLpytW-)#H!9s64mQgbyV8J#-$Su zm+Dh+we`F=--@Odp0+L4tH;#Jem6tY1>Y~&Hu^HVWnb0!@VX9;#^Nb9{%g$5`SS#? z`MjqJUrT(I)^=u#jPcbRdOiNO`Sz1i31;(7w`p&keD-wg+u4enclI@{Ej%(sHR1T4 zd0)yk9a-v?jmMWLWoKo=>8O1?d*ASR0}rhk6g|d%qh+9jut$S>wS>3AD}7ua?__HE zAZGM^FKf4`^B+P?y?RA%8=v)}iPA}TlPkg>xH6}b{+>!m+Pe<=;+cZ1-dqVuqYTMje{mkgUW#OF( zHLI>&Cpg?DvoU|(^Bte}UgxDl+B6z;^zBT$zS|r16Lz)RZ_~27+ly_3j<)pteC=sS z$iY&n9o+65ZGTTyym7;J9}aD-w`igyxLaZW<9#PY@!vzf=kvbZkY1)hvEIWIwx39E z>S%NMa-SB3`^t@4t}UP1b8hYG4Icec9XBn}vDo+^9r)@XT=t+tk&b;kAtnEHh-HL((%QZLSvLN@#hEGud!n4to5s)om=8= z%1UH}gdbV(>3xc8^@c6q*PSB!EOqS3Zy!GLd3&|Hy6WQ8J1cJ24t8y@d-^U(V7m9H zp(X0S+WjLcE$-*luO?5olwaGY#gvLkQTC&fpNMaKU9vnSGjhb(iz{7=C~bK5e&X{c zy3BvG(x=p&U)yJ{d;jx5O7p?4#jIzq^XY!{-U9Kb)ic{(UU}1{SjED=S6+_^Xmr@V ze3N0ld!6%Za&6Z|+jp)9Q+d3f`Me{pxQ|*j|ICm{ZRYS7oF)3L^V zhrL)BaV~A?tx@A-Aw}eA7mjQyH+l8LGRrz9IQO<4Al~`m_CY&&y>_j7buSi{)NsGs z5WfJ=BbNgB^ITu~yq|`dbqJ2VBs-*>nCNrKXk7o6CcS-YUFlrOX5aqv=S%Gi%$jojM>Rbf-=61(Z+zZ9`wQ6)8ZJzJ88D#2nwjQp zvIlO87&^YQ;M}Wu$JdNsSf^C!t`_|_4~g1mTSV5_w0Gcw-qXf4dsy!3fu?uUmV7-E z%j5md=bf^?>AI^sCLbujE4oi|%_vo8pYjja{(SR2%l2S{*hM8?j2@R(v;4_ZeLedb zeIJpv-o8M^PJ2uCvdK0%P|3BM$I$6K-XDD4GL-}??>}_1oV}~-(rM-;Y%FR$z1#m? zw@vm(5`BwX*XSGD=1#|=C%RouDzGGJTaWCvm72ufb@_C|)5Rot*3HcO{O9?feBRL+ zsjb`jURpo&M3w2ACVlENZuyN>!#0han`!OjTl-qI*wS^c3>~!n^^are$Bg&3o+j>n zf95^s1&il&pY$lG{@3=^dG`L|^FH#p+jo2ycgu+6PWOx#74|>6aJQeUd*Jeh^A4A^ zn6s_pjj;h#_|BRr*ysl%L=R&x6WmCRrIJ}N$Aey5uCPd#w=OM7r<`ImE^_P?rct~8|M z%S#TswhmvgsQ|q{{xAOua>|AO3(5Z=U1RWkFTnhbgv7!y%uFCi%#E7vi;k8C4XiH^ zh-FfTFeSS$vr-a1P@)hBHbA#j9=f^l{g-QG%b`Nd-;_#J+wx!d{);ZzGEl0L5J&T( z%-^a=q~rgQ|0sl z!xf@n{B0m<1k=y_znIVeTk=HZ5vCNziNa-qm9^Nu=l>Sl4cSR~6N%-D2>cGSWBy)E zq9L7pdA z%SfUWLv2Zm|MU7IvhS0(?sGSDtrh-`CgSve_p|ulc{~5^d=LEZ^}v6eM*QDve17Wr z9?17Vz6bI>kne$f59E6w-vjv`$oD|L2l73T?}2;|kne$f59E6w-vjv`$oD|L2l73T z?}2;|{QtuP2f1BjHgUVY6mP6lh#jO6N|i_^bCAi!1A?V8i9_0l8eW2*O3filN{;ALDJEc2x0sm-EClX`Z6G0ms&@t`D zM8C8TfO-!l`lV~wYDA#kpNIBAqHDBw3+*pX|7Z^*IxGU1aMx)6Av(mCAOhOIm}Inf z5T%LjIs|2Ljb!8jx{q>V&RrvK&^7GoAt;Xnx}Pr4wL6@v?iZjl=rxXZb@7Bp^6(Aa zLw8dCDQ(Ih<%jGio5%*@r}Qbkk^uH`p*=%JIz*t}$AOsu$N5BcF3)BW|fogy$ zfcA())D6j>X0-OP8@9OiwDc~4z z95?|S1U3Mhfn~sQUl;0Cw@^#B*(7VfyHVJO93T;B0yoF z5Ks^>1`2Q}ir?ZuF`xuM`s#Zua7^`&_|^50el59clzs*7m}12Ss02`)aNR+!KUE;7 z@}=^t57YzP0XM)EZ~>eFC%_SK0I1!t2kHWLKpmhqPz#{gv;}Ga)q!e2Re)lgY-s~f z+_wU#9<&6gUQqpL26zEfZ#;n}0M#cCpbFKnk!9AYbkQ?g6`jO~6LL z3fKbd0(JsBfXx71+YW34wsPm{`?7IPTz7%Pz!~5wa2dD+5Z56f6(F4h0Qq!3un*V^ zsP)wM(tUK#K|q}j-BTGj0vrX*xpT7VByb!!2Alv+0jGhB0O_9x&H`z`Ip6|!PRArC z`_h3c0P&HnlqZs@?WW&5z-=HCxCW5z8Ne;zCXfYO2W|jlE8V9~TkR*x*CXH|@CA4P zP;g>C6!)w`Z8YShoUfrG1qE7R(kL6Wq0 z<)sQS7wy#&C#LM!M#4%$X~?fuX-8R^OwaDMyH;G3tN*b zLh^Om`vtwt9(qIK?(E=Pk7^qtEphMd^ec|rH@(nG6cUkG1?iMW8MiE_9Gw9P z<2Pp}vWh`xPz8^#(lOnFwGxU8@^!6})#?`c{%W+bF)lFwVyKzJzaj4Yjb{Q7E|A}vUz?c~q^wn1V7whQj& z-FjxdF9Hd&NhTcQB-O8uJG5kZLJZg_Lco@{q+C>`KZ(D)Q1?eCT7D2}x78I*%KOtb|9I~3SLsly#u@dO4w(owuYni9l zI2}lGmXDdX6msO$oXsiXI%iJJjXay6j=+Rng_yBYqVK(x17-wn^k*z^afL*^8>aEK zsKnXLTc{x?2exravv3Fby5pRl{Z~G$@J$~Z)gOvD^=^rsWjETG zu4pzDK5%nzra(~dlWA7HNsE{w?{>0&b4Kt)%9SdyQYq*oN<01Br|2+98c>Kf6a*_J z10@kE<*q5i%a3}QbgQ7z5ErI-6UZb`z`uEoFFih8s=#Y=O_?f1ti<@5(HfIMH3Iz53p#hz$)Tnm& z>UiW7jWxA=<Z28uo zw2~N3QqSk?jwRE!#cL&FA)y>QHJ=x-v#_bLR}65gOIpcBPLfn`U1&h* zMzLDSVNO!Cv}fI2Ml;T8CFzh*B%UnNd3LME;fJ-7C!D0h*RRgLr|U_yk{_Jpu;69u znoo?qw35;#ShgD@f?GMyx_(G2vE?LoWoo+`jlZ`eSuMw32K{$|IeNOU$f~)_&4S zE7^>YqImP{XT0yqtD@*-C=d};dDTX=$_JoBJ^Ehra%K8Xo;$pt5h{H{ir!2}DnYXS z*Ymf(3_#r!9P*hK<4*Drx_+*S?!vkbwLO0g5ictGLRng1g=GGJGAxb zJq{A;X;G%)P?2l^B^sd6%!5~jerg}J_wdZ1PQTSugOEHiPiQlN`{TGEkq^{6hX(~z%Ga8 zF10T~f_@26>LgVPNhpXJ8T`Z$V*7j$&nA1p(4--@@P+|PsJzfm`v%geaSjbQpGsCUze9J(W65LJp-N}AwhGM zSgue{>yFkVP8l0dFwjpV5m+OJmw^eM(=I0`iIF%jt!D`oW#+z zXkeA8Tc0u(AV-){g@pRK`EzR==rDcNdxnh}trtgtk|g3w!_OVUd@DlYhSCOGIY?*( zX+HjXw%^%fD6C|jH2h=Rgk#Aqp;1Flcd_uzwY5zp&g^+LSxuKPU0fl`tJ1k&=5#CzbPO=B~E;_ zA#Q5-?5IzW;0c2)7zGI`SK_24Tl{_uKJNz!7a?;Yp>}kOWtH}a%2qGJrGq%w1PRsc zyGb`xn>(H^%IGi=e+m+~F0o0+$T;g!hZ{qJa>G#3?LH*bQYiQNrED-ZeZ%N5C1;Gr zfFzBa+jp}XcAH90JwAZM77~A}HW#bB*^1avOLEN*GbaDNJ?IB=vMG-mjHt>rdYO)) z0-9tPp6Hp>W$Bjy8I4`I+L#Inm1)n^mxUJGdQqFP&6&nK7B*}gbnkMdL*KWj?s8Vc zZ`C28x^QY@f=PMf^jLbzVZvGvu0+#71w&kQj3} z*c5CORfvONnMkFQ1PLxC-@dY8N0qgV#KoZ@=CdSmOw;%CakclKR2Fj~al>;KN?XD0 ze7xp!yzIlI_5mCl5@MPOq!-+M;!CTZ9lasJvoq<)BgAOKFx#@J`P@0NqT-O?I<*JV zh+w=X3sqUHus{4P`@$7Q!q_H_2$d+LDrM<;Ps>-heFc$7d7*!~`WgX(*#zX2YH*=P zGwVgn*-(;WLprY^F@xmTnWx)_1o%X0C3)KxqYy<##$nEAL1tR5gn=00BMIhT-jZ?X zYE#sYHHQD@(51O%g-}O@%hfq)vn1V9sn4Rm1Z*NjNF*LvB*vyM)BO+MqCS`$ z2T5RUc4U`Qwa3!0qkh$3yuES#3pzFISe-dDypCSk)uRF= zsBu(bi)cWy|P>VF6$&93^%ULHN;YKxiOY#_ppmo{rz_Jxzc=!6qBKKT5 z3y_~kkt$S(rtFe3^=GmL$kqifi`#P=r545PiaI}e%&vfK7IbLrU;IgT z>!!&QzA|i#4`zaq^3%&`!Hrg*7Sq^;rbD1p9w5oqQ$wdU4_Rjm2^wXR1W6>3La9=a zS^b>t$TrWtAb|$8mQ^98s5)r!Xie*_K@=gRgUW5ku{D?_oKf{i8S2ew)QQyd9*?>~ z#|&(-yFb(~)Tk|u9H`{#>9g(kbcS&0lI*QD;QEAhd0#+a9 zB&`$5E(z?%j8M3m6)D8h3Xw{3t$O1kqvFO;^pZ!R1Bo@$gd1(?`sqgLo$$B_uQ!^FAULpR4sw z0SWbHkc5hqLiC&=)3ZYNloN`!ii3+i)?R4) ze(?j$=25E*i+>+&*kJ_F2=}hTFWI*3OXcfR5*O`aEO0?LEZ7MN8uP?6TdTBd8rF7% zR&o;(G)jpzZOYZJlHhk!EpZkU!sxCHB%|AUwqN!>=?5#JKBGJ&WcA9aW`~9g5@>`1 zztN*a&Us}sqZ+u^4EOHGFSUu~%0Bd|ozw<%x9|?yxB7xp9Ghv2RyRzWydWQNlBCnpko2s1i=T6 zzL*k~#n=Yx@Rkdb(vY;<{_D=IK6hy3&E@AJBvek%!Ul~l)~McMR)Q)dxC=>DNZb-8 z&Uu@#<(69FA~0^k&L8xQU%vl?#jOomNmWRwF0{^;dD|V@Nl#NqhuCt>DI;-&4vjXN zck=7hVdC@yS{+YLV)Z%v#hUij#;GMPf?PccHWxt$=ur7QdpvJmSH~kh(BaA_*AWWi z>kvtVGA=?a=x^1j{sR9J=ZuX4z(SE8ret>+Z=?w9*Q7!Uq6%!7J4LPM{#F$4{Q_Ph zP<#C^zWx{QZT@%~y zZ9J6$f(m0;cE|K*zU@4p-S>UQ#2elxVeFD?J4!WcV>7npn{To6snw``1E7PM0J7~k zB$kNcxHsD~ZZzFDgp;_q3mlrWI{n*={cO4RLyyFcCwTWL!O9uROJ4erRG)v&@ zCTP`yZC&pEJh!2?Td6sWgc+gam5!SrFE)MgmUnv)-;#Yo?w9%6p<}YuSXjWt&MZjC zYWa}q-kGcHP=nQyyyGD6)+MhNHm_2kej#@@lH^`;`gKltv#r?iN@ag8d}3OG%@4J2 znUK&7#-F2Ec{?Ni?jGp%63bmG3@k>ty&pbq; zQ!X886iuUQISWjM}E{h`m23lW+ZCO=Kb$$iJRbG`rtg;UX0%q?bx@9Q*X32 z+H$e~7-J(06Y;ta?Exe-A8(vBI$_ROSIonzC2JtDfh3~xyVUfI8V$9QQ;=W^A#siM z&6DX{ygzCszmF4XEdfmvo9GrPj}3%Nu{eau0^>b#$`a(UiH zyGLW#_U+l&Nwa9vZ29}J$4rDUE$qK|Cy%FHG^Ba6twSqY9DY-;ji5PvdfasqHr=L|-;L=hrEul9arnFYqvf~Rn`1koELRWMWN z%A?0_oSFG5lw*VBp${9y&P|uwCX6U;#YmX>w^xwR*gx(5{>V9#K45+aHH)b~zt8+I zbq*=}R^s|#-C14uEtmOgYAK+TtJQ4DbznXEEd1#F9*?@v3 z4DMI=V-vQ`cJPkHf{X}}tSh}@3-PpZ)-Hf+ptArj=h`Cm-zu!T`TC8T*NkRfMq>1A zz4Y34v(1+)4S9-lYICOE*gdb(g0bcwa9$SYFH(w@i3)%4t*9|O9(d$?`b5}`VlgV_ zuK=MP_-4LBF=L83_#Nq*>8)jrUs^})Q7N%(1b=zA?`4}|zQOH3@5KZnjW9+wa6fAl zYx1)wEj-7+O(WS~tog=zKIgoa^I^4#0!xKtL4iW%&8HW+SLw*C9^xMhgXH1txmY2M zR0-M8c4U8qk+SFzX+$n^W?ER`MN=MON=NoKAw#aC$zBqM%H;zvsHf$993>}ENP-m- zWhi4ClfIWqL>~)@2e6i^ZO`SRFi0{`C6~*TOsbR(O^)$5CPP)KNM$2Ou!LX$r-*Zi zhzt)?I>;3vj{Mskg*vA~dY*9-21-;SJfx^X;>Ce-1xyW!jt!ECrQsqOsJ*bBOfHLa z42o8WR8o0FV03V>L_yPe(W+o!1K~h?$`pjjI6Wrl-UuUfF9>PE&yCWLz*Mm?Bra0O z{9Rz(God_^k{8L;zpyRG9V&@Z#b^rYNWWWjRbi9v1tEs8=z?IAo_uLt0e$TWbg|^m zfNoB=f=GJIN~lsuEz&C z?gXDkONfpdZ*6noW6I~xNtxSqn5le0PmWfH4Kp?G;7IKZQ+ zc#T;m2@U3#(O^>7lLou&6e{ciET;J)SWH%OEw=v3%gi`Y)|mq#4Z|4%J&7{wV;M8C zPL?TBrf%uch*9Ep+>3~(rHJ~29t(4EH~uTc42rA4IM*~+P|_R=*(Jl2l2ROs_C_XA z$mDXRL@0?Eh|Qz)<6k zP>*Do`1u za~DgcbC)P0NCAK8Sf#$kw*tdUNlrRVet7n?*K*6Z(zT&etj0Qdq$DCIA8Q``!{g)f zs(Vpwpzc+*iMm%=gU~cbgz#wDs|u-7Jn*-x;nGNDJvWI=PXK7L!Sbjz5D>Z-cyaOP zY@AgZGVc7JxVU_4xVZDbBkmt6ed02TlAFPV6u2O{3tU-Iz6 z8a%wSzvN-Vh^aE*;hp^x4^tgAJj~fY@h~+@!^52YC679C(6oSuclMV&>ZoCPcxV5} zgS@~VH4o1Il1JOJf<}Atmn_;Q8!XzBzhq&fg<5&AXixrEUYWoQqmm% zC5NU01bP9 zhXeY!gBgLaGgNqxMW5}(-N)UIT>b>^2j99 zVCN#$)}I`Z6^C8S!1kGls zUx(>w$F*;bz@a^%DJ=Hwi5^`&FQXWP5Jb7Zs=}bhjeR%7&biQy`X|WPq_nK;=Xf;Y z3Be~bp%N@A2$x3S<&sJqiU)Ke#N;XWQb&cED!jRj6ygmSX4qm?LX{{`CJ`&-N~KU4 zDT;}pRVzZgj>EU@((q^n{*TpopF};Y6r5hUHR-z1X?CK+MKD#Ne|{+R6{}(|Efk6pJux&80a| z3QO_Y3||t^LOxNXL`YeP2*HcA5J_yLS9C;(DAEzvqQyv05+oGM2NkMi|cbJhRbPMT__EYlq>K~ zm{zsIF!Cm6ALiMGF;Z2iJX(b*L3xD!dG|lkN2&kOecHJ|Ju$04KS(M^4*!gl^O)A{ zd>3k?mhmX6xBBe>^GyOXJL4-kebdp^D4}c^_n^lZOt+AO*6_gqf5(% zgouBt`0@xnmgTq;bUCgd4)8yArWuO~@pWMkroGYHz(x3Kgr>mt&}(mEoyuvzrEsc& z62eE)yyVC-oeNBW8hX9Mtk;7o^NRp<#T!5UaS={$@4}TR1&@tpQ1 z;?ii)OHhN>uwTVOk3E2n;g`+S&q0If?y%sQZ5_}P;kBELx-_<1Qwl|aN;y_y=zFV{ z^H$L2y!1zHCogsKfz}pA+fb3HKiP$<`jBZj485FIe+10vvEKtT=^3gP>}R;pVhH5e@x<#F^G@>NkS>Y#B=25mPdT zq97NuSnD|(nbwbev&S2@VZ4K3R|Jh0v9w+9yCVK=WE)S5aSjvSc$*xJcc@Z~M^z%_ z06mV$aVHpaTwzEJb(%W4Mqaoq#&11Sj>$hzoj%;J(?`{}jR91U~MFx+Q}Rt@;CQsHqPbM;VGq zz7L?wKV>QwQ~2ydhmak0!dr6LKndI?57*-&{%s)UpZ-xlrjsTJbk3QI!(HGZL)1U1la33^{@^NBi)uHc)$oiDg4AD!cIkl-UDRLTXp^7lC>c z18Aua;Q_Q1Vfv5#ym?Haw7Nb6s61Vn#J@0Owr*2=DLVbkH@q(u@syJQyC3~ zFmD14%Dgia9~VBDL<01~eCyU0SdYLjtt_Tv+vk=ppV*UqzoP_2>u{j8{%2k4=vb?_{ z$ayQ0%Xx_@bwf{Ov=s?->F1AHeXX(3(w;E7217!Vcj#&z!Hm2Og@wjjP}LkWnuZ45 z+}177!gTuQEB)l^wwhWogZ3YQV?g$}5 z^V#}4J7#MJ=rF%jdl@^j-+=BN^}`mVXP0lplgid;jIJZyZV2+NBnAyAPwl2xYJw3j)}$3-G8WR7zyQe{dJGyq#Ng&u|6=5I@VqeRoHD zBXGH7@~bC5I(o>6&Nlysiho1{@Fu9>j((Y~AOomEikrIXa9VtfB zlub4YI1%?nA?g<1+2S>CuoU%DE@Z|VkqW%wRj8zTr#gPWnauf(K|4&<69|S)1GgT- z$pP5+!%(c~IDm$d7>TpK(bDT&W_b;MWylnQI_lI9S)k(CpHA?Dm~{bJM-|q9b*vBdH6=_VLA1g`O%`><>N9m2a^&i8;QB(L_TwLH>Vgh}{Z!aRPsZ8r z6yaj-gGFY4EGjseG|*8jlj<*injCV6GV_b-$-VZ{lOEhd+jv2TJ3L8Lz9mAt-;{61ldv4G)cP<6?1Rgcou*1|upHQKmiT%Zm@vYl(a)bWQ6 zd6^H|^yDSyt)L85tMM51Fz60GnJvK#lx1$Oiji(^mzfYT^cbf*LXWhfoaFR z!W7b=5J`+gCL=j5%3xYS-euGu_Jc(d=!q3Rm5vUQ);Y(p4gO;XT)cGDFJ&+z%%@`8 zKKfpg>W26a4alJd6LMTZ0T>P(z8yUCz{Wdc9wH46LU|eG`I#*hwbvQP{N@*>M8z&U z`_rte@25N+n62=j&ita;t6pC=3E9RTKZgszdMs|!b@)KDZYa<1p*ghdz9Xl#Wb!wX#r z*1oC~G{%z)#i4lDER7ClcDKOPrbLAGrqPkK_li)5H%Q-GgxnQiTJ8eWU+%TLXA>J3 zj1xURqTZIa?*pCs@Q+$4oh(6F=bRaSVWS8AqyOAIMP}sUK&A;c^sa|r3gF?NLLWT| zTUv&O5&EMS#J@c{vT@B;J42b~*m<>uOx4yMUd7T=YF@cLkAO(?Y=ROn{Ax`%r~Kz6 zZ7%s&|0;)^BD(Y6AJ{NIgcJzj)j^IjF5afB#DJ>~N|t@;XmE~u|Ce@|WK3aP_gzg>fa)EUE!t|(F}H293G!@;cM z=jRiN@K1UC|6sk^;y+{IXMi+$`9a+^9Lk#Y$xzlDV;KoITc^kV97~a*pW_PKm>Fox z=tXcKy~$(`gtV9&iK78z=D_GG^F4qN9}ehUE6uwLY`im=!7=K|j3zPYYL3yK(?bYs zVV1!$3#;{TXm0|E_JoTGAXf!AY@jti#y)yfT+7OfOjbPKgz`R9b81a%nB04-!qVIKz<{t29j$st$ zJq!dEyP+r4*aK7s!>eB?+Gy?$GqF(QoiU>(L(d=T?Me&sw8gSasggfK}(5$C`^O`>D_GO)p*f zmnK`Q2RpPUJR|fJPG0tbiv55_+o>32!EghAS(r99gtq3G-6`zP3Xav%Xfu0*G1C>S xnOFiKj}$VVGi;3ZUhrv8g!pUE$djR{=eGBRDtCnNqmBnn2D7Q<|AGJc{{Y8og%1D# literal 0 HcmV?d00001 diff --git a/tanstack-query/index.html b/tanstack-query/index.html new file mode 100644 index 0000000..0487cef --- /dev/null +++ b/tanstack-query/index.html @@ -0,0 +1,13 @@ + + + + + + + SurrealDB Query + + +
+ + + diff --git a/tanstack-query/package.json b/tanstack-query/package.json new file mode 100644 index 0000000..b77da41 --- /dev/null +++ b/tanstack-query/package.json @@ -0,0 +1,31 @@ +{ + "name": "surrealdb-query", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@tanstack/react-query": "^5.51.16", + "@tanstack/react-query-devtools": "^5.51.16", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "surrealdb.js": "^1.0.0-beta.9" + }, + "devDependencies": { + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@typescript-eslint/eslint-plugin": "^7.15.0", + "@typescript-eslint/parser": "^7.15.0", + "@vitejs/plugin-react": "^4.3.1", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-refresh": "^0.4.7", + "typescript": "^5.2.2", + "vite": "^5.3.4" + } +} diff --git a/tanstack-query/public/vite.svg b/tanstack-query/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/tanstack-query/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tanstack-query/src/App.css b/tanstack-query/src/App.css new file mode 100644 index 0000000..027945e --- /dev/null +++ b/tanstack-query/src/App.css @@ -0,0 +1,6 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} \ No newline at end of file diff --git a/tanstack-query/src/App.tsx b/tanstack-query/src/App.tsx new file mode 100644 index 0000000..c19e0c9 --- /dev/null +++ b/tanstack-query/src/App.tsx @@ -0,0 +1,68 @@ +import React from 'react'; +import { useQuery } from '@tanstack/react-query'; +import { initDb, getAllPosts } from './db'; + +interface Post { + id: string; + title: string; + content: string; +} + +const fetchAllPosts = async (): Promise => { + await initDb(); + const posts = await getAllPosts(); + if (!posts || posts.length === 0) { + throw new Error('No posts found'); + } + return posts; +}; + +const fetchPostByTitle = async (title: string): Promise => { + await initDb(); + const posts = await getAllPosts(); + const post = posts.find(p => p.title === title); + if (!post) { + throw new Error(`No post found with title ${title}`); + } + return post; +}; + +const App: React.FC = () => { + const { data: posts, isLoading: isLoadingPosts, error: postsError } = useQuery({ + queryKey: ['posts'], + queryFn: fetchAllPosts, + }); + + const { data: post, isLoading: isLoadingPost, error: postError } = useQuery({ + queryKey: ['postByTitle', 'Hello from SurrealDB'], + queryFn: () => fetchPostByTitle('Hello from SurrealDB'), + }); + + if (isLoadingPosts || isLoadingPost) return
Loading...
; + if (postsError) return
Error loading posts: {postsError.message}
; + if (postError) return
Error loading post: {postError.message}
; + + return ( +
+

Fetching All Posts

+
    + {posts?.map(post => ( +
  • +

    {post.title}

    +

    {post.content}

    +
  • + ))} +
+ +

Post by Title

+ {post && ( +
+

{post.title}

+

{post.content}

+
+ )} +
+ ); +}; + +export default App; diff --git a/tanstack-query/src/assets/react.svg b/tanstack-query/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/tanstack-query/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tanstack-query/src/db.ts b/tanstack-query/src/db.ts new file mode 100644 index 0000000..2ebc1b9 --- /dev/null +++ b/tanstack-query/src/db.ts @@ -0,0 +1,47 @@ +import Surreal from 'surrealdb.js'; + +let db: Surreal | undefined; + +export async function initDb(): Promise { + if (db) return db; + db = new Surreal(); + try { + await db.connect("http://127.0.0.1:8000/rpc"); + await db.use({ namespace: "test", database: "test" }); + await db.signin({ username: 'root', password: 'root' }) + + await db.query(` + CREATE post CONTENT { + title: 'Hello from SurrealDB', + content: 'This is a hello from SurrealDB' + }; + CREATE post CONTENT { + title: 'SurrealDB is Awesome', + content: 'This is a post about SurrealDB' + }; + `); + + return db; + } catch (err) { + console.error("Failed to connect to SurrealDB:", err); + throw err; + } +} + +interface Post { + id: string; + title: string; + content: string; +} + +export const getAllPosts = async (): Promise => { + const posts = await db?.select('post'); + if (!posts) { + throw new Error("Failed to fetch posts"); + } + return posts.map(post => ({ + id: post.id as unknown as string, + title: post.title as string, + content: post.content as string, + })) as Post[]; +}; diff --git a/tanstack-query/src/index.css b/tanstack-query/src/index.css new file mode 100644 index 0000000..6119ad9 --- /dev/null +++ b/tanstack-query/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/tanstack-query/src/main.tsx b/tanstack-query/src/main.tsx new file mode 100644 index 0000000..803b470 --- /dev/null +++ b/tanstack-query/src/main.tsx @@ -0,0 +1,17 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' +import './index.css' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { ReactQueryDevtools } from '@tanstack/react-query-devtools' + +const queryClient = new QueryClient() + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + + + + , +) diff --git a/tanstack-query/src/vite-env.d.ts b/tanstack-query/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/tanstack-query/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tanstack-query/tsconfig.app.json b/tanstack-query/tsconfig.app.json new file mode 100644 index 0000000..d739292 --- /dev/null +++ b/tanstack-query/tsconfig.app.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/tanstack-query/tsconfig.json b/tanstack-query/tsconfig.json new file mode 100644 index 0000000..ea9d0cd --- /dev/null +++ b/tanstack-query/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/tanstack-query/tsconfig.node.json b/tanstack-query/tsconfig.node.json new file mode 100644 index 0000000..3afdd6e --- /dev/null +++ b/tanstack-query/tsconfig.node.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true, + "noEmit": true + }, + "include": ["vite.config.ts"] +} diff --git a/tanstack-query/vite.config.ts b/tanstack-query/vite.config.ts new file mode 100644 index 0000000..5a33944 --- /dev/null +++ b/tanstack-query/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +})