From 09408ff9477053dc1f3519d032bc745545dcb373 Mon Sep 17 00:00:00 2001 From: fahreddinozcan <ozcanfahrettinn@gmail.com> Date: Sun, 6 Oct 2024 20:29:19 +0300 Subject: [PATCH 01/17] ci(tests): add cf local example --- .github/workflows/tests.yaml | 42 ++++++ examples/cloudflare-workers/.gitignore | 176 +++++++++++++++++++++++ examples/cloudflare-workers/bun.lockb | Bin 0 -> 53637 bytes examples/cloudflare-workers/ci.test.ts | 16 +++ examples/cloudflare-workers/index.ts | 1 + examples/cloudflare-workers/package.json | 8 +- 6 files changed, 241 insertions(+), 2 deletions(-) create mode 100644 examples/cloudflare-workers/.gitignore create mode 100755 examples/cloudflare-workers/bun.lockb create mode 100644 examples/cloudflare-workers/ci.test.ts create mode 100644 examples/cloudflare-workers/index.ts diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index a68c895..341ea88 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -37,3 +37,45 @@ jobs: - name: Run tests run: bun run test + + cloudflare-workers-local: + needs: + - test + runs-on: ubuntu-latest + steps: + - name: Setup repo + uses: actions/checkout@v3 + - name: Setup nodejs + uses: actions/setup-node@v3 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - name: Install dependencies + run: bun install + + - name: Build + run: bun run build + + - name: Install example + run: bun add @upstash/ratelimit@../.. + working-directory: examples/cloudflare-workers + + - name: Add environment + run: | + echo '[vars]' >> wrangler.toml + echo "UPSTASH_REDIS_REST_URL = \"$UPSTASH_REDIS_REST_URL\"" >> ./wrangler.toml + echo "UPSTASH_REDIS_REST_TOKEN = \"$UPSTASH_REDIS_REST_TOKEN\"" >> ./wrangler.toml + working-directory: examples/cloudflare-workers + + - name: Start example + run: bun dev & + working-directory: examples/cloudflare-workers + + - name: Run tests + run: bun test ci.test.ts + working-directory: examples/cloudflare-workers + env: + DEPLOYMENT_URL: http://127.0.0.1:8787 diff --git a/examples/cloudflare-workers/.gitignore b/examples/cloudflare-workers/.gitignore new file mode 100644 index 0000000..ab5afb2 --- /dev/null +++ b/examples/cloudflare-workers/.gitignore @@ -0,0 +1,176 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +\*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +\*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +\*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +\*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.cache +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +.cache/ + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp +.cache + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.\* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store + diff --git a/examples/cloudflare-workers/bun.lockb b/examples/cloudflare-workers/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..983c9a85c13d38226563da2d7132b13f2ca3db84 GIT binary patch literal 53637 zcmeIb2|QKb_cwm&7Ez%Tk+CT0n#oL(LQ+am$#7j<neR1LW*RhTmIjgxY0@Y(Diui@ zR7$2yg=V4Bf9-Sc;q>|Vh&<2l`9IIA{rRr;*=Ozb-fOSD_IURFnk=R0&+t=pqI)UQ zyaFVh{JnU9C?4L_)h=`o8pXxi&(o1f2~gtUB#}rVzDnz^M0OvJSy9Zp`{l|z%`!Ib z!lX`10mt*F1b1f#e|Z3zAZ%qtB<_F2;p}wzX7&RXjU|!7UEygA#Muy!gxDHl^nNA> zi6jJZpr50cs|U?b0^U!AbQP#03o(u1<WKi-Ch?45<^MXIL>dS0>mU|{xC~;1bD5n^ zhj;>{cR`HuMY8!`Y`zVfZ_G|pAV%d2vEP#+Msn}TEc{mxBm5$E`W(av|1iWT-)4x% zLmb5BJF)o-*lAsek^HM+B+?{^bw{&sFF}mnCqoSX3qJw>jDk23jKl|V5#&epyTrD` zL5PvOC*6|<CL%>aS_IM|-p(jVVnQ0pxj>BUyaHlgh!?VB6Nq^rt;>$ppm3C)46y*j zS0G0DIiONV4^_yA+UXXg#UR!KWl+0Zgjf{fWQdX7E&?BwcLHLB=ScPT^8$TRA&uns zvtz2GkCzXH$zU=(=uW_QraAc|pYUYBKM(@F{Z`ZboJq36B$7DD@j#5~`xXiTp9sGX zG1B8C#F7yEdpXmobP{O^7y;Eg*xR4#1~?BPjp`u^N+NxnAVzj}WKfunP9C&QNF%#? z`ZJi0R5u#c+j}(~EE>qx!-YW$pm{MFR5y6<?C6&Yg`)cHVaM8_9I{s&q)|C^2F2CG z+le$1ltktE(Hxzf>3%-zA&u(q=oJk8i|Xd&=SZbN85*EG%C{C`gnJ)il+TaG@b(Cx zkycBw>gxzG%C{I|l+VqP;T;HuJu1!e7rbBK{)_uH?#H;F;{J&HDc*1J{(|=lyg%T6 zkNZ3B*SJ69{SWV7cz?nB1Kv;Zeu?)#ydQZvdU?~qWzWg6>fz(abVCm94HZP~=S*|) zhlu3w;*BDbIS{gg5yZ$&|Mb&9dDeSPcD~BegQXud$ce=hHAOp~DNIrF*m8PGZsJ?d zu<oC8<|RI+t|V`9&UyX5*4Ukys6Xk$rmL6uU%ae~$=9`bm;0i6E&pV_*@0Z2E^5rb zcj54kb0ORU`tms(yYAg-50_Y*YQ6J%{q~G;LUX_F)M=UQz9n&kiom+1HMv$!8_37q z>;<%g8uu_i9yVytbDHpdB%g#}yN5%{&+_e;W=$VEO_d|A?r_;*ezBX=nk}<T=yrYv zQxBwMhPt<L%RGD$<zk||r{X&Ol5U3D2+xKaq_(-T&76j#g^ZgIoea3GWRz%saReXd zAyK8=N6pmb!d+d;Rz(^#EBy!Zlf(ql?{F>LYtrO-<JGIH2eVWzYw6v8C6>Ik!e`+_ zby+R>7PC{n^=%!-t>15iEvWIX%3HPPg832dnK!@23!ci^mo7AV>)|ujKh~96*Yc;B z?>|<suH!z>^nD91l)FrhecH+w!MP|WzDq>)>rIMA-P^gwVb?Rf%k#>7M@#YsxQ0Ec z>XxsmKN!_^LvyR#-Z4$r+J!}4x8#akll)P}A<sQ;d(xQF>|GllD2cC;dpWt)@_|;; z)$NMQx5%E?(;DfmTli*CVqWzvQiR1mt@w$0Je(R_!92kq&Odu$kRRG9KwI6dR<h5* zl*%i;(YnH*!$&@st964^zF?zegF*81uiKn+lV5+BEL}t6P;$=7h+&SOksV}ZzHwYq z@;aSBlcdUHDMEQ2Tcb#7H6lfYspoD!IsbIqy#4On)Ry*zJG1pU7d4p<OD4^x?-Nmv zn3hu}GM^gZXMev|$3DvMR-N8mnWwXpwo}9IxfpP(aO>w*x`&FN^W8nS{FaseXQS~a z3#AT}1UOu+HK=XOF-<F(c|GpJp4l~}P60I+-^=cL*C0jLUoV|$>~cz<I&Qq&$(@f< zUn?(e9nM8IU6->}w>T$0QYfZv!z<Too9sjl6m!>(u-mV<`KXsM-|2MbmIs@hH(yvv ze|f0wP;B1pj2~mt0;63T6fFJKc@EZ8M03@tN=xjWC?;(cXYJ7Pvn$@Qy~DpV+WPH| z^VbBQjmRx%l+gQhExU+c-HmLcvZQ3hv0Kv>=Y8*3A^35c^3hV!CjYPBug&Z%rY&-g zI!!B`u4Q@Yh<kv4aQ6zac?NMKH=0#H*uSqx#Md*27w;Fi|Kfg)`!VjPxIf~4iuW75 zzu^4>?+>`&<Nl8OHSW)N|HJzi-e2(kfcI0pU*i1_???8Q5>upal*duI8t$1)QAt&Z z%9~;<T`gqhZ6*`)f-@$1=~R<~M*b4c`r3Bei)*@*WWs02$IzVCw78aR82eWGpMH9z zI3YO6{UN<*gxqCwrHIcQFzyT`z%+{mH0bHV_=fOch$rFiF=jvi;Q4YPk2c7|a$~@< z2o{(B49~OK<)e24trsr800b;R9z?MKWA%UnE`Ju}wLl)0J*0&Ll4NDV<;Q{`tSQ4$ z{XHtw2C9Bf{arzx%GMuY;<&$41<yAe3ZBW9ho#Ga11>)a*0;t(kaqxilOf2bf&9E7 z$hQqqe-*Bwl^+7~^M{~+A;=HKexqP3G?eyR2=YU*e*(x4rT(vnSpE#?@C$}u{}7NL zivEQlKcx19MdncKzXarm(*6lUEWaA$hho1Ou$dW({ro`QYzXb25As8?KY7&9>c0@= zhf;n5$PcCcUxK^?+kR+H80Z9s&mRln`~c=nZ2m-(5B?rK_ZRSd#UMW)<WU-if<em* z!6wy+tv^f!gVx^`<Y%$v;hX{O^#&Ah{WC!x`7g2?83@&3AOV+u2lB{%NOmv*mp6bz z2;%wymJ<UCxO@u8FM;xr5Rx6J9=Lov$SZ;TK+8qtpn%KE^0VrX-oX*rpvw;cc|~^l za6~g``yT~))PA@=c#QPvFW~v!g1j-vBi|d04RCoyIMmSxdA#4@@B1qo@$h_}Y<ZMM z7|4bL3AlU~$fNZ?lKGSV)5w-bc*u9~dLX?10$#p89FpPt4`jc=%7=hFvOkhT@-Una zDB$Ja1$j8b35T;)5-i2AIt&B=mmdx1jI%%<*$y5D?SISJ@<?~FKiEIig8VWlAH=b; z2WvkoIFww#mPa}acKmw?@>U>^${nchAzg9%O@TvfG=Jl5kH1HG`U`kIFOWy=kMfd% z23!9#AdmbHjoU~EgfWnSm;V*yRoU_|l@7Z6>EL*1|BUn=sP0HVynJW2JW3-PC<ZQn z2;`CfgDB?zC>}__<;y`{1>{j0^`C(TT%H>SZ6uHEj_f~B3|w9t<Y%zUM|DRS0|~gi zFUaeGJd*vB{$~uEZu=p~9|8FlLy+$VdB-8h+ry&AZV2-EAWt2FyaaqVQ3rW6c1!{q zZ2zNzJZeAGo~R8G4J6?0pA7QI|B&C{G#L3xkVo@3UjAU$e=_i02-hE#i^h<F1YCb6 z$m8p0B!|EM9R{B78pxybFWhc3e<#T1<MN}S(H0Tprw>xz9pusYgW4U(90&xSHwEO? zKpx5b$^26e@)VFq?KT#H3^3s3i;A)IN9jNDpT%r>B#YJ%0}XijXF%Q<^hff83AlVa zTOOrx9~cM@E^iLsCDHti(u2_fm){NYsQ;k0L*?V|f2RYU?-9srfIL2K3{(ePejI!+ z)n)6C${(l=aCu9RNB;Y#?H3R7+U)WX#$d}YB9xD02U~wmNml>C<?tAw`VDyf4JBFj zL-RH&f3W&*0(s=Wc;6kY{8Nxe_8aKB0aU~SuKy${*7-Rq7nU-EUcYYwc^4>upn9`P z@AdQdAdmbHmmg?7aQ$aUlSp$w9;IO`K4|;<f;<{OaXdW6_580G&vypojoA95I^ggB zOAddJ=lcxusQ;k%u$9F2Q0V!00hgaKnMAT2g8Ukg$G;!_N%?n%C_jG6(8_ljqWme4 zHy?uix<KA^2=cRKh9<vxi1JT{C@(HMH2qzND1Um0@|{DJH=0T!%^gDfZycihgCWWb zO&gm2t3V!&zi7Prlkwxo5apYOC{K|an*QM+kLC}wZa~C^3^9O!kKfNgemThFX<YO= zyoarM_-NJ32acQ1gDv8(0ne`j8xFL8Lvzoc%s<ZmkSG6I%zviv^7nwe5|lrJUH)L@ z3qf9it^aVq7_2-=p0$2JvPcJ9FL>-X;Q4exUWZ^m*bWRR;PT-hkJevs42bPr;d91- z0xq8m^0Po5=`R9=;(-KQ{u{_6|KkQBBs<vsvmzWGq5T8yKRg2|oSg^xIwB;C%0~gk zC_R!LBRq62jN28(sGmpz!O;y``(WY!<`~r%&JeJA!CDrpzaCaA>}&%|!yXR{#2CpL z0HN3r2n9nR)V4-IC=4b>a>kexD@M3;fKY70eve}0BUV7@{bC>_XAOixUopzJ6yx?C zBY7J(AH^uYEjx{3<d>`1>4C&Z-kzNw#mHZrfKWNk?AQfj6i|%vyP^byzG5Ut$GEH* z`KT{DjbbG4$4;Xdr5Ws)$$pPw^xmJHMlr$-1VZnF*l{pB4uKd26eIoDp#%hCjO0Rr zP#gw?0*cW-Y&S|k_`fkmWB5Ky`+>#Cj{AX-9S*SNP>j+C*)e+kcf4VZm&h(!K*+ED zjyEhnLE{VxDE>R%{5sAcyP$Cg`OV+)hBa>ge!S`C>qZ9qUmQ3{EL<Wq`K)-M=d<l2 zb>B@&ewMgqnORY>z25yZwpX^^P~@>)`}%#H5$_MiyWLrv7E5|doHWlVxogavY+k?T z)2Bcl<tr63pd*fp#!@_xr*RhCF_ApFZTp_spPO=aT~H4R+&;Z?%eu#79BRzsI2AeX zP=Cy{kMUpnnz1BXt|Y4_TsXsf<h|BS!dJuNl)jY#5RQw+8a$AXSkRWOj4|KN*tTP< z`o1l9mr4ELso!>0i_2ZK%lL$qhwJ-Q*{c@Z5mTFPef?&~)QddMKQlR%^6$;2ee;`o zK=>#C;kd;0KKb*Lr?(FIJ$-L*KP7JWl5ZN<CYW)LT-$X0p+N5V?*U(~O!ij3zj63d zu0xKEP3?Y5en?$SQ~T2RP%`*lWrfWpZe9W|8Uye^W|VJf5lw0h8mGT&O2IPbQq@J1 zHzmLF?9|iLDbv(UXk35I_el1u4qaZp$KD)U_qvanS$?57vF+KHsHmAg_u8lf5U%eC z928>m%iPi{PY;}pOWVPSd2+5)E&H)(J2hBJTQ7WJclrIcl_E=ppIfB1Mao7dQT7*I z@JgL%t?_pMEL(~X_o%SZoR0~(Xl}y;nc~03=+?$tqMMyQ?vK-|>9la#wMp*P=$%2S zjK$+(>(@P#nyEW=#?IB190~c;kNprn7^+z1uw$3^sk55<(x1-H2OwNud|i&P$rEZz zL*5@2){%;sc3`Xg*pwJG-{#Ej>wD+kSLfStTS>gZVsYB(Sucl8SpRBzabsA%gNpc) z$K<=yf<~tacFS+e#BfR6;Si(sJs!v{;luTF9vVij7P*ldx>B;G%;lQMSWBtEldJB8 z&9hjzM6gzF@#)#cO{+IwvYfRxX7`fS+Yi-B2N-YWZB)~KkuM2A9I$f;hnTqkAYUGS zu_?`M_eTZh)Nuz>n-k7yR0o_l(M=w)<;Rbd*Q#{ct#i_x9Y?;V|Ja-K?V|d%I_DA6 zG5aN_RyU;-$8Xjy#&F3PF7gdLkT<033iHa8h|DT_bm7O5z(9}vFARh%mX$1<T_>_I zd-_(Z2>KR#36060XS#WMj{kgRm|OA^S-n=3wHE@Ej?Rf=?{T;d0g$-gB5zq)dB5;p zqe#=aus!uZJUaF-DYl*vsjfD%TS?_>)qDxrx5GNS=QF3v#)&VztJ63?@}=3bn+w11 zZ{4*_%ys1r_FT>_3Ak`AuqTjfr+=nzv6wh-9<PmE@{G4n+g8*CpZ@w{%k`Bt(kB*B znUls1E70*-WAo&CNlL=&7ZOkF{L3k;v_7oNs{R@N`g}bgagfL)Nr;L2Q?inQSE&}? ztPA4nxkfjZe7wzUdtFMFjxOkWB00@|?Q<92&tE%_AHTfk*|4&D$+Jb?(}Pn=g`c`g zw?5L3;teT7Yk3&QFc(8-?|2}`s;SNWb~OH-#K;H_(OI_1VVTRxkH%a)mX@Yt#hiK} zVAIuCUIqz!sv3>fPyEnAX+1#}tTVo%J^b*Zm7H4^nO^}QgbP>8NQm%2zMOaB^z!)5 zE|n_s4llRsc77w9K7P%<BPAQ9dr$gHo$Cntj&P>z+`B&`(%#+M7sjxBtafjqwcO<{ z<&$$t+VgJ$5a4nmOmtR-2QuxZc2}x%f%PP3>c`{L){C1)xEok)ko>Nl9^81ip7}F= z&u;EDwB)3~!-h0B-M7!Llr_9(eCW(>FDs>Az9jStfB+ZMbu11FG1+6@8s^=f>zT^I zVw)@}v#stu*kX2PQoGrmw#1p%9b~zhbsM~l(hrKIT~ZZ{ANE6gn{VcZjdLc-t30`1 z7*?^IwYLbzaM2zb4`i`I$JgWB%aSiWH=E{jVEMGy_JY;rb_YC%r|r|I3)GwQRVBQI zM|9$`O^mqR3P*)4#iY1WDx}jYQg*0@ab0O}1Rz{rK^zofa&+XWRh|Y_e4U;At=xO} zW)zylZ#iBYB`Bizb8`v*ePM16nJnS9Fq4(n?t8gvNK{<&RU2mS_+9??thN}pajT69 zxZ{bq4_7Oli2C^@<H|@2j(b9-%1HuCJ<EiLh3%nkj_?v0Z@kq|_*#`U-}|DjQJPE5 z>Xf$SRM@=!oIWSRHRF}INI@Hh%Z=Fq?Tzq2mfs?sZgtIPwCJ77S{A3{>!gFu@-})a zxA;!nwP|^S!2{WMKR;Wkz6}wVIlB4X0>O5p7VV}xRMDU958c~Bz0?u_2=xo(4{+Aj z6Ug&5kLWS)2U)ywyDQ+dSLNk}Ea}mK{)#>}OuOsRuJ>2U3=92y{Hbl`MY%HPk9X}~ zzfj8#HPd=gowsGdoG&x$$^nT3c83U8xCa&N8@^*hoYQ2JttL%$U+>$2d>TS~g^agR zX**_Eo=M+kx>HJ_(OqBEwtBpLYTVAvdxQ!<tUIKAwCgjK%Uy)`Ni&)wpxwAphnq;m z<@4<>6#IEU!Oi~mlp4zRo2en;!E;CZf70qs`uTLlgsKu_{yXE=b^9*O`J8dIhBo=; z^*v=fgonp17nZ%y@s|HOhD*jeGCG681G%Z#E^FWI$Waob9$pilU4Q2^ecX<&^}Gsp zyT7k|zW&fQ)11p!yhcaZ?_ac&`(tS6ak+fk1t;^*)E$X%kK9;Xx)OkpzGR5unnh0_ zpX6mUcRDYf7yNO3kO8?YYeJF4(=l6)-cU}Mz*ng?rKL{r=#`dvyR<G=eos5qF($UC zF~oMCUO|gjGv~+i&n{>J5^6VuJE;d1?8|*T>ga@`^6~GlUiCQq`mS0)=UAy+zsgtZ zs&38y%FuFMLEBpxyXR%bCMQ12Q#ahb9+B@TzItxl?)C8tr7rWjIfe^n0Hwu<xEHTy zUGa6^5UX?aWP=K)U0age$72bT^(>qur^(&#bd~@1@^S&q`^w>{v6DV8KT$-PpS9y` z=EWG*#Mjd6=@bq4zJ}?GaK(wZOYi1<&7Y&1w^*{B=gZl}4hLeoSMW7f@-wWnWuDJ^ zV{^l^+-&jVgpUf{(sCU;r&)hL8a&ng{`6}LJ;c9pTq*vE;lhd!a3zSi?x!j9yL6gA zhDpi^*}gR&S!#T3RuR1=vG$YvoO&963@3-_ONq0ZUgP*XO0C0c=4kD(oBv2iO{Dy~ z_f|W1t2G#IICj1vNyJ_L@Sx!R`m<X<#UH-4OjY&crui+GCY|22&fVcLIefyV9G$Xp zI!~Ofwmjt3FVwR7F}u!%zNmeh<mvi#=@fBZft?sGYyB%l#H}^Vn)dnbn;SXZoW(yD zEG${_oiTRh;ZNtZ7Ia+j@&CL^&2M$M+>G0e-=sG^^WC%l)>vJ|f~BPB&i(mR!#B$E z$pl<!B5v9<J-tz?XG7$ZHoT7TTT^qfrJ-H*@q>N4r;HkIsCF%VM0&!d)X|1If%g}h zulmqjGtuzM#$$_ll_wOq-4wJQ!?G_+-^oN=ezSEN6Cdv!q3b@i%UgI_{)c<XMWatS zdhI$;yC9H$ar=)sFFEV7cZk$-e_2a6efdPVWW@5bmSU??)>u7K+gSnkZJ^0mxKoI@ zW|{j)56jI>)7>lfn|`)z;2UEXfBu<`<m1hw&*iC1(!Cp}x_!k)snH#!8GAfJsO4m_ zlUZ_t?&3B_#~ey4iX`fb_5^q!n>aE#3sfU3FJ);Tqm+ayXE(&WWTq$wO!%g`igB#e zWx?>ZpW^3F`tfj~vn&^9=(}=_C)!FA*PfEip4h=PF2@>xaD8QQP>9K&U#6z02U|@G z+QXw|w$<(;U($nwk@o9&xF709aWkGJ89qHQ?7`iT3(7^;yOS(rbJucN4=-P(_Es<G z(3cE3UE(@*DiL=<#Y(k<PlxFSikzBZJLxWc=@F9>g=PF24kN|9Z5p0$<SUKH4H-Us znB>f){jL15tJZdE*`5@%J9E-}Z&Cd2gW-UM>pP8zdy2t*N~R##=e~=0?Rwj=JC?RH zUK<7O&A;rX_WXFcv0LZ7&uuB<mxnoU7p<FEWgQmpWA7SKZIiTB-gl=ZXG0PJSB{A5 zaP~IiUbs1T$qv_H%EN@K4x}vC<{@R)EIM0uR%wyBiKIlW(1ilIw>I5(XHMm|Xwq@0 zHkdPWV^cBj^~L9sZ+sx&PAB4Sk=*s}%dGO{+%^+dJ&lca@HhBoJ&Hd>L?<_!yWUiX z&m=sweaZ05^l>Y<SZ04Yk^0hk!*GV#E#~k{(RZ$SZ(kB{<%zhu4}X?v7R`CWwc1uG zVwwBGht{r7&(@k8IHNdizd`cV`|HMjbje;3yWtw=?kx#x_ucq>-Yh!#z}C!|@FUAa ztM0JIb(a6a=YyU=UO8zUN6@kz&mJEO%#6^CuJ2qqEp|d&SHqfFBHP+*9xiLmad7X_ z-JaKZu!i1Nn88=xP?`GRxPu8_Vg8dz24Zgj32!&lNAN(lr%h;jIWwt!bGW+SH?xPw zIO?y4Ep;Agd&1}7!TjhAnde*7j){ei+BZzZRPUB&{r1;O+UDF+au`)h%czSp(Mbd# z99IDcg_!Il;!|T_^k!Uh_}B0k#m66=-58P<JWg%g_KWXxMFpegYE+$bOIS{xpCFsQ zTI8jDM>$vVxWkwH(uE7O8iM9-MQ5`(F8l_gCy+O0GqtbAZ2F|PtD?HYcjG$i?>33a zN18cj%+$Opo~``)<(kuzJ5*ZFrG2<17#9BUAxHBf#&TIwr|G-1VKU9<S_rsGJ*c3s zko~6jCRJM7HNU)Y(|?}5h^N^udEQ<>&dXW6>znVMKcT$S;BvhEw@Yu=t-bVqddBRN zZe3Arn<{nn?hbn#MHgux;3^Ywtu#f_n)mEJD-|!SYI$J_V~@}xeQlw6oAPePt~w#g z7}gnRQ1hUZ+T48inC=%^?uEU(6Eioywa%ZQMO6{<4Pvd&SpJ|w#JwOstNQY;&YHNa zB~RApml!)NPn$kgYrJ@olS-iQ@bpniUn-B?$!g8{qOp1Z`pe-;H!?0zlR^x~eho4^ zpliZQ>=&v;T;>OgR-K~Illi_eVNYDXb9asBSVM2Rv3YmlwTtWRjyWD%cqnPs_GR(q z7V*#RL%vzWuU>8zQ`P;+LS4T4#FO{u2zF2-;*K8`@M8XjXSG`vq($7VHp%c$C|xh} zHIB{@iV1k{R>fV|%(#B(Acw{<+c~RD>y=&h6_2dm+@fF_YcfUjU>pb9Q{eu9&J6HC zF0QkTTYl@Fj=K6|E-~%tAu{drqw~JVL=WRLahf>gc45JTY4p(KD@kshT8zl_nN6Do zI4&kPjtwsST&Q;6Vj1#T99IJeg_wM~b(2B*PuYM{^2!Vk$F`8um!lThh=kqxxX#>G zcl1pu)xZ>qOkKfQ1<S(CUG|NM+AVUUT;$>Li8q|PrkI?*y^Vl7lZgB5QoP6Es)wP6 zPCns@G1#!@S$5pP>P^YFTe`n|Bc+^Tq>IYj(bP`3R>OJQcE_k^HVZ_2Rb7`~y(Oj} zy2EJlG<yOrTC3rKEOo~sEZw5EtVzjg>d&*$@6YdhTCSbdoj1a@>x%F8u|EY&Pg{FG zES)MaDT(Lh_0W`C@)aB0rzH$m%!?g+E96NO0O5Af!a*S>zZ5!pG0TooSQ^f|!q3%H zZJ*PL<>L}eI@h>yevN9}$uXf_MVp)BaY#gd!?SXO-N$m%E3QOQRJmiTe+D$~*mQ}2 zt4+j>{PBEF%Gkw$b-LW6&*Vgy9NuGi<yg*2W=#~|ithy<7`)jQ?TP%6p6&OW(&i}W zJWG{bTPk@oGD|Y7?!Dd-9kfQr_0=KbdX60%E<M@6)8PF19ePx9+#&uYpKZrYRN#AV zs#wo`%jm>)E5lF2&o8*}WplB*v31j9$;IkPow4zkjXF2kR>+~T9LLoq;_jLAWzz2V zcW%p_;_GxYSy^$v;AFh?B(d{9?4!%GAD>w4w!{2-bMEF6z47Z-UHz11LC^Ewxk^|w zc4wQ<JFRth;t05UMBGa?;%RG+q@^FK*t%S5<2$hhkq^dbC_VL%oO!G`-Y?*i0`D$= zm-^v{Jo5x<OhqENWVolkYF=g1xzjGiVO>CLEdf`bh<m=s<jyvR*NjJ>_dIzMORl@} z<c)Lvs&BPrdLt?)&vURyO!F>m5RF)Ezv<HxlaRO<QB5CxrdP$<UE>pw*RIP&YZ2TI z21HyrpJ%R5J?`u8zu$RNd4ggg*G{no9fkttjWI>%el*@G-uP)@jMD=S*MMvHE=M!1 zMaFS1AUBa`N>MAtn=F++787s{iMT<JOLvjFS|)C*vMP`)4_uu6Q0Q)OtL_3SwSj!l zBR2k2+S*w{l?^shx(+_Bt4gPDG%;m7iSl(4=MA_pDST8I0e2P=cjfVAB+Bh2-@ctX z*>Ug3cwXjWdxNV}GVF`_g7)a#`ZWK{fs?zpYrPp4bT6k$wDQULL|4s9&5woZIdVF( zT!Fg8dDDo98-D(V+#~;PeH~7zT5ThXx6e%X6&B9-Q<HXT@Ql1&G|wTZa`F;)nbj|M zZ?;h#X)2SwYt)KEZk<o^q}F^jmMOSL(04WwckJbK#)oevXN8;vjK<34&X?P~(_-Jp zk2juAsC|5xBa+9h>~rp3<MW3CGH*CZSIJ!Mpl)<OXm)ap(t{w~hvCN}2)O9X01xCQ zTgIhx#m=60pPwpOA}JFzk9z;4TOr3sHyORVG4Fix6b~<5FMFz`ar~XPU!EFdF<K>j zNpI&KoP72CnmLuui+2GK?hkWtP>9Lj6S}@hzYm?dPuM(AUR?imkwR$o#i*as<5Q%n z3$Cj<Ett6R;Jl;n!l$2o^!!5C6C<a!$LF-ac`;LT+1N$HKSdJHJxz$XyhW=-+IQ89 z`+IEO5of*P?q`Q<k9U}uzDZt^Zh9_a@|vA9nYZVQJwD`YR-C<eiq@H}!`mz$y*z6r zNvC>w<XK$A^ktoM%_ZWRXl8%Z8L9k@`;hxZanGv6DGR&uRWCVPE?e&Kz5cNB)DnYp za?km9bqb`$a&7-|Xq6iGt1`KEa?!1<Xm6pakI1I@xyC#qu5~0|(Der<<?oFmCod*n zEitMu9`@mmPE*~{*9&$`czyE#|1|rIHP@Uv;#+l}iHgT}jog<|6}3=oljglpB{QR& zY<<ZPn-X#59yXe;Im>m@$Sciq|C@ySmS?w*_FVX=f-aC?T~((Su3W%tZ(%GpyW#Mt z@8g%2oY=>~E3fc;3wPD?WA3Ij3D!Ks+RvL2aaE>hUowqcr6UwUweDz~Qc)4mT|QlH z``N7x>)$9l9ezFM+s}s5bMIOX-DIf7)oEXuAI2}(#QgqchNA3QDVoV4OkdWz#GHux z&Up?=JtiY_m$#cs;->|pQog1?Tgi3!#52`+6?ye}hRc_w<tT;CNEZDR^)7hi2BT>o zRt3BbklD6ExvOCBgLc+=9}9Or5jTH=W%YB$+U8X!$c>&SMKTjdMO#*U4$u)3$<S<% zw%{6TR3ANAcK#&SCwa&9uB|qa-+PlUar;?^*5HLlG(*pwCg_XK4DdkClv-wG@z{B6 zRU~Ob<wLV5!}(r|E_qGgAyhE4+CuwC{EqDXbHA>>ES`Df`J}=PKDBSx*Q_b&t}Poa z_#=udE5sRq@P4rX2ZfkCJ>f`uPI%{RhgPlT*o@on-k<e*Y;c6rL_OPi?c7sqVuSJo zJ3IDdF3DczSDYpFDX@0rBio&(Ke|hlJjw6lKUorR(K8;%_DMNilHKCbhxiS<^LQRS zI=#T?@)UmM`Ad&wj;Ph2lQt_=WG+wrha;Cow;byVGx?nN{(<a`HD`*mQh$tpYpD7S zfN*^m;-C<d)ePK6tGsM}c6wX=tNPo95ldcBmM!yoxmad=S*%UI%4P+6X7>Z51?MX^ zmXX%0PuW%!Q+T`V>5DJ(52Qy{g>yy|a2FAA3%^YekQtd|WKrk2%=;04LGlbGrjeED zjWu(Q>=muMRHe3W0r`!f#N#nrN;nTVJWnV%u{lhcVpqDK{(|EC<L*%ct`!lNc`TH7 z!(N+{iq^3%j#HV_1UiK}{KaDzWuIC5Y`B?mYw6f+ytNChx<9^;SwS!0P4J7HVZH6V zOyu?#r&N-*sS(#Di;1}JY%-6|IGwde^xZdWs?`2?VM$L*u2*e~N)IJToR}<ZBmc4H zePL<hy!2y<D>f`sRoidM@lJ5EoWe1^uS{<jH`aK@^4}#yT*rfji{*YExg#-cpX=_> z>USbJQIm7E<PQsfOmtg4Ls;xsxcb<K!>Z5gG~M0t=;8y><_9@3U-kS~Ek9}g@_TjK zDS{o)nE@WiAC^|xekk_LSE#BB(aaj75^ra@QAk(m`j;Ed&(DM;N_a7ZXa`>0e)2Bs z@J615DvR5r&ur6wQc`z0xuyNyK}|HbBY!~S&Qcr{VsfL%uytWciWe(5v??NL+m2>? z-jFDJcRo$2=-4FZ+}D(M`C`K2Im0`|Z1x@Os9Q0A+rF+>78*}!CCLX=_Xt&?ISu!- zWklT8C0{B#kEA@z6q#<c;-Rr2?{WSQ`ePNR?mbmqz0fdW<2m8FIF*LWYD!Jt)icZD zm3c0|)IVvPDw3v4mK<Gv0oNCOKei#_HaB>@&YQXXLCR_W%rBJK#foCb%uM3Kt<Cic z-7}(_TiU!A_&+l~d){AZp?G9d<bER)4gG+h3HlS9Hr$xYrG)m{xW2YTT<7Zoj&HS7 zbq^NRqy*f~)4u-U{23kFWxK|1uAbYWbD~n&N-jZT#dBlJqGxv|E>J)7&THPfX7k`> zWYt#<iH}X}3AoFNxFefF+cpPhwiV0P-afoVB1EiNynfguE`dcYanF}Z#vG7Hn?0}i zXTH`QwblL#X0fX7ooDv)#@P-_dNq-`Rdp0PGsE>=LBu81N}7@mrAgad`*F?0H~ZUe z*9EQXhp%UNP&?{t-<NlNy(jk0`Qn-2N)O&=uAT)4zJAV9ovda2Sw7yQgRW?Mgn*0A zBJe=I)ois|>ULF{!?+7eV{P(|dUiyYm+UP#a&^b<M5EcY{C0e696!u_-QF&8`mFvw z|E(?p&JlY*M4wAPMP6OgY=!0?TwgmJ6k@XJnf;{aqu*LQiQ90~rCX0uZ>kciBFZaT za$wqVGnKLOCr(#3%B)|Z6M8mOU}H1Ku+)Zm6AW7qoiv?0@zma+mcs<xRYctA*XKS} zO#L9_m04bMd5mq<X*GdqEm``<4hl(x76?{t3!d=0GE?qKYmVuQhu)HJIY!Nz>K-~< z|D9*0wx0FG`NZ`ZYC}AbWh`2Qm?c{sHI_)l+;7koSbJmiN^*u+;)ieCS4ZqP7i4I& zUEI3T?Fs4o0~zhky~cLTI8S*6MNVqG<kCz*K{O`dc5uK!Atq0|xoW)GXRf$VzPgAV zYJqZ_P8}`^uuDCwb7+Z=cv{3Tv6pEt$2IS<lz+19^w0aZjXj<}X-=PL_11X<Q|Pkx z7qrH~aUF@ccSk%8e|O(>_v~kJ(hAF)zGYW6k6z24STxUEEcsqh(8s-gmDTwM(<lY; z%*}<liJcP+qDQ}z)amqPEM%-L^35mUIuUW5u4k_CUq9p2L?;D`ji$y_$}7)F?I%K% z_$Jl|#=bTbQ}ZqT;>u^Z+~-`}%hpi|CpLXscsWH+F6HC&i~7;y&lM4HsYKkjJHN&0 z?`@Qle{ye9<Y#5iGfJ(dGs9ahG1q&#ZYsE3`zH3HsX=Y+_q8DxrO&CEbU$-AbFg}| ztkkjNq#N^|>t+*h(cFv&a^1p|(0STxZhqW7-R`{hD$3&NmnDstskNS4bJJMA<LMh$ z*K4D%TBuduG_Paw=xUjLxqeFH&=#7@k`YS_?Kb-o*E=*E6k>An(L=g3+>gGB*_Btg z%zDWq@fY!(Y1|buw>9sDMXkIa-Z<;VgyS5cKHqGU5^|GX+w-}ui!*1WW)?PYRDXMK z193m(Lc~p}oN$nNIh4yee7(3{+xAJ%)ou9n6YDCPZypI2d-DE7Ue<$I<>ziziqTuv zd@fz;$5A??dBwZ;Dk`?!`H!zr9sw5a53WSq87d6DMP&ZZp~c%&zxt>NRI1orl_O1x zUB2ygeXN)hkIjo8(Wl=|Ii2{XZSnfT{H!I-UqX~~lX=#<i{6(aeLqXUbtB@Inz!1` zQ1CVKBt4$6``L=~d22@aeZDFjvw8jO86!^I;D2_JvY-CycvsF5zEr20xCGgT;(L+i zR#T1ETdsQY>?ZLXoKD1jICjYw$!%Ats**ys6OLHgx#R|9tg$Wo>=UV1Tz$s8sPL6v z$9o}}6Q|}TWLR6z`lv^pTfg-KABm&&Vzrr;pfW*UcOq`9Z^_NjH})@08l030=XveZ zR{nlNK)oP&O#af-#Q~{2?UjzrO+{t9UfmilMdwNEKD_vx&=t*%^8`N8?<#+|fY$!F zeOD84?M6=~eQ=ilc9C*xk>8iOvu@tW(2st$&i?XFQvGATdG-5W74PzNsqz&1QJe6x z>?~tWWR>*kvRNVD>}zjJd$~zqxUBEp9z@(3DYWzVd95Guh!@>j6E#Auiy51IYnXNB z#h{zz94e~8MOL3ubbkKO7ux3>_-szQOw%Z_`Jo~fw;pB)W!ak^ttQ}l5^)77jSGh# z&R?!@!Nzb0N7aY!x!0_BDW*LO`1taNTHDP`Zv{$s>i0?)DKk@#pSpIR=Zl#=eSDIa z|Iy?f2QtVTGYGg|MBEC=sSzgEb&GPU%CD6EtRDAn>4;@+DhEAY(~d8iHhofl@zf_7 z&KDfhho3C+RCxHVW0gx_<o1RVdrkd~H@`jP_Q!Bp-%Y)VxT%vw8K>JqSL_OMrJ63V zimUr-7B&2}nt{+4Sqs_kVvPK<?Ic<EkMZBn9<h>8KRwO;xaNmw`qg5o>y;MCTPFLm zaiQ@@K1AGU<0j;rxE&Vn-l?HBqWqE3x-lHFIy`sI`0HOhx=2L-iH*>_Wu7Km?<PuC zoi4h0vP8(g!e{J)qtPAoha=ZFoVv-zMe8V31|G<t=981B-s%=GQ#~5}cx8lGsnt4@ z`aR(jZXY&{x8Av2G9$KXKEqHzc(!J1Ti%L_JCDkzEgozB_SX8fYBv15_hSJF?Ki_A z_QOFTCg0s0`cZe<b#sb!g}l#gi@jPhlns`JTD4-1W)ULmTOw!+P0m@ZzBs)>ZugJ5 zi}nP)aJ{H*Ij1^%|F@`fa!*B2UjP$uOG3;5!UNea<dWAJn-j7D+^Y^$?Tt+A*f2AA z=A3&C5(eUqM``L=<Bt{CbnM88*{!9NnW(vK(+*psK-Eohk6PZH*v<X^!b1Q8T<jhQ z69<KuES2psK7YPV-X?+U?zWq+<yE@W_Qh6w_A5@wo06#2$d`XpOUKyMCh55Mst4uo zeUg%s=g6P3f0e)?BQw^ptGfonW!=|6zJUkwkJ18B*_N-n_o^$ZRBB!=s)$}7lP9o1 zQ_1KgH<z4##Y`tP(K{#Z%(6-n%6t*Y|4rb=V-dU2UecW=uV$-E?7RR#_<lYB2ZfmI zSGhRKKlXZMX;-Yxv8now+k?(9XwUPeDy2Gmhp39v@0FG9$rIwU&}t>E+OPRzZ2D%V zzFN$;xb?GFdf)nNb_~O1-6sen;?}OXl5{JzEO`0mc`F3IRu+5sH3rh>F4(bGr$%_v znW)fXQ^#yN+NtArNNco2*YhK{+gF>KIH{cQ8CyRm;`pvEw0A}AhW-g6;$AX-#Mo@2 zruNNIQa=6riwiC_I_A;*r@{o(FMOe^Uzi{`WzttE+jrsfqOX};ma6@DCB*E6Q*Mp9 z&+{C?1f5p}7%nFU9!$hN9(gcO`|!T3Z_08Rf^tz(R}MY*S`+cwL-m#9GJ4>L?=>s$ zO>djv#<L>%i}8kv?TdsjYllUS(e-T>e3ZI;>h|{-F6;hT2oX1gdzf72-LvYHk<YEq z8qewy>%8`SMML*E8`J5v?JM`K2+sRZJ38@^UF&|EC4y`8%EHUu-~JwSW<lt;C@Zt6 zJUcO5*8Qk8L|k4D_d55dBPGT;Y`7D;`vzPwJ9&_LB%M!c_Cvads;8BvTjSHONA^++ zw5L5kp?62eNJD%KHFT8Tgmk|Oa%~mM&sg_i))H|GA_Zb*oVU&!eUrKHXielK(-g1t z#f!zyTbFz%eVs8UZ+G~KF}kJ?%EG^X7WtSM7Lw2s^kK_UH^C9dMliR%)JA7IsNK-` zu#Si;xl?n>e%_b~@?V8K73D1{Qa^TfDbEdPq8kZs2qvxO^--%Y8h0aOaq;{s`56&U z$Gsn}KfKdreaW(<RJF?*D`vBC!yyhO;_l-1^K(jH@^-t!i$&+N7S6RQo%JKbK~6x# zIOfppDAJMok1H<Cd&~2q)x)lB`Gc=o@qS!uj<iqiIC|)j_Y0w~Xlz9K8bTaK#Lb_w z_}%2MC1LyJ99J29uQX3R=I^jpbJKE@Qw^R><@t_{lSSoBo+YQvnKbII6?fy2T_H*e zDcmh5Hp;zye|KE_Nj5G&#NkBTw|A?DJ$HB(dUpF>m2}S&*((A+(j9G|=I;&MNTI7J z<OWF$6Fe2De)f~b#jB~4Hh8OO%1DabN(&TvGUJ|~nXD*=%eog7LB#cazVqdA>aN!Y z5eE-!>3X33{IF=m-Ln~vS3DbRr_9zb58Ku4w&wa$-`D3K?AbAe5-2Pb6ckqD7W^hG z$5Hs<tK%3hYd;@J#0{Q8Pn*dnm9<Fn+WEytr-uI&8h`J*^6=PMFZ`927Pgd!Cw?gi z{p9QQWp|a>nWm}6i|$04UAsMc#EO{Mhz}goDhRkyMBG(6l8dw-iHX-1G#i)-mTVP| zHX0?z`=Y66WD|Fy)(&y0=~-h(`A_&1C8bz4Lrm44QtZ7%pu(I_yuzaF`NzG)^=~v0 z_r};tn?l~_y4;WMxPEGP=g55$vijVN@-1q6mc3)-W~PXZocT2O1#k4-$;{cy9%gvV zez9SbyXKG7G5dn2rL0RIP0%-nh&y57+q>~1(fgu>{1;V?HcKH#`_sNI=hqT$PZbg$ z`N@{dDfMwik==}J8S}f}{XZ>d-XR@)cdwXBF>!-x_ASp^0xp{C@IX#5=2Y<*nYV7u z;Thj~x#nrTl&Bgf9k#-ALn-fq#!rkO?d=km^;$2!dCB`x?~bG1oEF!zaMuY<x3WtT zilxohO9K$TK3k82LQJ;0HKj5?>RvjtdVYrMdCgJHzO$0QRPW|7T6NVRU)nyx;_}>v zO278H%pWV_WwVA~nj>ZU;;dm#iL}CPl2(i~@w?LoBCfhON6~ttc@Iw0nxr;YHg)Xo z)LisgTT?qboywo48QT#2TzkKaitCuIp_Y7WchAUuS?(RTv3rfaOGTSqb>~FlK42pe zckH^KmTKFSz8|eOUBb1P>t4vp6Y&+>wet2+&Q;bn*)O}EY;sZ0JJD2e1m{uHmN<j` zp%WW6@OBucZ@8eAqY-HUShyWF5plEc7BoJlI~e#E2FcIjER46zwaR{MFmn^l&2h6} z;!9@g4UGqkF#Rm1o75tuTO8X982Z~1=xW3C_Y4p8T`r$Uz>Oo~$}Zfj(|DL^#B*$s z@6Hs7rQw20-Bep|>D)7@`4Yg)nwgO;)v$2)f|4nUm!lJGgNLtF+_3h{4yms-SIx(} zya`Dq;BF@3zIs%)<A?DD!{+-oD)Q30sjEjgb8Hhh`YO-x{<io#FLo^dy0nsGy`4kA zwb2vCpV%qj`Q=LaDx2&6v!`#EJ>{|Tb^`7eBJR7C1nU{{5<EZd-+lci@~P%(z3Ja0 zqWsm~9*)!5^tx$}^V8|Zx(>TWAM(?d8ha<A{OnWZcFFux7GCG00-p!EgcGp-cRr$d z0|h*0r3UsdCuGC_wno=5*5CLTnB?DFe=YDoX947=_}>Dede9Zzi5rvuIW_)|mV|78 z|DB=*<FMaAg#VvX2<d|V?W4Bw*zZ#QkLrT|JtY^RzhfBg6Ih>N|J|omlm5^83$D}u zi!rh@{`af|r2gmp50(3O?*4znqflGoe=E#Sj`cUt{wHdN){Hp)Pn7qkWx#pE-|*K0 ze=YFW0)H*=*8+bn@Ye!=E%4U@e=YFW0)H*=*8+bn@Ye!=E%4U@e=YFW0)H*=*8+bn z@Ye!=E%4U@|BqNen0+m+njQ1#GW@6tbT0<e(ZfT*!<)L=h3-L9SmH;c=}W38Niygm zG;fy~l4_EU9&}ePZx<e9i0+@PfS%Fy8T3sJzcYrX(RavwKq#O)`X~=v3&Z|K0z}yV z4?8Z0?$x4z?#82c!+{O}Aq;e{9laX?WCVl)x|5FHaRKQAAzXByd;$<R5c+)!(q|hG zdN&ft7zkmoe(MXrec1{L2pRFLm`B%NRYe~v+IN+)OsGtx6DkkkBRvr&swcXu$O|+I z2;E~H1H=b}?jQ>QjRk_MHY7nHxaNZC1y@Y4|9?Sr-%|t#*#YT~>a`zeH_#rSy+8>- z=#F$aPy|pUP!v!!5V|Xi?zN&jsOY{Zy4#8FVWK;e=zb$=Y*bxj4^&-rPjLs(PM}>t zAwX+@&|P#}pyfa-fK~#b-%-+m+<{gDc>s9=c>$r{%$NYp1)2wB3S<T}AIJh|0gxro zLZC%JsQqRG%>ohw5(h%})KMEFzd^sb@CC95asYA!S_QNeXc>?dkR*@_kR}kii;jH3 z35W`01GE@u36K_$HjoZbFpvw7Gmst-a$@9P$aj#h%mFe6k^+(jnhZ1rNCrq2Xe!V& zAUUAvK=ME{fG9u;K#D+0K*~U>Kx#nhKpH?Zf&O>lBE6rX28FN?H711L`SA$IgZu&c z2=bNTK*NAIfH;B3?B^(mBY{wx(|}M}s0~nCpgN&8K=noSM)gN_K=wekL3Tp+LVk?O zL-s>9;0BTeLN-Tjk9=SfkSGxHf7B0zfrNl20HJ<@`pY<=u|NVq{6Ks_V}M2jjRN8Y zLTx${2(=&Hc6d9YHbiBkwnOcPV$?>ct?+iThG)b>K4Af54utAF3&;@200{YxE)eoP z<X_0QkdGmm*+51>$dAl`Oo8SBp}t`PG#?20<zgVzFBSpeeFNDM`8Io4{pkqLsP8!d ztpY-Q(H02#H?lwKpNMY<g!&31#B&0o0yzV@0l5OX0MUWmfg*syfx>`7fz|=71zH0X z0)+ZW5Ktgc0FXZr6Nmxi2jmOn1LO_l1>_0j0kj?{7AOWN8fY`nCZISVWZ#WI;XC0U z2%C?vVjkTUDjIhFnlR01^o+U6z0-^YWCMQ)-*oj7|BIJ(G29%;1E9sjk@a~XE*c?s z*<2~&GdIU7Wd-<839~==K=_&#*OCom-%7JNDq2`;BAFza@EP(kG$-JwD<~;|69oD> zdbxVg{A!KenTh(7J^)8mK}}0R3HwVbP-eJiSohC4^AaC(qH>fJz-f?O!T-XGCu)jz zJX4s0aa5EPG)URNK^iD|Y&kt8H}NfS)D%<zj5L#j_4lBtE6H1&b6&p(juN1O8}*H* z2?hCk(Y#PQoOIeLA)qnQnUkXhP@uPk<2QWlEhVN%-zbj*G*t!oulF7o|75+{fn1+1 za&jmsD9=<-*6O)gHck0xsc4h`SC-Z)3YsMR&f|V}ZfZ;W!kwHPqMWQ-epEN_)pTb^ zKi6xU>_iO|bFp&NQ8_LQS^&+9$;gS16pCrv@QTb4ssb9Q^xiD3zD0_#*ryfG$uX6U zrVBA@1rB-cdE1l5lmZ&qMgiR4gw1)~k}Gme@<$nPz?_J)5IE4k!{zplX}Z=fEP}}> zD}Y<AU~_8f4@R}!(A)|f)IK2N0vyynyaBFZPpZ1*fujMsK`StU1EWWHhIe^hneS*x z3{44X9R(a1gTfc(#CM6Pe!Yq8rj8thbPza`fYWiGXZpSc7s?R_Tm(3mfCFPocrAa5 z`Tk=C>i`X~kaeoqoP1r2ceyXB*RnZK&OiNHkYo5TmR}b^EC^^@51+CAv98n_WYnNO zp!F-@APw~HzY<H{TH(V+gPP*E_VCu`=a>$9p`c5~#?0_nudW`<Qn{=}2CY>94@Mv0 zpmOeTE!=C;<awi);{+TScf+mpAIMJ<6G-pn1hHj=ySkLEiZp1woXx-)4>E^Dm2w|7 zQ<wL04g+T#aFmP^?Jtht<Lu>}W0x~p$hi5?$$;CvoFaBPH%M)BWt%w-dpWOwgL)(V zl5U3D2+xLI&U?1ZizpWp<vkVGdpYFcEDcgJL*3iBWghl&gn)x;nq@+_^D~%wpqE1d z4$ME{Wrz92Zcb~q?By5(2ia}<*lDU9adn4#IW}xG4~LYW<=ZdK>g9N`Wt=8_AIT>n z*xt*D1P-cC;~wV6!v^hny_{XZL3Z0fKJI2OpdHl9NoSX%BCu|0O|F$wFXuA5oSix? zlijx@Zs_HdvCFw$zdd7|(A=-RoI1A5o%V2vwW-!SdpTc$gEZh4(3j8Q*mbX$!!v@V zwZ{B=7Y^?@7t+hog`pW)XW>J2SuOb%Gw@O9ame42frG~F8(|A-ysPq7Vcv`N?Gx~N z6ma%jFh9aQ^ClXRz)8{YatS!dI;VW=+d7O}zXJybD%7|C8!ZvKJnGx=f~Ru!r3;M) z8D#}E7~cBnCHOA^TqegpZRLyL1R1v0A>PhdKcZ;Vy`5_ub{*rWpw9i@GLu1N0np&( z<W|cET1i(i4X|-X4LE4z%igu|fs*(dImE%>Nmqb_#<%T?%eTm$*VE$c>A@V(1jsrg zy>$!UEK1Dd<Ol_;X~AF>$Y9BGkxkd-Y}G9WG_VZ}@}&RP8oy)z{OdO7+~n6EFd0qM zKEdApRJ2-{TYk$*|Fh9};J`SJ#zcQFXF8P*>xFwR2HYy#`oK|FP|<|3ub&yi(Z|b& z!ep3l9G8^5PA3p#loV#7a`r=g(A=02!yG>&JID$+Pzq|(R5oX_bPbI|$vF!+XhsK_ z6Tm@slgbxtv}`a)2973cKD`JWG{zfr_{isSwQj)5QA23AfCDSb@QHdnoElugJZQYe zT!*9u4vN+k!5_{)dts0t${NXG3MM532laXfQ!20YM(YYdLw=x2B3%RytWU!`1!$|g z)k^kZx<NTgJ-=G`#iGhcZD*R3KbqCIMv>HNM2ZSQMh&J6(2dFPpgRG_B&qUPicnq$ zaF7k4rk)IV4I%a1%_rxdZkva3l#vD}K`}|tK<}>1)7eSespOv7`95$^P4Cz0*hl%@ zs_W&v1rE$K;W=d@^QjSj_Prb)Vb)winoZv)q8>4=mm>=tagfQ@=UmieIxM-Dvjiqa z)U$Fc-9yFC`R>Ma!}>PW8`cLj*hxN0eXYE>bvSU)w2A7&{=I<9DShg=@p31D!(ItJ z1T^IFCkv$xlms}SUIJc#`l%y>!gO@<pg9H9TzoIP>m6{=jIOFd5``u}eo$*r+n8gT zR)WdET(3fM0uFSc@R`@+F6^0IgRdz-ga2Mrbb<^Ts~V)}`s<}LjoIa>sgQ<&IZ-)o zjFUgR__FANtT`B3ZZvR^zdcYFTw?q3GnXKTz8+daf(Cw$R2sD2HNj^iatj(Ipr0b& zf&N2hP+UE{ok)SvE)5En{_4O%GdiF-dIftrGO2DI{+-d*Z+D!>WR#JNAI;I(neOK! zEwOi^n6wqF>;O#zSu_qbKz2J6n>Rb-$CxzWsDs@=W)E98W4_br%q<T#0S8$WWK!9j zwIl5I>uo;jg`r_B_uuO`ZEyksD93s8g{AbDhuYY-2DE?I2V0>)eMW+_A-nM$tf`3R zs#C>epbx{|063`ETRXJ;?2316$2eH8?~{YA$^Wf2)*C?s4d@7{9KBE1vWxiD-2e@S zJygzG;Gp&)+o&ul8FB0ua8UCA=RR<d2GbSieeYNy_z{!AY_M30C3D0*z(2Tqg&3xr zG8(WQfrHA4I!!B`u4Q=%ILH%c!hRSysAqk@HnX#swg}eb7zcE7b7Xi2dcm&GAa3MF zv+4&J8s-N_rCBrJ{(VIvzMeU}m<-l(eXVL(tM$It2P{rsGdhdY*X+#V^tBdaar#;# zu{eFLLs*=?)(0$3Uu#Pir>_+xi__PdkHzV0Wyj+5wH9M>`dV?ZIDM^=Se(9ALM%>S zt6LVQueCCZ)7R>j#p!F+$>Q|2f@E>}T92|g{x04m6gcZ^+ifqd>BhVY+p;**T+r5? z6uoq+NkJn&8ZBYvfVM2&;G}4-H}f`=33<T@e@FtGX@TS8$aI5&oTLzyH^o-ETBz4Y z1Lax$=SXovaFY8&I*cKjFvi0S`0uq#DC~ljVWrl`+67h)8lb|zWu_xlAs7Lnev0qj zIXTcG05<QWXY4Zrn^Y_#oN*CPtr;}W0Ggk|oFFF6&&$zcG1HIk<*F~K+<UB`*?X+; zul@dh4%Xbp*%f+0q?o_(7^IOFVeKP_#RNX}{3oBupkhi~`zCnQZ&$pa6WvP@z2kdz zM7K@MH<!s^(ELCjyGN1{RxaippP_na6&J0kevcz)O!o$M9a<mYbwOt!%6%PyU>T?$ z-u})m9*%xA3Tx5DK=Y`QimH+ttOb<}d-;lNK7|?VLt_|X|0+89d%^!$udp{%Ke`Xo z(BB76{26YFevV9<2i=oSctdlhGu)U=ABMJ~q94tb&S3flD|q>Mx-%5K{ah7$MNvjY z3gm&90xK0Xy)#`ysD8mdOmB*Ne;_@1K)&ahf~^k_#DI#&HAgDo&!7gH_yD3uO{zCo z&Jp|~m`SJhr_+B(APs+kpup6jpoPjnO^+WR!S9IiN0olm$MXOx{zy?(&_s{`2v*j{ z&U`3dbXPZ~N3bC}9#Nt|bE_$7DQi)bRn%40H7Qz-8fu#AYEW5>0XrroSh4p!d(yq= zn8z?^9xe>{Y(sNqc>DWNX%tUKA14pT)ihN~pd-UGC<u)P*dyxw6lgVQa9WTL`!|RR z@aXNwWc1}@3^(vdXCh~H0L2k}pGk3Z^m2v+HAD8<1jWb0-xa<vDSCN3)3EiBqX&cH z<Lwa)pPD@S&gJRt?C(MA&BbzgumP%SKjtOs^Gk0)_V)H$P4j~lCh8r?*T7!NN=j%! z_8XV$vm*ag5lX-+_|Ny?E@*`hMbH>jM;{sm`V)*#xTU>4Jp6swCZb>fxMdi~z1T(f zQ)PAzC>~c63S?IbH?E>1J&5AtL)B30edFcq=S_E}IQn_^^{$VcL4<d3A{a>bLc;%k zNzCU0-w~Y{SSf^z_*-I554x9s&@bBbydg-k-q9UZReF?Wz4Gw(hCgW5TRqlWPr467 zLygwsWQwfUzgmLz&X3NZ2K)<vp{k`6^pB#5T6@u$sCvX#-aa(1e^(iQOU%je_wr`^ zA`3QERr!ZiS?_+SGV2vU_2U*jO7~<&T>!%eLFAMJcYL-S(xC?gCH@En^O+tPEHy}+ z9=icb&+{NL2<-tVgw!A6;I+b${-j>L&IBs;CI+by%blT(0i@^ok1#Oj??J&*e}u#C zT0KbY^dDhiUAG4bOZ^cJJ~H$`;V=FOjXnDGfU(nmgvIV<tfu>eUd9r{{gIIRBW(bu zr&jPhNDRV24=9AxAL8J(!jZ7_AhFm}7psHxCjJZsSBN+t4iX6#OV~urQizcHLmXTs z9O+MNM39AcBcuka6Ta*~DERZhF#P&i7y(*;Y*YYi6Yy&;x|chR%Is&(>?`}f%3`6w zq8*ijt?HPt$bm()2dpkV9bM^E_6qM8G=C=Dqrc6^zcc@{U<`qRK7wGy_EQZStT1~t z0+?UYU>tN5(Eo~;SPcLmCXsQ~S=%4ho&vTM6e_Ijsr_j5kDLJck2kPygAX;o(W<ZY zGgiHSFRNjB&)!n?qZPhH>VJa*CG@#*!MsfMH!2hNBmdkV0q{Rx0VaG{{tYJj`~<Qn z!o2Xe+m}902w1x}K*2XftQSx|oFDzBeE7r!g77btt^#}4-(>&CUJ^wA@dkXF-Ie-j zt6%r00P^b#3if&bH<}Q(y8u8)f%pAh1H!%;qzNg|AFd<(rtIGRHwgD8z~H~{jlH{g zB-^v4hjQUF6e^c})PuRH3!Kr=dY}3+X>TTg?M<MQoZk)*|0=N$h<~cqk17N>90<O& z&SbeF>mwv<+ujcbF&lsoli(e2RE9aKleae$hDS#qIIrmktmgy;kb0hxzxSN6AiL9o z=y2KrU%(hlZyz7@;R^f6ip>S+yHD?diXoNZ<IP0FB(d=s{yyk@r5`=|l>^-fp2P+N zkAiQVm{+*_(Vbmsfiw>fMW`|B^v4H|9{MZqzht1SUofzd3OfWdB#5wkHpSnMPJI23 z!G3_{|3j*$wmlOLcq;nB)BjXP)PtZNpb=8gvgqKjf23bq6aapG0Ty9*$A0S9>mMNB zo1nmDFP5{TGau~z??8Iwp|#nooqj}m92CTQp22=-;OoEEJw6VSJ<l-o{Ju<>m9dKe zAc#MLjo>E0Z%V{Ik%JHxLrK4vz&^Kw1Qx^8uL?5#*UA$eTzfLGp&OgSv7=n<fY7-g zGqPq&H2txkz=XdJ3B(B>&qLfC^uve4r+>}V&J@B1?!Vc6i^6G-vv(ka(*HS8A7%Cm z5^CD}@?Vwi$722IOaN!q63(UmY0p1`#<xIt0}yOD)B@OTiJh+C@ICMT7lHp%eWL#i zrU=#)2v%m#g{-SPsAm|uI5L=Ymtgoh#BlNs?$5}-<^(X72-b6cw~fFq7J&#B!x)SH zgVN#46LmE<oAg&QAs0XpQdrU0WbO(d8(6bMKQ-vh1Teh`K*7FLf<DfUOh+_jq3PPm z-^GRI*ALvkGXw0uUt;jTn^ExVE`WePLi@rR99vELz-I#NHVlOd-&!20@O87lB}-q~ z0l2T%SRrbdc4*wgZ|d|@Ydi}8;*SIRTF1H`1X8RA82^7iV+W$K8HO#G*x-5^au`;l zpbfA;(}ki*34q@sfyrt8D2(530Vw<tnuP6u{m9|>osr7ytIy!LaQz19flc^6@ZHOc z312+HbdG+(6tofX@`jzi2mDkDOZ5Z)Yep#K*B4OK@3*bL77ZA`zQDQ%%WNzKY4Ba# zi$VAH>d$-FmFdk3xc_>GS@3t$H^E4NK}b=s%Sy<O{TK-9f<#!g!i3RI9ve1*1?r)9 z{mZj6u^`w9%qYJbuJD^zAc;Trw!IIX>W$sl>ZkCYJb=*ij2Z2BMdR1OKoEa~qR~#Q ze{->}o`DqW0rMYB27OwkpkFrh+evyd0Ya|?1-ns&O2$73{}$=jjDYs*3ut;6Y!M<f zqL;s?Q@=xOPaeSOc?PA}T>}kS?6rG8ZNbg~5coPDmKNyrjHLwjNuTwp7CT9RUd^Df zw@~oe8D!8U4hkdK6BZAv85H=O-rv6IH<F;mZ*pKm^6$D<uciRlo4{m$x8emu66(yd zEa3&}AgF)#?{2IcZXnEh03r6diHpA%l?g)(8Wj6mK>v~taDGWcJ$}Cn>+5qjb{*<B zs^f=!>~CWD=N{03wK~LKz!dcdaR2>@>kq*G`)ksmz<&8if^1Fv7C+c(621XoYu{he zg9RflXhAVza<EXWFWNmT=HBn;g9XAr+_FBy5K@B$V!2b_-%bbBek`EAKY0ED5N;zD zES4H<)o>4D*@%!DED-KJeSPy9RMl`Gs17(1AvIWySbo&k4TnML)BDvP)agwORvT6u z_4OrqP};CN7R$=LiNR{avJDHR=XtOo4E(YS7^dfWuplhEur%p;{xcAk$MkdtA_!Vw zuzp{uK<)RGn3V~&w4)cgONF)<*gX8p9X{3p(Z4S5^|N;QMI7LNNn?}le_jdv%`Au( z4d~+$77u8?#V!nk1QufwzxzIfE+2yciqOG3>s+(H+PZk7I=XlRI{WJrY61KnZ9kH| z_gMj;Hvy|njo+T;_FReu(Vl0PMOeq$7#{3H`zgP#&lcFBg7WWdMEp8|Dv$lnihVN? pyC?m-?@8>Ud-uw)c>CRP16u}a%dRt8Zz*GoPS#cA|Ns5_{{h%~@mv4^ literal 0 HcmV?d00001 diff --git a/examples/cloudflare-workers/ci.test.ts b/examples/cloudflare-workers/ci.test.ts new file mode 100644 index 0000000..bf8538b --- /dev/null +++ b/examples/cloudflare-workers/ci.test.ts @@ -0,0 +1,16 @@ +import { test, expect, } from "bun:test"; + + +const deploymentURL = process.env.DEPLOYMENT_URL ?? "http://127.0.0.1:8787"; +if (!deploymentURL) { + throw new Error("DEPLOYMENT_URL not set"); +} + +test("the server is running", async () => { + const res = await fetch(`${deploymentURL}/limit`); + + if (res.status !== 200) { + console.log(await res.text()); + } + expect(res.status).toEqual(200); +}, { timeout: 10000 }); \ No newline at end of file diff --git a/examples/cloudflare-workers/index.ts b/examples/cloudflare-workers/index.ts new file mode 100644 index 0000000..f67b2c6 --- /dev/null +++ b/examples/cloudflare-workers/index.ts @@ -0,0 +1 @@ +console.log("Hello via Bun!"); \ No newline at end of file diff --git a/examples/cloudflare-workers/package.json b/examples/cloudflare-workers/package.json index 4a905e9..3948d24 100644 --- a/examples/cloudflare-workers/package.json +++ b/examples/cloudflare-workers/package.json @@ -3,6 +3,8 @@ "version": "0.0.0", "devDependencies": { "@cloudflare/workers-types": "^4.20230419.0", + "@types/bun": "^1.1.10", + "bun-types": "^1.1.29", "typescript": "^5.0.4", "wrangler": "^3.49.0" }, @@ -14,5 +16,7 @@ "dependencies": { "@upstash/ratelimit": "^1.0.3", "@upstash/redis": "^1.20.6" - } -} + }, + "module": "index.ts", + "type": "module" +} \ No newline at end of file From 9023d20a0c745c0567a0a185e7aafcab05360767 Mon Sep 17 00:00:00 2001 From: fahreddinozcan <ozcanfahrettinn@gmail.com> Date: Sun, 6 Oct 2024 20:32:43 +0300 Subject: [PATCH 02/17] ci(tests.yaml): add release step --- .github/workflows/tests.yaml | 49 ++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 341ea88..ace3442 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -35,8 +35,8 @@ jobs: - name: Install dependencies run: bun install - - name: Run tests - run: bun run test + # - name: Run tests + # run: bun run test cloudflare-workers-local: needs: @@ -79,3 +79,48 @@ jobs: working-directory: examples/cloudflare-workers env: DEPLOYMENT_URL: http://127.0.0.1:8787 + + release: + name: Release + concurrency: release + needs: + - cloudflare-workers-local + + runs-on: ubuntu-latest + outputs: + version: ${{ steps.version.outputs.version }} + steps: + - name: Checkout Repo + uses: actions/checkout@v3 + + - name: Get version + id: version + run: echo "::set-output name=version::v0.0.0-ci.${GITHUB_SHA}-$(date +%Y%m%d%H%M%S)" + + - name: Setup Node + uses: actions/setup-node@v2 + with: + node-version: 18 + + - name: Set package version + run: echo $(jq --arg v "${{ steps.version.outputs.version }}" '(.version) = $v' package.json) > package.json + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - name: Install dependencies + run: bun install + + - name: Build + run: bun run build + + - name: Add npm token + run: echo "//registry.npmjs.org/:_authToken=${{secrets.NPM_TOKEN}}" > .npmrc + + - name: Publish release candidate + run: npm publish --access public --tag=canary + + - name: Sleep + run: sleep 5 From b1a4f531dc6c87485a172d0adcd6829da4e79292 Mon Sep 17 00:00:00 2001 From: fahreddinozcan <ozcanfahrettinn@gmail.com> Date: Sun, 6 Oct 2024 20:36:26 +0300 Subject: [PATCH 03/17] ci(tests.yaml): add deploy cf workers step --- .github/workflows/tests.yaml | 46 +++++++++++++++++++++++ examples/cloudflare-workers/wrangler.toml | 2 +- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index ace3442..aa912e2 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -79,6 +79,52 @@ jobs: working-directory: examples/cloudflare-workers env: DEPLOYMENT_URL: http://127.0.0.1:8787 + + cloudflare-workers-deployed: + concurrency: cloudflare-workers-deployed + needs: + - release + runs-on: ubuntu-latest + steps: + - name: Setup repo + uses: actions/checkout@v3 + - name: Setup nodejs + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - name: Install example + run: | + bun add @upstash/ratelimit@${{needs.release.outputs.version}} + npm i -g wrangler + working-directory: examples/cloudflare-workers + + - name: Add account ID + run: echo 'account_id = "${{ secrets.CLOUDFLARE_ACCOUNT_ID }}"' >> wrangler.toml + working-directory: examples/cloudflare-workers + + - name: Add environment + run: | + echo '[vars]' >> wrangler.toml + echo "UPSTASH_REDIS_REST_URL = \"$UPSTASH_REDIS_REST_URL\"" >> ./wrangler.toml + echo "UPSTASH_REDIS_REST_TOKEN = \"$UPSTASH_REDIS_REST_TOKEN\"" >> ./wrangler.toml + working-directory: examples/cloudflare-workers + + - name: Deploy + run: wrangler publish + working-directory: examples/cloudflare-workers + env: + CLOUDFLARE_API_TOKEN: ${{secrets.CLOUDFLARE_API_TOKEN}} + + - name: Test + run: bun test examples/cloudflare-workers/ci.test.ts + env: + DEPLOYMENT_URL: https://upstash-ratelimit.upsdev.workers.dev release: name: Release diff --git a/examples/cloudflare-workers/wrangler.toml b/examples/cloudflare-workers/wrangler.toml index 691c793..a93c41c 100644 --- a/examples/cloudflare-workers/wrangler.toml +++ b/examples/cloudflare-workers/wrangler.toml @@ -1,3 +1,3 @@ -name = "cloudflare-workers" +name = "upstash-ratelimit" main = "src/index.ts" compatibility_date = "2022-08-11" From 20ad940465e54e85d76519efb749c93b3497e93c Mon Sep 17 00:00:00 2001 From: fahreddinozcan <ozcanfahrettinn@gmail.com> Date: Sun, 6 Oct 2024 20:42:10 +0300 Subject: [PATCH 04/17] ci(tests.yaml): add local nextjs project test --- .github/workflows/tests.yaml | 39 +++++++++++++++++++++++++++++++++++ examples/nextjs/bun.lockb | Bin 0 -> 150842 bytes examples/nextjs/ci.test.ts | 15 ++++++++++++++ examples/nextjs/index.ts | 1 + examples/nextjs/package.json | 8 +++++-- 5 files changed, 61 insertions(+), 2 deletions(-) create mode 100755 examples/nextjs/bun.lockb create mode 100644 examples/nextjs/ci.test.ts create mode 100644 examples/nextjs/index.ts diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index aa912e2..1bd4e04 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -125,6 +125,45 @@ jobs: run: bun test examples/cloudflare-workers/ci.test.ts env: DEPLOYMENT_URL: https://upstash-ratelimit.upsdev.workers.dev + + nextjs-local: + needs: + - test + runs-on: ubuntu-latest + steps: + - name: Setup repo + uses: actions/checkout@v3 + - name: Setup nodejs + uses: actions/setup-node@v3 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - name: Install Dependencies + run: bun install + + - name: Build + run: bun run build + + - name: Install example + run: bun add @upstash/ratelimit@../.. + working-directory: examples/nextjs + + - name: Build example + run: bun run build + working-directory: examples/nextjs + + - name: Run example + run: npm run start & + working-directory: examples/nextjs + + - name: Test + run: bun test ci.test.ts + working-directory: examples/nextjs + env: + DEPLOYMENT_URL: http://localhost:3000 release: name: Release diff --git a/examples/nextjs/bun.lockb b/examples/nextjs/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..1062fa39d6c8da71b4f60856e759efe3c1570899 GIT binary patch literal 150842 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 absscoO01SF#df71HR3w;`O^On|M@?1SZ_Q4 literal 0 HcmV?d00001 diff --git a/examples/nextjs/ci.test.ts b/examples/nextjs/ci.test.ts new file mode 100644 index 0000000..dc346c5 --- /dev/null +++ b/examples/nextjs/ci.test.ts @@ -0,0 +1,15 @@ +import { test, expect, } from "bun:test"; + +const deploymentURL = process.env.DEPLOYMENT_URL ?? "http://127.0.0.1:3000"; +if (!deploymentURL) { + throw new Error("DEPLOYMENT_URL not set"); +} + +test("the server is running", async () => { + const res = await fetch(`${deploymentURL}/api`); + + if (res.status !== 200) { + console.log(await res.text()); + } + expect(res.status).toEqual(200); +}, { timeout: 10000 }); \ No newline at end of file diff --git a/examples/nextjs/index.ts b/examples/nextjs/index.ts new file mode 100644 index 0000000..f67b2c6 --- /dev/null +++ b/examples/nextjs/index.ts @@ -0,0 +1 @@ +console.log("Hello via Bun!"); \ No newline at end of file diff --git a/examples/nextjs/package.json b/examples/nextjs/package.json index 1b48e7c..8f31d78 100644 --- a/examples/nextjs/package.json +++ b/examples/nextjs/package.json @@ -16,13 +16,17 @@ "react-dom": "^18" }, "devDependencies": { + "@types/bun": "^1.1.10", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", + "bun-types": "latest", "eslint": "^8", "eslint-config-next": "14.2.3", "postcss": "^8", "tailwindcss": "^3.4.1", "typescript": "^5" - } -} + }, + "module": "index.ts", + "type": "module" +} \ No newline at end of file From bfe34c4094167239a70636183bbd2b31d03b6ec2 Mon Sep 17 00:00:00 2001 From: fahreddinozcan <ozcanfahrettinn@gmail.com> Date: Sun, 6 Oct 2024 20:42:48 +0300 Subject: [PATCH 05/17] ci(tests.yaml): update release step needs --- .github/workflows/tests.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 1bd4e04..c6b0f3e 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -170,6 +170,7 @@ jobs: concurrency: release needs: - cloudflare-workers-local + - nextjs-local runs-on: ubuntu-latest outputs: From 197f03bced50bdf65e6a302a40d02c790f7046b5 Mon Sep 17 00:00:00 2001 From: fahreddinozcan <ozcanfahrettinn@gmail.com> Date: Sun, 6 Oct 2024 20:46:58 +0300 Subject: [PATCH 06/17] fix: next.js example types deps --- examples/nextjs/app/api/route.ts | 4 ++-- examples/nextjs/bun.lockb | Bin 150842 -> 150874 bytes examples/nextjs/package.json | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/nextjs/app/api/route.ts b/examples/nextjs/app/api/route.ts index 163ddab..f768f01 100644 --- a/examples/nextjs/app/api/route.ts +++ b/examples/nextjs/app/api/route.ts @@ -20,13 +20,13 @@ export async function GET(request: Request) { const { success, limit, remaining, pending } = await ratelimit.limit(identifier); const response = { success: success, - limit: limit, + limit: limit, remaining: remaining } // pending is a promise for handling the analytics submission waitUntil(pending) - + if (!success) { return new Response(JSON.stringify(response), { status: 429 }); } diff --git a/examples/nextjs/bun.lockb b/examples/nextjs/bun.lockb index 1062fa39d6c8da71b4f60856e759efe3c1570899..ba717e6fbe1643739ce795465256a92d66660a67 100755 GIT binary patch delta 8836 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 delta 8699 zcmeI2dvq1m6^G|s5=;UiypxbXf`S?YAt5{s5RhUiAjn$<ArKIPph!XlQcR#wM1p{$ z8AMT#3JJ<XLmNb>RcfUI6%-JyScP^~N~ydQt0Mh=b5A6!mAblC{WE9fo8R91>^XDp z+?g|H&drCb!gs6+Up~-mTrsF?;R45T!X2k*#>8>idDsV`E`F8?#`oCz`zFp(wG&^< zahg#duzE7!II;K#tZqkR@Yh&fj7H<<qD|4UXk&CJ%5nM?-5fNEcGnIbI4^f<&Ug;g zj(8msTcZ(Z#Wg`c9$y`vet&LWc5bdy66QFO_{HvE6W!LMO5M+;g$C$2v?02JCe)2D z(0XVlO^261Vca^2(+a=4+^6rVL)oK4mQL9I*E4%#yTpBUG^JJQ)TLWn?O1iHyl><u z5oW2I6q6ZxjONnawlNu|zFQWP8J@#gx|!xe+_SAan{{qdY^FKo=EP=(-og19=}wEy z2;K6%RXfCShWoKm-&<R;hWfEup_SGMtigV41J)ql`Vy<ZEYr(98JB4uc9Y^W%{y)m z+X%OeZ8!HM+X6SKd8Rq;<}}X?P2|*c^!FL=o+L{DT4b8PxjAgxxn*p#-IFacL)UTA zdb-nEWSA3fPC{nrKu%I`w{44zKxu?KC9y}KRvmX^LXSY-I_^IbdX$$Y?i^Ma#hDO% zIGtdJ6X7(n%J=IRsp3s6H~CS=`4P0xZ%PeuIXG=>!_}$kQ*3=zRman8ygF6K+uM4n z{B)}w9QUsLh(d)rfl5{7I(G(u4m}W5sw!W(GX&Iy;h<8TYX6a-{86C%F`$BS;ROx9 zZ)365p)63z0{P=W<tlYA<wyJ7&kj~PQXOuh^`-JBSzoHwCR@$1It5j!PPt;8`~BLW zYX9k=c4s)wEq;T#QB|a>m<dYE2bHSI<?KA<M}unI(+@@$YOndg_~0zIwN<qiv0_lG zORYYNs#K?pL(b!VZBW&IiS?yw?@3U5s~jhIC1Uu2r%;uuss>j3(W_MrJOk2aZM{_a zYppL;hc<u?yb+ZD0;s&8<Evt`?_RA++yc_AwqC0Ia!`C5s7MvBkVE+)Ro)Ii3)SaW zk9XR@|Dp`O&RcLjoVNQ_RkioIjZ1aFbJmxt<L5znt-oNSB2~qgawu1+8#yPsP|bYp z*9BGC-+)fAk@H_vhpA=jr7}aThT6E4VbrN-eW}bS>!Z#5{x+}ysmzAjxclcMbXE77 z+Gw<*6sd0iIO|uZ#%*4Z;I=6U%TY&L*i5O+1nXB-ec;wMF4cZFpbFh+<3FhG>VoJ7 z+AG;+OSv5jqIEeqDe};EY?PH|{q_n{q`C&Wqk2dTM)fI&+xqHMRU_EwEZvF9ze^jd zir;PQ?TFzgjIlZv)o?Vy?od^=<0P9m+2&0{b&_&zzEpYnR%fFr_#05Q`y$Gpv&r!J zWo*{Qs?06cm+F(2quOyhs;XD4?y&kQsx!CC`oBe0r0Ur3ZTwB^??u(#0gdYF>3dd> zpgQ1()<1@-;lJ4U2~<U@yuVvLW#dxCKexVA<{7JJZCom|@Eltm-~y_STtwBtH#UCB z#+9Ua2&%kmP^z3T>({Yb&#Epr<uyk2AkaLJKc@v7wR0`X{sW!sf`-!y)ebjU|3*}a zZLHtc`e~?6X=kh5Q5C6i-+U;+f5P;#(W<KM-eULai>h0<qe>m3jaB7ozAGJu>S%Y_ zda2^0tY1|Xx;wxnt%Nan`i8SnRZP^zDl=Ut-^OR5%AalPrTW-&(R%0-RP8KB^~m(l zy68Goc^gpvoHA{EZB%JoQR7}J4BqN5+O+Ca-PlBZL-aLNsjpkzjcUByhbnJBssnvu z>yM-A*1u4Fi)XD~KvmE}zv3bReV%Voomjn?C?^C}!=c*Ss{GnEevOSw6%RwTUxbZU zRn^zAd6@phH>&c<t52r{^<Jt0O+_ldiA9rDl^;zjpS*2??N&Pr)+f?HrBYS(A*-A9 zDo=5ByuBQXRDQbE4p!Z){16Q{SIvEKeZMI>0Mvnjpi)(JsSN>jWH_i)r`o?}4(y*E ze=b}z2d<d|`*UI4c;`VkNX;C$W)7^mum)46zWy9shCgiA%z<m>z%_H=nmI6IgXY3| zZv6jq;P0ZoQ$tSq+r{M(Zrhdp-928UyKrTH)6#vw8|ltk8R;JO`j;PA`MW%G&|48{ zdWU|@9+4GkNoJ98&qUXC6JtWW=}{&uv?VVB^}J78m}M1p>zktSO*HXW$+AP3#<hUA zc7|!xy_Wq5<876u{*_Bk*~IiX)N8;lP?>0BdezzOomCUv{0i1GZ4-J8>270M(C1IT zI5<6QY>JI(#iF0rE0-qvD2FoDR`COb-qie}wF6bxgIjIvJ_0hMpo_OcO)S9FWbOf5 zrFXcmKt;<9YC^9TS?s6g^K4A783Vje)x>hl`k++_rRz;YuZJoR63`r5^YFC_Pzr2b zH1=~|S{_ZT!_;mM*(!d@ah?Yi&F$4%GguGGn`dKj*xS5$G|}W`OzpP7Hqjir)GNy~ z1r7BMrT40E(0kcij@N0XDKR^}{WHyVv6}x6g<;SMIzt!8@WS&=Txf61K3)=LxL!SU z_-Jo%zUf@3^P*F!)v;J;2Cd<GXa}kA1@(>4#-R16B)AE*-Zq}PdgwVc5p4;rK&z`I z;K53WCl&#bFdhE^_)<&0XEF4~`X_h?^y}BVa0m{=`*0LKfDhp#I0hd>cN)uto}laK zr_dh;!XVI#{bbN;-W0eOrowd4uV{Gzp6|NYdc#kk59mVEs#*u=3|(L}oxB_7!!KYV z{1O(y!;lZNU^W!MT$lpW;2y{Zy?WgNdUez5+-=Z7^9#Ks>cvxUv&o>#Qj3$D(KIv} z&SPHyEskr&Jc?L-$itoi7vU@TH)!>x3v>njB$xr+;4&C4oq6bdSO8wpEE7{$fOQVe z!)I^`{t2gHFh>~zLtz+bbwUdxA7N`DWh{(?@$fUa4SGTksGv97;T3RUF)V>epkE)d zprhm5=P#|dp}__)lVAv{F-3!dW@Dp43x#t)x87XPeWv?LH_Jj;1j}GKtboVhaVP-~ zR>Cu|#+x_W#1(3p@KO4B96bqJuwR05^&57=F3>120iLE?Pk>gPM#7z-mHT3t3~gyc zE8yS4CAbV4N;X4na`&NIp#=Lat+?#L*bC(Zx52OBdHnUTmVGsLXh|yv)l&JB*iXUJ z@Ec;A6zA(~it1^kRhom;{TXf{zc;kP*626~rote&mROc9{C*e%pgSz1LSx|9uo|?+ zCVdXp!LL9A*EV<oUW9Vk3NJ$`l!0PG^{M)%C|UYuC=uOernm2r*dZ}DXU;^gd4b9B zMi-dU(3aF)TM_<qGpbJba+|xyo3_X#H{sb)^mgr}UHwz%T?nH~eyMnAkqI~6p@&UB zv%pJOY+~c~P{FgOXvm56_dY&;%ZPv(lbX^#J*B;K(0i2xZ|Y*xjEAS}xGcJ(<j+bU zi8^wm_Vj?cod~0Uk)Lo|$9RsUgw3Vr7Y$kU(jNmRtwT!tlypW$YSgE|`ZI6eGkJS* zz;sMWOVJJ7&g=e&iS4NStu6_BN0jV;_t5;Y0h5~2F@<Z~KclKie=K{>>#Nty4HykH zJdTRSdP~?fP6HC(WzjQt+<YXkJG({5_eWjqy{5L;kPt({@-wCTZq46!-Iavxw&sIx zF8(3n^ofO6Y7TgjOKAHf39;-tY3a=OidRf7x{?s^dXZq_y-`a{y6NOClXt6ECU1dv zOtRZ+P)xAGOD;Ca<_<v1w_Fy_U;O<HXdIR4(bT;0H-Qyl%$9dtV;S*-uO1{Bz%V zo7gqJHRmje!<P*_e0f06S8s1@G}fuCi15BGHZkdy|4dN%9|L|9?YnT!{eLfD-^%|X zphjOts#DQ+sp)ELM=A;)HP2fo)|6CaEH}r}OuLHMH%z03=3qtJLuOYXJm&r2m3Y)U zf5i0hI=ye+2oF0Nj6LU>qvolKjYrMpaPP(wW`1PPnbULg#^p|KH)G<29IruSAl`fS NxS3F~@r2o$^B;Rlsb2s9 diff --git a/examples/nextjs/package.json b/examples/nextjs/package.json index 8f31d78..c9614d2 100644 --- a/examples/nextjs/package.json +++ b/examples/nextjs/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "@upstash/ratelimit": "^1.1.3", + "@upstash/redis": "^1.34.2", "@vercel/functions": "^1.0.2", "next": "14.2.3", "react": "^18", From eefa3f95d37c33c53b7a987fe946343675773563 Mon Sep 17 00:00:00 2001 From: fahreddinozcan <ozcanfahrettinn@gmail.com> Date: Sun, 6 Oct 2024 20:52:56 +0300 Subject: [PATCH 07/17] fix: next.js example types deps --- examples/nextjs/app/api/route.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/nextjs/app/api/route.ts b/examples/nextjs/app/api/route.ts index f768f01..58b108e 100644 --- a/examples/nextjs/app/api/route.ts +++ b/examples/nextjs/app/api/route.ts @@ -6,9 +6,14 @@ import { waitUntil } from '@vercel/functions'; import { Ratelimit } from "@upstash/ratelimit"; import { Redis } from "@upstash/redis"; +const redis = new Redis({ + url: process.env.UPSTASH_REDIS_REST_URL!, + token: process.env.UPSTASH_REDIS_REST_TOKEN!, +}) + // Create a new ratelimiter const ratelimit = new Ratelimit({ - redis: Redis.fromEnv(), + redis, limiter: Ratelimit.slidingWindow(10, "10 s"), prefix: "@upstash/ratelimit", analytics: true From e674c630d9c1458b5369ef9f9e38cbbb7011003a Mon Sep 17 00:00:00 2001 From: fahreddinozcan <ozcanfahrettinn@gmail.com> Date: Sun, 6 Oct 2024 20:55:58 +0300 Subject: [PATCH 08/17] fix --- examples/nextjs/app/api/route.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/nextjs/app/api/route.ts b/examples/nextjs/app/api/route.ts index 58b108e..51d6eb9 100644 --- a/examples/nextjs/app/api/route.ts +++ b/examples/nextjs/app/api/route.ts @@ -13,6 +13,7 @@ const redis = new Redis({ // Create a new ratelimiter const ratelimit = new Ratelimit({ + // @ts-ignore redis, limiter: Ratelimit.slidingWindow(10, "10 s"), prefix: "@upstash/ratelimit", From a9e79f3a30b36075db22b07ca4b001047d0cc391 Mon Sep 17 00:00:00 2001 From: fahreddinozcan <ozcanfahrettinn@gmail.com> Date: Sun, 6 Oct 2024 21:01:59 +0300 Subject: [PATCH 09/17] ci:(tests.yaml): add next.js deployed example --- .github/workflows/tests.yaml | 61 ++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index c6b0f3e..453896c 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -164,6 +164,67 @@ jobs: working-directory: examples/nextjs env: DEPLOYMENT_URL: http://localhost:3000 + + + nextjs-deployed: + concurrency: nextjs-deployed + runs-on: ubuntu-latest + needs: + - release + steps: + - name: Setup repo + uses: actions/checkout@v3 + + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version: 20 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - name: Install Vercel CLI + run: npm install --global vercel@latest + + - name: Pull Vercel Environment Information + run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }} + env: + VERCEL_ORG_ID: ${{ secrets.VERCEL_TEAM_ID }} + VERCEL_PROJECT_ID: "prj_NSOSq2ZawugKhtZGb3ViHX4b56hx" + working-directory: examples/nextjs + + - name: Install dependencies + run: bun install + working-directory: examples/nextjs + + - name: Build Project + run: vercel build --prod --token=${{ secrets.VERCEL_TOKEN }} + env: + VERCEL_ORG_ID: ${{ secrets.VERCEL_TEAM_ID }} + VERCEL_PROJECT_ID: "prj_NSOSq2ZawugKhtZGb3ViHX4b56hx" + UPSTASH_REDIS_REST_URL: ${{ secrets.UPSTASH_REDIS_REST_URL }} + UPSTASH_REDIS_REST_TOKEN: ${{ secrets.UPSTASH_REDIS_REST_TOKEN }} + working-directory: examples/nextjs + + - name: Deploy to Vercel + run: | + DEPLOYMENT_URL=$(vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }} \ + --env UPSTASH_REDIS_REST_URL=${{ secrets.UPSTASH_REDIS_REST_URL }} \ + --env UPSTASH_REDIS_REST_TOKEN=${{ secrets.UPSTASH_REDIS_REST_TOKEN }}) + echo "DEPLOYMENT_URL=${DEPLOYMENT_URL}" >> $GITHUB_ENV + env: + VERCEL_ORG_ID: ${{ secrets.VERCEL_TEAM_ID }} + VERCEL_PROJECT_ID: "prj_NSOSq2ZawugKhtZGb3ViHX4b56hx" + working-directory: examples/nextjs + + - name: Test + run: bun test ci.test.ts + working-directory: examples/nextjs + env: + UPSTASH_REDIS_REST_URL: ${{ secrets.UPSTASH_REDIS_REST_URL }} + UPSTASH_REDIS_REST_TOKEN: ${{ secrets.UPSTASH_REDIS_REST_TOKEN }} release: name: Release From dbe4ed901d66238b5041c67094ed1b72fd0cabec Mon Sep 17 00:00:00 2001 From: fahreddinozcan <ozcanfahrettinn@gmail.com> Date: Sun, 6 Oct 2024 21:06:30 +0300 Subject: [PATCH 10/17] fix --- examples/nextjs/ci.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/nextjs/ci.test.ts b/examples/nextjs/ci.test.ts index dc346c5..5f26bb9 100644 --- a/examples/nextjs/ci.test.ts +++ b/examples/nextjs/ci.test.ts @@ -6,7 +6,8 @@ if (!deploymentURL) { } test("the server is running", async () => { - const res = await fetch(`${deploymentURL}/api`); + console.log(deploymentURL); + const res = await fetch(`${deploymentURL}/limit`); if (res.status !== 200) { console.log(await res.text()); From ed27ec69c8e2735d18eb2fe059aef3d0efdecb17 Mon Sep 17 00:00:00 2001 From: fahreddinozcan <ozcanfahrettinn@gmail.com> Date: Sun, 6 Oct 2024 21:08:34 +0300 Subject: [PATCH 11/17] fix --- examples/nextjs/ci.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/nextjs/ci.test.ts b/examples/nextjs/ci.test.ts index 5f26bb9..0563a62 100644 --- a/examples/nextjs/ci.test.ts +++ b/examples/nextjs/ci.test.ts @@ -6,8 +6,8 @@ if (!deploymentURL) { } test("the server is running", async () => { - console.log(deploymentURL); - const res = await fetch(`${deploymentURL}/limit`); + console.log(`${deploymentURL}/api`); + const res = await fetch(`${deploymentURL}/api`); if (res.status !== 200) { console.log(await res.text()); From 388e5fd4377e2ab1b4b036423d322b21bf1b1b5f Mon Sep 17 00:00:00 2001 From: fahreddinozcan <ozcanfahrettinn@gmail.com> Date: Sun, 6 Oct 2024 21:14:22 +0300 Subject: [PATCH 12/17] enable tests --- .github/workflows/tests.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 453896c..1465d73 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -35,8 +35,8 @@ jobs: - name: Install dependencies run: bun install - # - name: Run tests - # run: bun run test + - name: Run tests + run: bun run test cloudflare-workers-local: needs: From 1ea3755fa9187191bae2ec71b1bb41791390e602 Mon Sep 17 00:00:00 2001 From: fahreddinozcan <ozcanfahrettinn@gmail.com> Date: Thu, 10 Oct 2024 13:14:51 +0300 Subject: [PATCH 13/17] test pipeline --- .github/workflows/tests.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 1465d73..453896c 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -35,8 +35,8 @@ jobs: - name: Install dependencies run: bun install - - name: Run tests - run: bun run test + # - name: Run tests + # run: bun run test cloudflare-workers-local: needs: From ff4ad00125a27ed1fca150885dfd6efd8085cd2c Mon Sep 17 00:00:00 2001 From: fahreddinozcan <ozcanfahrettinn@gmail.com> Date: Thu, 10 Oct 2024 13:16:28 +0300 Subject: [PATCH 14/17] remove redundancy --- .github/workflows/tests.yaml | 2 +- examples/cloudflare-workers/index.ts | 1 - examples/cloudflare-workers/package.json | 4 +--- 3 files changed, 2 insertions(+), 5 deletions(-) delete mode 100644 examples/cloudflare-workers/index.ts diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 453896c..938ea02 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -267,7 +267,7 @@ jobs: run: echo "//registry.npmjs.org/:_authToken=${{secrets.NPM_TOKEN}}" > .npmrc - name: Publish release candidate - run: npm publish --access public --tag=canary + run: npm publish --access public --tag=ci - name: Sleep run: sleep 5 diff --git a/examples/cloudflare-workers/index.ts b/examples/cloudflare-workers/index.ts deleted file mode 100644 index f67b2c6..0000000 --- a/examples/cloudflare-workers/index.ts +++ /dev/null @@ -1 +0,0 @@ -console.log("Hello via Bun!"); \ No newline at end of file diff --git a/examples/cloudflare-workers/package.json b/examples/cloudflare-workers/package.json index 3948d24..24435e0 100644 --- a/examples/cloudflare-workers/package.json +++ b/examples/cloudflare-workers/package.json @@ -16,7 +16,5 @@ "dependencies": { "@upstash/ratelimit": "^1.0.3", "@upstash/redis": "^1.20.6" - }, - "module": "index.ts", - "type": "module" + } } \ No newline at end of file From 31ab84f153f1260dd13d6d753192dfd376fdbace Mon Sep 17 00:00:00 2001 From: fahreddinozcan <ozcanfahrettinn@gmail.com> Date: Thu, 10 Oct 2024 13:20:23 +0300 Subject: [PATCH 15/17] cleanup env variables --- .github/workflows/tests.yaml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 938ea02..8ffd4d9 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -204,8 +204,6 @@ jobs: env: VERCEL_ORG_ID: ${{ secrets.VERCEL_TEAM_ID }} VERCEL_PROJECT_ID: "prj_NSOSq2ZawugKhtZGb3ViHX4b56hx" - UPSTASH_REDIS_REST_URL: ${{ secrets.UPSTASH_REDIS_REST_URL }} - UPSTASH_REDIS_REST_TOKEN: ${{ secrets.UPSTASH_REDIS_REST_TOKEN }} working-directory: examples/nextjs - name: Deploy to Vercel @@ -222,9 +220,6 @@ jobs: - name: Test run: bun test ci.test.ts working-directory: examples/nextjs - env: - UPSTASH_REDIS_REST_URL: ${{ secrets.UPSTASH_REDIS_REST_URL }} - UPSTASH_REDIS_REST_TOKEN: ${{ secrets.UPSTASH_REDIS_REST_TOKEN }} release: name: Release From 6c84d45eaff73eebd24fe15df61d7205a2bf9c3d Mon Sep 17 00:00:00 2001 From: fahreddinozcan <ozcanfahrettinn@gmail.com> Date: Thu, 10 Oct 2024 13:23:31 +0300 Subject: [PATCH 16/17] re-enable flaky tests --- .github/workflows/tests.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 8ffd4d9..af15231 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -35,8 +35,8 @@ jobs: - name: Install dependencies run: bun install - # - name: Run tests - # run: bun run test + - name: Run tests + run: bun run test cloudflare-workers-local: needs: From 4a5455d6673d75502ddd810afee63fb16b775f60 Mon Sep 17 00:00:00 2001 From: fahreddinozcan <ozcanfahrettinn@gmail.com> Date: Fri, 11 Oct 2024 10:46:50 +0300 Subject: [PATCH 17/17] fix(nextjs example): remove index.ts --- examples/nextjs/index.ts | 1 - 1 file changed, 1 deletion(-) delete mode 100644 examples/nextjs/index.ts diff --git a/examples/nextjs/index.ts b/examples/nextjs/index.ts deleted file mode 100644 index f67b2c6..0000000 --- a/examples/nextjs/index.ts +++ /dev/null @@ -1 +0,0 @@ -console.log("Hello via Bun!"); \ No newline at end of file