From 2de82627042d52afb2783c80ed293f9cf0739d03 Mon Sep 17 00:00:00 2001 From: Carter McBride <18412686+carterworks@users.noreply.github.com> Date: Fri, 23 Aug 2024 14:09:33 -0600 Subject: [PATCH] Convert to Astro (#18) * Init astro * Show all feed items as a list * Add filter for recent items * Add category colors * Add dark mode * Add article counts --- .astro/settings.json | 5 + .astro/types.d.ts | 1 + .editorconfig | 6 ++ .gitignore | 2 + astro.config.js | 8 ++ biome.json | 31 +++++- bun.lockb | Bin 98588 -> 241772 bytes package.json | 9 +- src/@types/bubo.d.ts | 15 --- src/env.d.ts | 1 + src/index.ts | 208 -------------------------------------- src/pages/index.astro | 229 ++++++++++++++++++++++++++++++++++++++++++ src/renderer.ts | 58 ----------- src/services/feeds.ts | 178 ++++++++++++++++++++++++++++++++ src/utilities.ts | 113 --------------------- tailwind.config.js | 15 +-- tsconfig.json | 22 +--- 17 files changed, 468 insertions(+), 433 deletions(-) create mode 100644 .astro/settings.json create mode 100644 .astro/types.d.ts create mode 100644 .editorconfig create mode 100644 astro.config.js delete mode 100644 src/@types/bubo.d.ts create mode 100644 src/env.d.ts delete mode 100644 src/index.ts create mode 100644 src/pages/index.astro delete mode 100644 src/renderer.ts create mode 100644 src/services/feeds.ts delete mode 100644 src/utilities.ts diff --git a/.astro/settings.json b/.astro/settings.json new file mode 100644 index 0000000..b87bdf2 --- /dev/null +++ b/.astro/settings.json @@ -0,0 +1,5 @@ +{ + "_variables": { + "lastUpdateCheck": 1724282769525 + } +} \ No newline at end of file diff --git a/.astro/types.d.ts b/.astro/types.d.ts new file mode 100644 index 0000000..f964fe0 --- /dev/null +++ b/.astro/types.d.ts @@ -0,0 +1 @@ +/// diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..89c6d24 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,6 @@ +[*] +end_of_line = lf +insert_final_newline = true +tab_width = 2 +indent_size = 2 +indent_style = tab diff --git a/.gitignore b/.gitignore index 82c1586..e2f9250 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ public/styles.css dist/* .DS_Store configs/feeds.json +src-old/ +.env diff --git a/astro.config.js b/astro.config.js new file mode 100644 index 0000000..8f1af52 --- /dev/null +++ b/astro.config.js @@ -0,0 +1,8 @@ +import tailwindIntegration from "@astrojs/tailwind"; +import { defineConfig } from "astro/config"; + +// https://astro.build/config +export default defineConfig({ + output: "static", + integrations: [tailwindIntegration()], +}); diff --git a/biome.json b/biome.json index 90c25b6..6d54bb3 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/1.8.1/schema.json", + "$schema": "https://biomejs.dev/schemas/1.8.3/schema.json", "organizeImports": { "enabled": true }, @@ -8,5 +8,32 @@ "rules": { "recommended": true } - } + }, + "css": { + "formatter": { + "enabled": true + }, + "linter": { + "enabled": true + } + }, + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true, + "defaultBranch": "main" + }, + "overrides": [ + { + "include": ["*.svelte", "*.astro", "*.vue"], + "linter": { + "rules": { + "style": { + "useConst": "off", + "useImportType": "off" + } + } + } + } + ] } diff --git a/bun.lockb b/bun.lockb index 31329ee2222ffd968b237ca0937fc930a027d409..2336624969f3e54994c062dc603c436b7c253cbd 100755 GIT binary patch literal 241772 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 delta 20083 zcmeHvcYG987xwH7n`8r_21q3dHI!5c8whMd@14*TbdxM37?PL`y<}+$0t$?9A#@Z4 zMWhHp0YwA_1Vs^nP$VLXG_eCJe9tolqA$MRTfRTOKi>KMo}4+)ZRehI?w#4m&R)Av zarrc_`O%HK?1{}kzE522)@9(Ef0V4;{Y=*T-KO02Y1;bEoBON%*7)hU9*e|7wk#M_ ztImXbnqvGZFG-$-IQNAdH!3@Rq+62w7Ay@btRqX34W!fU%wyeZ&?`fqWmImiNKzH( zO(5C$3rK&+j|@HtvMTiSOlS5JXyXFvK<^L9b}n~zR!)H=9rD)OzhlU5KAK+W*=`V5 zKyct}*O(l%l`iNNJVyCOUJlbtmxt3V3J=qyh}J5FQ^boTp%Yy22ar~ycp56^ZM6u2^^hNxGm5QNJ;x*#jt zExFuJj&|jbmj=OaZ0K_5<-1@=4OFZK{Wy3nROz|-Iq1-7NMDq5hD}h3bmOIghL0X~@{jtn~hwAhO)9ag5s|2rOOLq&kuVGS69%83psr*xm$B*JV20 zQJBSuOVHWT&Ki1s@0z;d3#$YaF2*_YWD;Z$iFchq?2sBFoZKO)bW?=E!hMgcqg zAw-v#AUP>dsO}{MKg|iRPc#N-hu$$CPa1TL?P(9m0nG$9^VH14^u>){W1 z5dZwFQTfi{lEeWqap_oudZkMJ!UGY1PKUon+l;Ci&5Ydig8Zx;*F21isd;wQl_X5* z9~@%Zf6*#QFv)WmlJij-ND`WOGU`hbx+wHq#Yq4NGrf|a(_vj z=aDvElHA!&H?wDyD}RJ5UXp%ks5@YFBfb6CkW9z4d}q1~sW-H-&c6UzQ7V)?KjVZI z%!QVbmCq%awyBBEUqy#Zujw$1GwB40;CZ%UMl{@9s0G+!=-Fg|_1&Y>^PO&&bSXwp z!Mv<|EK|2MY62?Y*dL2}g{WAN>B?aaZX^M{7?LUS85(l$G9xwxvqOq|av+(Lu}$^* z>CoBkQ|O$?sH~i8J2ET$Ws~%< z0qehK*B78!-&}y^CcX!Tv%hvN^c-mf$=Kh6BwrnpIiBxw7v^S%-vdAaTaaMG35dVMQ+=1`6^CpRktdmr>_ z&@V>o9vJT|#9GA>YE*m`!J~^R86EaZ(L2avd~hT~=XP=j9ne$PAUUwv;mE9lEY>rV zFe7^mRp~V9(UA1a+$XX!ocY7ut}(8h0(X9)%b9_M%e&rI@96b*dd!_U<3~9Qu;b-( z%fxjH9Wdqysb=8y_PPPM#%cQ$+^Y@nVh4R@W_ja|ddMytJdD;17M=7Yj-P}RuHy_y zW^+$SCRqX`I`!0oWX!yb@|zviY1N*M{qW#xGrrG%zhIwx_0E&Y-H*T7-!t*`%Ij~X zo-S=%HLTl&(AuSS_S$N{ImEL3OvhhW<*A!%59&Oy&u2Y`{&1)?=XQ%*Jx2Bo9uU;| zld$i%9rB-3@@49g1M9}l82)v1uh9vGf+N-5byoYl_{RPd+fP2%SzR3(tKO^=pw15qP<`q~sY0MPx>rGk9lO#_U^EO0{*!#@T;N+OMcFvzxbLNd%=hfb|V^yE}$1Ka$)Af@rr`5m)$+nufiNh-L zlvg7*CaOytBwMDbr@@~Ap9o%2*EFzOny7;#lP$y5rIE?D#kghbj1r6LM9FzIuwk;L zlRCIzvTdOvNm#LHQ`*2T|EQ=X4IQ?2 zk7_m7G_%VitZL9Ihpn=gBw;`E*whGAIqt2GAZZOM;U10Sd1;-c8k&`wyue2-S>>?a z0ohqy5t(Fdi!Cx%4NXXr^KEL;YKLtT2)4GUr48-2E6}hTL5mn*x7EcW#wO{J)QEVy zZ3r~1FO;oWZMUt4#+vX9%>33@4O;84b;g2YXOd>h3~24O1`*Be^16v zPJIG2R)Mc#?Y6g}alCSxb{85ulT~LwyR9WQDhD*(mT}PN4=dwh-N-UEw0V;43eMOA zW)C+v$7aPga5J<5LxZ27ZH30j>NT%GV>?B4M%rzSE16?a%Yw#8`)KWUL8DcA=zfKU z>ld_$33gjN_AHKvUSL%owB~AP!zAlVIP0jMYno)erg7(DlWetdt>cLBH2jbTjlE(% z>2}*nXt?-zd^Ky%LhA`lpGBjpy5Es3ad!FXs%p@BhwV*}xE#X7H8bqCYtT|OjV?~W zC4hk{r*-}3fpSsS+w59?r*kcx%C!1}z?%tRj}yH>jyY+a_7R z##u+6*;?Qlhi#pchkGYN(-#hdw+$Lw!-i&d+g)f3I(mkEZENT?_32H3riYA>sEG6*#P&u;VvZ&oxQ1O~x568E9RagTA2Ae^?T*FDl4P`-nKZ%?%A#O9JNmsdt~0bxU$T>+u}?k0&Ol>Gp}{-$5Iq&(0i@d~X!=ap%Q|R! zJNo0Uq3OPI;J%FB(Y7GlY-laDJ|jjZ`arQmsmNf+cS6-6n;f=5we&p*F^sp%Yip?` zAg_Y#i<$_{YP&orOdayN!?q>t{yL7cTdzZFsjg^{WNQ$vkD+Y=vNK#Ave_Z84Ofdc zJ8b7r#%1EAMzl@ziO@U1x^7~(Iib-N3X{jS2wE&OZ&P=(Sfpvz8Wq8ZMzb)FHxhlIw1R@A-qddU85-kj z(_9+UP|r$aY*wNV6i(DzU9;A1+W{>BT6ry5@ zYpa{r&u;w~T305&+%R4(TIjGn4{!EIv6gDq%g{Qj=g>(KHehz5tzvn6Q+0^ykk2$# zi&TfL2BO3HBS6n3`at3IaphF)^15bf&?1NJ8-w)GQhg2Lci)%RGtg4h(6}U9YfNc? z)|5V0p>ah0!t@C=wt*%I`JB5xqhx5@!EmuzXt(7;V{-%^o$Z9iuC+^+?G7|vSSo2j849l(10j4%p&7j( z>kdKdt@T2a0^8_u(C07^8t0&E%b?K~ZNbPF+NdSV9JVSLQ#TN|1-5R`uv9Q3?i}Nx z>BBOp+o3TRF_npS`M0)e(Ex|7X}dC{?FnccPaDCu7aF6fUs`=pkjQ%(TU(rQ5G+P` zC=VJ8<7NdXZfUO;z2&goVr7v2+U;a4JOO`jWL#Bpp(UuH@kzGVaE1h6Xy@DI?>nd^ zyBxB;qZ+i^A&={*4uRO-Q7zi-u)fhrk_M|Qb|+c=I^$Zaou%Qdmv*)VXWg{3-*MJQ zJL}O!l6q)oML5&y$=`NSi{5Toh+9Q|xRhi7w{e=R0?FfHvK;v8TIs{3g0cX>0^klp z>n|9R$3tY{KNN6)FrYR7S84|(J4Dd5gVGDY1hs>b6F`8pdfhY@e)uPn{dLE)Agv*C zTs!_1$%eg*`VW&VM-FTK;+{e~D9QITWPd}Z>hss`n6wI5&RWAkMuowUJpP$v$3wJQ zx?~838agG*hZ%ZVNskpijz6s61bCE{r(}PJ0oFST@HooE*H5%(N7CoIs>$*= zF9m4WH-HcD9l(yi2Y8f~9N-6y)g|>G0m`2Yo|66DG4wlT;*+of_W%xHVJk!ORK_1l z#gOHw;GpEG)sS8WUskd|AMoto&yZD(dWGf*Werq_g!G1tF)EambX`1n7Bw|wGo#+a zBxl;vD5s<$tqh$KdZFYnh_aFuQw*Mx9d(4H0bLB)-6$_BS>6jgi+UU7l;ryv`ky8C z`m%(g9^DtF#bl7t>=C0`SxM?q{Gl9blvC2|#|*u!B<}=IGct_whskm%&$Jjhi4*Oh zWCtS+ost!EAW7vK{J$fa2?a*GvXUu2$ztT>Bx8WdhMZzFprk<_LoX{yO*QzklGHT( zVY?ZS)MxUKA$j@~{?LGD3yp$j|3k@6|C{T1;lnQMjNQL+L8lFWy3jLZVL)x54Zwqv zb8Jfm2PIOy@c+RDU3c}ravkTutVcui>p0^7UtiGKD~?ov9S;B)`+w1-{BJJk|IPJ0NE`Tn7j$^|1H=22 z^!ooU=)ADg6F!jtyPz{Y%3i;<4{v3O|6S1kKe(W`;6{q$-@l-5EBWe2t4JMf>81u; z^%Lu!v2>HGN#ciRECXbJNpzh9SzQuWhFS)wY+frX<#~AV3m#C<7(YcP?a* zBwnEmmV`VHGDH$XC_^Q&m9my3e4m93lSCS2xFp`9jF3dt=OAlKqR}MCI+7Sky{;to zQPz`0(0s`HlF07~*+3G9A=ULi_=(B$VNgR5sGtt|(ND~L3PfW`)LsC>=O;hWp%sWI zNlYNI6U4a%AYw4qLJ*lh`-yoALBvU-ghaqEexkJsqNyaFQ9&F8ah*hhBw9WXV%)EO zV#V_y>~IW;$XjsCA`mSkQM3reDG+~O}N!f?tt+0gMRCGKatuW6*?gt{Xwk%!%tXK zL3BYpQb7#5>nFC8=mv+g3!i&_;=oc6J>c;o5IaF!pKR%7>7`crdElZkK9xPUsA# zvp1MatmBeI{7Nvl$Shh3W`rcZB(vTJOovrqvLvx^6_`ObFh7%dLK1CPgYoeNvu-t* zQRtb>PBN)$z~sWeYrtfd2V-3e=1DksEtr4`V78NSBjsNJbC8Vd1u&zL^kl~QfvNr? zn6Ze$i(n!vf;m8DJi@RJ%qcRX*MXUclqWN*5}0}~ftie?e+f)tWiThm6vAUKgSkv* z=F4EF>Nz8pQ~{H)9?W!jY(469t_tQ7nVIm<1~9kCEZP9(Y50fC`f6Z0yaHx6{PPN! zLH=NVCNl^Ac@>OLbujB*1v3x+A+wWA>PF0y%RrG?1H{aUsImY7oQNs`HNm`w zDzb{S-w5U)nW3+NS%iu905dKC%yu#YyFqs_k%3@R9blHiJ*;zz%;+9qmcjAKU}goe zRWg_rNKEVnA~6_@-zG4tuU~QN&c>)aEj#V`Q%(yyWqUg+GL=u~#h^!0d z(j+i%B9fEAoFcObt5@EINInW?Ry{BshJx9HNMg?xiS@y(!=`O{M`YP811)>SyAblb zSecJtE8U0QDc{4oq}-3_4ud>^y>1HR`|!gPkRM>H>jZfaYhfhhAq152Ft#t2e~9r| z{|M?)9!1_1LVkqIr2H8DQXa#G=z;tM{XmL8LT+Uvk3Qe$a7e4l;;s_$}f;kGaxTuccUyt z3Q~TF6q*Tn5f)H>g&0s?!a92j@@w>i#I$^)j{kL_d>P42_FH)HX-i)#KX+ac-`0mg zSK-X3QFIN?q`Zzm&4RpvD+%Ry2ot2pv|~aYW@C!q!<5Z*Ln4@?$V2%@7_)_LATxOj zn4e(|nQ<+^L~RB0D>mA#U?N+BIY;I;jM;_}?!W@d-(Ugd@37zv$Uk5K; z4k=m0LQ0E8T-k0pY!ZJzknp!TJ~ms;X0aQ6-NGrtQMhyP^xlJ2L? z!~E*sXa|js*7^=8u^h9WXk#@0P_soV2)TqoH+F=Rv_bFBaL3n{=(zHG@9BO!i%4V+ zkz4U2^4)v-!IDz|Z}QA%KBi7D`x|$Er;R#%lESZ8@hAa!$}Fv8aAypTpKcl$+*yM| zeEF4N{SnzYoNxedfDe~=d;##350V-g+y#TPK~^-lQiJn_tZZ;!8XO<|UIchhvbX|J z8{qMk`PiBdnVO@NgIxkxu_AC8;PEv;1M!eix(aYGma$%C!2B=7w+2@Q(tHeh#o&;( z(k}q}Wgl!?jq^|88IEfJPm#1z8-u%UaD0%}792aiVQ_rN+uo@69nNWBO`wCp@sT!9 z`LK)6PO;v!$J*oqfu1<2(FiBzv+W?9cLK>y_JOH0XR|A+i)qxrSGbR8C1cHEIAOr{nY5`$DI1mBU2AEBC zfqFoF0GU*%J&+55S)l;ai2k8JXgYmFXLG&`EFI3Q;`7nbz*t}cFcILh);u5|=!trq zvlB=M_xgTFYa#+*TGj#T0`-6fKtu7GQ*Kb$9H)su3jkXN|FOz{{_?;2+IO{6AQ@AJ zkV(p4WZGoS^4#ZsuP8d~2PNC8;T24LcK1(=W>0VZJ=fV+a3 zC%tga#N}*L0fwG=#FQ8eFs}vyj{;`0(}VOJy_LyCrfV{QG=QFP0_nhTfC)MRVA8S? z%h5zzVGI>>=qX?(Fdbm19u}r);M)QofbFLMTBxYddN*Lk>Peh)rI?15jT?D<&a%bphJj2JZF;onh8LnKM=K}@6WMDKXcT5B(0PJuaFcuhZoKrG9tpFOF z0!#&%XfpuQGp1`fJ5Iu!0F7q9H10)!lY16`;f2x*IAO-G1?B*20Ir1D06U%wnEW$1 zXBl}FSO_rT<^$}|tUJ#*=R#Wm)CN`qD}luT4O;{}&*?BZ7_$`yDIk{uOMoI^8L%AS zK&t?A5E{WjIRVo!mSqE+gvs5+`FFs#z-8bY;A@}}P@nF+1bhW>;ETYQz)9c)a2_}d zoCZDvJ^?-iUIyL=4gi~h*MV1n4ZwQfHDD9)DzMSecR&^c^wt}|R-kYT{&WDg0j#hc zcoWzOybJ6C-T|ruZv$@uJpuCMh&{k=U_Zb%tiRWg??LVZ4g&{)4}e34{D|>C3grm! zF>nkx4txr5rYC??0KM@!a0Vy=$nzHYoN-iVX58!v;H{cGCSAi7}x@H#f%|yALs60vj zOx&F$*AQP8%hkQ&qhqn>i!PJprh!aiUu+G}Zk~61Qpq>vWy`Rp(Q!?qV?~<{vcK3c zSxyS(-3#mdI@R}Ba^*JjWy_Sfxae5)Qcc`LCzd**=@hwXu=&QS{oOe`7Pl+?7=1O< zs!2`6)G2bHrMXx}p=mYB#Y@sh;$sjY=BuxR*I)gh{hA|VH6vo9n<7iBV)tiqK#2LS z-SE@NTT`PFFUb}=t&D@Stm5Wpa=hH$OGKZS1LQO>;W!}&G&kQqJRcEQ)wgv;8GXh^ z$2Eu1<_nIlDc_FGA6)vfK4to3m6w={w(*ZiVY!@)ohD zFi-RC$?!2t?>PgAz=i)*bQ|Q_wcVcvaYAzS4vm33`pAK4Qr! z41Cf@96?R_f{&Q{C9J%A3RYh65e_IJ<_pBz4izqJJ7Qx!G>?mp=K!eQ^E8b6`x@p; z#pa7jTHCm2JFeH|MTL*$fOzwD<3sZ%RjetWzyn`o96P`NUa|R7720Cd=s2OL1nSJ1kDCj z5pR`X=Etju8`Skk28i%8a#i1qs@lB=UI-Sg&ghl%9>{o6c@Nz4h`(sENABL-eA(Cc z+kv6UtLNUqm{?aF(|o(od`Su=&2(#SRu^xd!RR|{h$gc!fOk!?3G(mq2;P`fQ&c#M znu}|S`e!i@OQ6W#1-UO!?A--7ny>#p?cH!?j~BKw+u^F{7PtTgX`c=}NnxFbO<35q zn^qDZ9WV0E$}{BM!D7iJSW+hC4hD;xrE+ykobbE}M_&pN!_Fbd=6k@`Zl#@jteQ_V zZ8q9GJ)!!;nX47T1ItgV7mpId1MO;wjpy{Oy-itB$tMZy{I8$y_9?@50?)_h_)BuGd(}zq-t#m0BlisL`tAD4$QtTq$Pp5p-j|R2{sb@QY2~ zY?q9A!z1Q<*u8GQw|#fHw4w(kEn`Gaw3R!@h|D8$_h9o?a`TN?)Wo*M@YN9?ACa5N zpT&rBN9FDz=3Dkx`lL_nJtuOCR#DrzH^z$WqgbuxYxR9+f4-^Kpsv0T2HhVkRv*QF z>Ic&*V3#ynh-*jXpyuXV^m~KqdF^`a@e62%TPa%b_i3FTFIs(sA4 zQ4@=kcclE>(0c? zeS@A~CtISx)CBX6w>b8W956BqdPV3NgWub?veIg+Z0QfCIvDe30?fCawQ;pXdLA|W zP$SOw`>TyQ`j?X}9x(o39(pm?<{Ob9Dj$Qbf3sV|BY#tZpanMBqxPJ&nTk~~ptp@I4VkPqz5zH66HG?%5wre3Kp{;zmr5FacgqS~# zFnzP@<3=rdy{YvP%UeJxNh~~u_1?0Tcpoyv{BeY}O+W9sYTa$SQ4{HaMdkkqb_i{) z2FO=hi%FlL;l*gNne?m4;x6=%t?U6)2QcK2RbnJt9~h>`=|fGrWzoQe2SgN z{DlqkZF+n(GScvRTM=>`rd*2_y^q5b?7=IK!*k}(A!N+mF(B*g${R3+yEl^I@AoLQ zy~eiYParIa88WZ__SP+AOCvaohxsE36R(XpI;-l{+OmZ=d2v{1mph0_SK;k{Y&#_$ zmzntJ#Ks-PX4Lp6z2EGpJ(BZmEUA(3?k_z*DTm$@wOetoPU0@xn!l+~=|{0R%<=K+ z2Q|!JUD&g+b8^VQ#8nSUdUg`sufej6PTJEVPjb`-pOGcCzI#w(QYYa-je6!!JET6B zGHp}WFY7$05y?l@I4&nx#GY$%o5k1h|A^P{%!-@djKqW^mT?vD7C5uA$Ktn!Iz94f z{Tq$9G?Z|+t#86A{|-u2d@Z0mO~^#5zQ`LicG4&;?z)}wm0Q zR{VwcJjGF-KcEtYpX0$VZio)^l&&`ZLW=hD8sfQmN}#VBzi5*e<;-zsiS_dor?}Zc z39xGWfbi?6v=M)#D|N-(l}bo)y=RrGvdAe^x(8?}6Bk`DVgi1@$C;Dv%81gtoH8F> zTq{)Ci!bIYzlt3Lm5JiS0wrH~W+@Iaxx3;mdM<=%Yr813g;=PJ6_p+9qsk(SXpyZ{^yf#Qc#cl9qud4Kvt4e{ zJ6mZe4rMFhB5{c_RBV{4)b>ly&Cbn_O3%%~ujUkp(%W+IqRmPJt452r1C(&6UgE=1 zN{vPHmGI){mndT_;`$(^yl6d0IbFG|husCv0#ReI@|$S&f>NnCph)Rq5&h$oB+;jz z@@TPVnQ~gO6^zewMGbek^|6WzRw*~VMPiJSE_xLzVPeA{GCnI6DowH9~kMDAPq`j#9H&nW#J`i)E9Qqav`6k|KV41W9pk znqn2RrYJ3Zvhznrr90CzX+x+uHwE#I^(Z?lFt>6>M2*eLD999-JxIQ>`A#F*;-@NO zm~7?5IHwYTkm9ogL+TopJ2ERO-!;NDPQ;`uHN~AY<#mxWRjFY~6jMW$I&2gnW``=l zqIpMUkeKgO-Vp1jVy>PHST*Y=9$x)ERk4XT3s7ZOU!{VG$yE|Xa*h&6HCU|ftBleM z3Uidr;@MoKPO)v8^0X{|e@q!HzMFw8-8utjZCYW%4c4Lwx#FmqN; diff --git a/src/env.d.ts b/src/env.d.ts new file mode 100644 index 0000000..e16c13c --- /dev/null +++ b/src/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index 57ae71e..0000000 --- a/src/index.ts +++ /dev/null @@ -1,208 +0,0 @@ -/* - * 🦉 Bubo Reader - * ==== - * Dead simple feed reader (RSS + JSON) that renders an HTML - * page with links to content from feeds organized by site - * - * Code: https://github.com/georgemandis/bubo-rss - * Copyright (c) 2019 George Mandis (https://george.mand.is) - * Version: 1.0.1 (11/14/2021) - * Licensed under the MIT License (http://opensource.org/licenses/MIT) - */ - -import { writeFile } from "node:fs/promises"; -import chalk from "chalk"; -import fetch from "node-fetch"; -import type { Response } from "node-fetch"; -import Parser from "rss-parser"; -import type { FeedItem, Feeds } from "./@types/bubo"; -import { render } from "./renderer.js"; -import { - buildCSS, - getBuboInfo, - getFeedList, - getLink, - getTimestamp, - getTitle, - parseFeed, -} from "./utilities.js"; - -const cssInput = "./public/styles.input.css"; -const cssOutput = "./public/styles.css"; -const minifyCss = process.env.NODE_ENV === "production"; -await buildCSS(minifyCss, cssInput, cssOutput); - -const buboInfo = await getBuboInfo(); -const parser = new Parser(); -const feedOptions: Parameters[0] = { - feeds: process.env.FEEDS, - feedFilePath: process.env.FEEDS - ? "" - : process.env.FEED_FILE ?? "../config/feeds.json", -}; -console.log("feedOptions", JSON.stringify(feedOptions, null, 2)); -const feedList = await getFeedList(feedOptions); -const feedListLength = - Object.entries(feedList).flat(2).length - Object.keys(feedList).length; - -/** - * contentFromAllFeeds = Contains normalized, aggregated feed data and is passed to template renderer at the end - * errors = Contains errors from parsing feeds and is also passed to template. - */ -const contentFromAllFeeds: Feeds = {}; -const errors: unknown[] = []; - -// benchmarking data + utility -const initTime = Date.now(); -const benchmark = (startTime: number) => - chalk.cyanBright.bold(`${(Date.now() - startTime) / 1000} seconds`); - -/** - * These values are used to control throttling/batching the fetches: - * - MAX_CONNECTION = max number of fetches to contain in a batch - * - DELAY_MS = the delay in milliseconds between batches - */ -const MAX_CONNECTIONS = Number.POSITIVE_INFINITY; -const DELAY_MS = 850; - -const error = chalk.bold.red; -const success = chalk.bold.green; - -// keeping tally of total feeds fetched and parsed so we can compare -// to feedListLength and know when we're finished. -let completed = 0; - -/** - * finishBuild - * -- - * function that gets called when all the feeds are through fetching - * and we want to build the static output. - */ -const finishBuild: () => void = async () => { - completed++; - // if this isn't the last feed, just return early - if (completed !== feedListLength) return; - - process.stdout.write("\nDone fetching everything!\n"); - - // sort all the categories and the feeds alphabetically - const sortedFeeds: Feeds = {}; - const sortedKeys = Object.keys(contentFromAllFeeds).sort((a, b) => - a.localeCompare(b), - ); - for (const key of sortedKeys) { - sortedFeeds[key] = contentFromAllFeeds[key].sort((a, b) => - a.title.localeCompare(b.title), - ); - } - - const yazzyUrl = process.env.YAZZY_URL; - process.stdout.write(`\nUsing yazzy url: "${yazzyUrl}"\n`); - // generate the static HTML output from our template renderer - const output = render({ - data: sortedFeeds, - errors: errors, - info: buboInfo, - yazzyUrl, - }); - - // write the output to public/index.html - await writeFile("./public/index.html", output); - process.stdout.write( - `\nFinished writing to output:\n- ${feedListLength} feeds in ${benchmark( - initTime, - )}\n- ${errors.length} errors\n`, - ); -}; - -/** - * processFeed - * -- - * Process an individual feed and normalize its items - * @param { group, feed, startTime} - * @returns Promise - */ -const processFeed = - ({ - group, - feed, - startTime, - }: { - group: string; - feed: string; - startTime: number; - }) => - async (response: Response): Promise => { - const body = await parseFeed(response); - //skip to the next one if this didn't work out - if (!body) return; - - try { - const contents: FeedItem = ( - typeof body === "string" ? await parser.parseString(body) : body - ) as FeedItem; - - contents.feed = feed; - contents.title = getTitle(contents); - contents.link = getLink(contents); - - // try to normalize date attribute naming - for (const item of contents.items) { - item.timestamp = getTimestamp(item); - item.title = getTitle(item); - item.link = getLink(item); - const timestamp = new Date(Number.parseInt(item.timestamp)); - const eightHoursAgo = new Date(); - eightHoursAgo.setHours(eightHoursAgo.getHours() - 8); - item.isRecent = timestamp > eightHoursAgo; - } - - contents.hasRecent = contents.items.some((item) => item.isRecent); - - contentFromAllFeeds[group].push(contents as object); - process.stdout.write( - `${success("Successfully fetched:")} ${feed} - ${benchmark(startTime)}\n`, - ); - } catch (err) { - process.stdout.write( - `${error("Error processing:")} ${feed} - ${benchmark( - startTime, - )}\n${err}\n`, - ); - errors.push(`Error processing: ${feed}\n\t${err}`); - } - - finishBuild(); - }; - -// go through each group of feeds and process -const processFeeds = () => { - let idx = 0; - - for (const [group, feeds] of Object.entries(feedList)) { - contentFromAllFeeds[group] = []; - - for (const feed of feeds) { - const startTime = Date.now(); - setTimeout( - () => { - process.stdout.write(`Fetching: ${feed}...\n`); - - fetch(feed) - .then(processFeed({ group, feed, startTime })) - .catch((err) => { - process.stdout.write( - error(`Error fetching ${feed} ${benchmark(startTime)}\n`), - ); - errors.push(`Error fetching ${feed} ${err.toString()}\n`); - finishBuild(); - }); - }, - (idx % (feedListLength / MAX_CONNECTIONS)) * DELAY_MS, - ); - idx++; - } - } -}; - -processFeeds(); diff --git a/src/pages/index.astro b/src/pages/index.astro new file mode 100644 index 0000000..e1c4fc0 --- /dev/null +++ b/src/pages/index.astro @@ -0,0 +1,229 @@ +--- +import getAllFeedItems from "../services/feeds"; + +function isRecent(date: number): boolean { + const now = Date.now(); + const sixHours = 6 * 60 * 60 * 1000; + return now - date < sixHours; +} + +const feedItems = await getAllFeedItems(); +const recentCount = feedItems.contents.filter((item) => + isRecent(item.pubIsoDate), +).length; +const categories = [ + "All", + "Recent", + ...Array.from( + new Set(feedItems.contents.map((item) => item.category)), + ).sort(), +]; + +const categoryCounts = categories.reduce((acc, category) => { + if (category === "All") { + acc[category] = feedItems.contents.length; + return acc; + } + acc[category] = feedItems.contents.filter( + (item) => item.category === category, + ).length; + return acc; +}, {}); + +const accentColors = { + slate: { + bg: "bg-slate-200 dark:bg-slate-600", + bl: "border-l-slate-200 dark:border-l-slate-600", + }, + stone: { + bg: "bg-stone-200 dark:bg-stone-600", + bl: "border-l-stone-200 dark:border-l-stone-600", + }, + red: { + bg: "bg-red-200 dark:bg-red-600", + bl: "border-l-red-200 dark:border-l-red-600", + }, + amber: { + bg: "bg-amber-200 dark:bg-amber-600", + bl: "border-l-amber-200 dark:border-l-amber-600", + }, + lime: { + bg: "bg-lime-200 dark:bg-lime-600", + bl: "border-l-lime-200 dark:border-l-lime-600", + }, + emerald: { + bg: "bg-emerald-200 dark:bg-emerald-600", + bl: "border-l-emerald-200 dark:border-l-emerald-600", + }, + cyan: { + bg: "bg-cyan-200 dark:bg-cyan-600", + bl: "border-l-cyan-200 dark:border-l-cyan-600", + }, + sky: { + bg: "bg-sky-200 dark:bg-sky-600", + bl: "border-l-sky-200 dark:border-l-sky-600", + }, + indigo: { + bg: "bg-indigo-200 dark:bg-indigo-600", + bl: "border-l-indigo-200 dark:border-l-indigo-600", + }, + fuchsia: { + bg: "bg-fuchsia-200 dark:bg-fuchsia-600", + bl: "border-l-fuchsia-200 dark:border-l-fuchsia-600", + }, + pink: { + bg: "bg-pink-200 dark:bg-pink-600", + bl: "border-l-pink-200 dark:border-l-pink-600", + }, + rose: { + bg: "bg-rose-200 dark:bg-rose-600", + bl: "border-l-rose-200 dark:border-l-rose-600", + }, +}; + +const pickRandomAccentColor = () => { + const accentColorsKeys = Object.keys(accentColors); + const index = Math.floor(Math.random() * accentColorsKeys.length); + return accentColors[accentColorsKeys[index]]; +}; +const categoryColors = categories.reduce((acc, category) => { + acc[category] = pickRandomAccentColor(); + return acc; +}, {}); +const categoriesSelectorCss = categories + .filter((c) => c !== "All") + .map( + (c) => ` +#category-picker:has(#${c}:checked) ~ main ul { + > .${c}-item { + display: flex; + } + > *:not(.${c}-item) { + display: none; + } +}`, + ) + .join("\n"); +--- + + + + + + + + Carter's RSS Feeds + + + + + +

+

Carter's RSS Feeds

+
+

+ {recentCount} recent item(s) | {feedItems.contents.length} item(s) | { + feedItems.errors.length + } error(s) +

+
+ +
+ +
+
+ { + feedItems.errors.length === 0 ? ( + <>No errors + ) : ( +
    + {feedItems.errors.map((error) => ( +
  • {error}
  • + ))} +
+ ) + } + +
+ + diff --git a/src/renderer.ts b/src/renderer.ts deleted file mode 100644 index a038c5c..0000000 --- a/src/renderer.ts +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Return our renderer. - * Using Nunjucks out of the box. - * https://mozilla.github.io/nunjucks/ - */ - -import nunjucks from "nunjucks"; -const env: nunjucks.Environment = nunjucks.configure({ autoescape: true }); -import { readFile } from "node:fs/promises"; -import { getRelativeTime } from "@feelinglovelynow/get-relative-time"; -import type { Feeds, JSONValue } from "./@types/bubo"; - -/** - * Global filters for my Nunjucks templates - */ -env.addFilter("relative", (dateString): string => { - const date: Date = new Date(Number.parseInt(dateString)); - return !Number.isNaN(date.getTime()) ? getRelativeTime(date) : dateString; -}); - -env.addFilter("formatTime", (dateString): string => { - const date: Date = new Date(Number.parseInt(dateString)); - return !Number.isNaN(date.getTime()) ? date.toLocaleTimeString() : dateString; -}); - -env.addFilter("formatDateTime", (dateString): string => { - const date: Date = new Date(Number.parseInt(dateString)); - return !Number.isNaN(date.getTime()) ? date.toLocaleString() : dateString; -}); - -env.addGlobal("now", new Date().getTime()); - -// load the template -const template: string = ( - await readFile(new URL("../config/template.html", import.meta.url)) -).toString(); - -// generate the static HTML output from our template renderer -const render = ({ - data, - errors, - info, - yazzyUrl, -}: { - data: Feeds; - errors: unknown[]; - info?: JSONValue; - yazzyUrl?: string; -}) => { - return env.renderString(template, { - data, - errors, - info, - yazzyUrl, - }); -}; - -export { render }; diff --git a/src/services/feeds.ts b/src/services/feeds.ts new file mode 100644 index 0000000..4dc3a59 --- /dev/null +++ b/src/services/feeds.ts @@ -0,0 +1,178 @@ +import Parser from "rss-parser"; + +interface FeedItem { + title: string; + feedName: string; + feedLink: string; + pubIsoDate: number; + link: string; + category: string; +} + +const MAX_CONNECTIONS = Number.POSITIVE_INFINITY; +const DELAY_MS = 850; +const parser = new Parser(); + +function readFeedCategoriesFromEnv(): Record { + if (import.meta.env.FEEDS) { + return JSON.parse(import.meta.env.FEEDS); + } + throw new Error("FEEDS environment variable is not set"); +} + +async function getRawFeedContents(response: Response): Promise { + const contentType = response.headers.get("content-type")?.split(";")[0]; + if (!contentType) return {}; + if ( + [ + "application/atom+xml", + "application/rss+xml", + "application/xml", + "text/xml", + "text/html", + ].includes(contentType) + ) { + return response.text(); + } + if (["application/json", "application/feed+json"].includes(contentType)) { + return response.json(); + } + return {}; +} + +interface RawFeedItem { + creator?: string; + title: string; + link: string; + pubDate: string; + "content:encoded"?: string; + "content:encodedSnippet"?: string; + "dc:creator"?: string; + comments?: string; + content: string; + contentSnippet: string; + guid: string; + categories: unknown[]; + isoDate: string; + [other: string]: unknown; +} + +interface RawFeed { + items: RawFeedItem[]; + feedUrl?: string; + image?: { + link: string; + url: string; + title: string; + width: string; + height: string; + }; + pagenationLinks?: { + self: string; + next: string; + }; + title: string; + description: string; + generator: string; + link: string; + language?: string; + lastBuildDate?: string; + [other: string]: unknown; +} + +function getTitle(item: RawFeed | RawFeedItem): string { + const titleValues: (keyof RawFeed | keyof RawFeedItem)[] = [ + "title", + "url", + "link", + ]; + const keys = Object.keys(item); + const titleProperty = titleValues.find( + (titleValue) => keys.includes(titleValue) && item[titleValue], + ); + return titleProperty ? (item[titleProperty] as string) : ""; +} + +function getLink(item: RawFeed | RawFeedItem): string { + const linkValues: (keyof RawFeed | keyof RawFeedItem)[] = [ + "link", + "url", + "guid", + "home_page_url", + ]; + const keys = Object.keys(item); + const linkProperty = linkValues.find((linkValue) => keys.includes(linkValue)); + return linkProperty ? (item[linkProperty] as string) : ""; +} + +function getTimestamp(item: RawFeedItem): number { + const dateString = + item.pubDate || item.isoDate || item.date || item.date_published; + if (!dateString || typeof dateString !== "string") { + return Date.now(); + } + const timestamp = new Date(dateString).getTime(); + return Number.isNaN(timestamp) ? Date.now() : timestamp; +} + +async function parseFeedContents( + feedUrl: string, + category: string, +): Promise { + console.log(`Fetching: ${feedUrl}...`); + const response = await fetch(feedUrl); + const body = await getRawFeedContents(response); + if (!body) { + throw new Error(`Failed to fetch feed: ${feedUrl}`); + } + try { + const rawFeed = ( + typeof body === "string" ? await parser.parseString(body) : body + ) as RawFeed; + const feedName = getTitle(rawFeed); + const feedLink = getLink(rawFeed); + const items: FeedItem[] = rawFeed.items.flatMap((item) => ({ + feedName, + feedLink, + category, + title: item.title, + pubIsoDate: getTimestamp(item), + link: item.link, + })); + return items; + } catch (err) { + console.error(`Error processing: ${feedUrl}\n${err}`); + throw err; + } +} + +export default async function getAllFeedItems(): Promise<{ + contents: FeedItem[]; + errors: Error[]; +}> { + const feedCategories = readFeedCategoriesFromEnv(); + + const results = ( + await Promise.allSettled( + Object.entries(feedCategories) + .flatMap(([category, feeds]) => + feeds.map((feedUrl) => ({ category, feedUrl })), + ) + .flatMap(({ category, feedUrl }) => { + return parseFeedContents(feedUrl, category); + }), + ) + ).reduce( + (acc, result) => { + if (result.status === "fulfilled") { + acc.contents.push(...result.value); + } else { + acc.errors.push(result.reason); + } + return acc; + }, + { contents: [], errors: [] }, + ); + results.contents.sort((a, b) => b.pubIsoDate - a.pubIsoDate); + return results; +} diff --git a/src/utilities.ts b/src/utilities.ts deleted file mode 100644 index 3d9be1a..0000000 --- a/src/utilities.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { $ } from "bun"; -/* - There's a little inconsistency with how feeds report certain things like - title, links and timestamps. These helpers try to normalize that bit and - provide an order-of-operations list of properties to look for. - - Note: these are tightly-coupled to the template and a personal preference. -*/ - -import { readFile } from "node:fs/promises"; -import type { Response } from "node-fetch"; -import type { FeedItem, JSONValue } from "./@types/bubo"; - -export const getLink = (obj: FeedItem): string => { - const link_values: string[] = ["link", "url", "guid", "home_page_url"]; - const keys: string[] = Object.keys(obj); - const link_property: string | undefined = link_values.find((link_value) => - keys.includes(link_value), - ); - return link_property ? (obj[link_property] as string) : ""; -}; - -// fallback to URL for the title if not present -// (title -> url -> link) -export const getTitle = (obj: FeedItem): string => { - const title_values: string[] = ["title", "url", "link"]; - const keys: string[] = Object.keys(obj); - - // if title is empty for some reason, fall back on url or link - const title_property: string | undefined = title_values.find( - (title_value) => keys.includes(title_value) && obj[title_value], - ); - return title_property ? (obj[title_property] as string) : ""; -}; - -// More dependable way to get timestamps -export const getTimestamp = (obj: FeedItem): string => { - const dateString: string = ( - obj.pubDate || - obj.isoDate || - obj.date || - obj.date_published - ).toString(); - const timestamp: number = new Date(dateString).getTime(); - return Number.isNaN(timestamp) ? dateString : timestamp.toString(); -}; - -// parse RSS/XML or JSON feeds -export async function parseFeed(response: Response): Promise { - const contentType = response.headers.get("content-type")?.split(";")[0]; - - if (!contentType) return {}; - - const rssFeed = [contentType] - .map((item) => - [ - "application/atom+xml", - "application/rss+xml", - "application/xml", - "text/xml", - "text/html", // this is kind of a gamble - ].includes(item) - ? response.text() - : false, - ) - .filter((_) => _)[0]; - - const jsonFeed = [contentType] - .map((item) => - ["application/json", "application/feed+json"].includes(item) - ? (response.json() as Promise) - : false, - ) - .filter((_) => _)[0]; - - return (rssFeed && rssFeed) || (jsonFeed && jsonFeed) || {}; -} - -export const getFeedList = async ({ - feedFilePath, - feeds, -}: { feedFilePath?: string; feeds?: string }): Promise => { - if (feeds) { - return JSON.parse(feeds); - } - if (!feedFilePath) { - throw new Error("No feed list provided"); - } - return JSON.parse( - (await readFile(new URL(feedFilePath, import.meta.url))).toString(), - ); -}; - -export const getBuboInfo = async (): Promise => { - return JSON.parse( - (await readFile(new URL("../package.json", import.meta.url))).toString(), - ); -}; - -export const buildCSS = async ( - minify: boolean, - input: string, - destination: string, -): Promise => { - const output = - await $`bun x tailwindcss -i ${input} ${minify ? "--minify" : ""} -o ${destination}`; - if (output.exitCode !== 0) { - const err = new TextDecoder().decode(output.stderr); - throw new Error(`Building tailwind failed: ${err}`); - } - console.log(`Successfully built CSS to ${destination}`); - return; -}; diff --git a/tailwind.config.js b/tailwind.config.js index ebe918c..773b701 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,7 +1,7 @@ const plugin = require("tailwindcss/plugin"); /** @type {import('tailwindcss').Config} */ export default { - content: ["./config/*.html"], + content: ["./src/**/*.astro"], theme: { extend: { fontFamily: { @@ -208,18 +208,7 @@ export default { "'Segoe UI Symbol'", "'Noto Color Emoji'", ], - }, + } }, }, - plugins: [ - plugin(({ addBase }) => { - addBase({ - a: { - textDecoration: "underline", - transition: "color 0.2s", - cursor: "pointer", - }, - }); - }), - ], }; diff --git a/tsconfig.json b/tsconfig.json index 565a04d..5378929 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,23 +1,3 @@ { - "compilerOptions": { - "module": "esnext", - "forceConsistentCasingInFileNames": true, - "removeComments": true, - "strict": true, - "importHelpers": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "target": "ES2021", - "noImplicitAny": true, - "moduleResolution": "node", - "sourceMap": false, - "resolveJsonModule": true, - "outDir": "dist", - "baseUrl": ".", - "typeRoots": ["src/@types"], - "paths": { - "*": ["node_modules/*", "src/@types"] - } - }, - "include": ["src/**/*"] + "extends": "astro/tsconfigs/base" }