From 88dced2c4d8bf7e90f8bb79b76a5327504af5e15 Mon Sep 17 00:00:00 2001 From: Geoff Seemueller Date: Thu, 21 Nov 2024 13:23:45 -0500 Subject: [PATCH] convert project to typescript --- build.ts | 5 + bun.lockb | Bin 0 -> 43021 bytes package.json | 8 +- ...kdownGenerator.js => MarkdownGenerator.ts} | 183 +++--------------- src/{TokenCleaner.js => TokenCleaner.ts} | 16 +- src/{cli.js => cli.ts} | 8 +- src/fileExclusions.ts | 71 +++++++ src/fileTypeExclusions.ts | 60 ++++++ src/index.js | 2 - src/index.ts | 2 + tsconfig.json | 28 +++ 11 files changed, 218 insertions(+), 165 deletions(-) create mode 100644 build.ts create mode 100755 bun.lockb rename src/{MarkdownGenerator.js => MarkdownGenerator.ts} (65%) rename src/{TokenCleaner.js => TokenCleaner.ts} (83%) rename src/{cli.js => cli.ts} (71%) mode change 100755 => 100644 create mode 100644 src/fileExclusions.ts create mode 100644 src/fileTypeExclusions.ts delete mode 100644 src/index.js create mode 100644 src/index.ts create mode 100644 tsconfig.json diff --git a/build.ts b/build.ts new file mode 100644 index 0000000..9adf48e --- /dev/null +++ b/build.ts @@ -0,0 +1,5 @@ +await Bun.build({ + entrypoints: ['./src/cli.ts'], + outdir: './dist', + target: 'node', +}); \ No newline at end of file diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..b145f6c656b5bf4778b06b673982868dcdde31da GIT binary patch literal 43021 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

8Q z?m)xUrQ^b)U&iyyJSD5 z;#;Vn~7w=@* zlhvMWtlo^Aq&UK5m(cgk=3vdmN0mken{zma2OZi~JLRRsp#ELILfLw-usJ++Vp$ZkuA3F_hs5zM5 zttf2w=FOyev+ROmzi_W{W1Z`y%09(A4tTHj#PL>cc+cn&q5L|Eb)j8arz>aw0-);86~5NXC0iLI`i}E4;?ZRp6=^;r=+;Y zdS}U1G=2@}xMQ@c9iEIjkUhJT^6o`z?AJW&u}$gV#{+$Dmw)d(`Bpobhe65@UrBcR z5L20!DK~oWD4o8hJKN6utQ0A8XlNv3(pnm>AsshoSK#Lr?3uQba|R8WtitV`Kj6k3 zpGUf$``5Qsmy3IJc1z)mS9;z%@2_~Cl+KK-`)KKOaCh78@%w7DbRWyPl*Q9N=W@l^O139`hA9;4qJTJ^5tu71hGb_)G9MwW)CFE#7N_wILnrNNJT z3w*k^`W77g>^ajcTz{-vVDapOjGo%c{)~=oqT(GUe5LVgLdVtfD>j_=MfIWQkstCm zzI<}Z_A&e-*{StMv)QNiZ~6N5=u_PcH>vm|q3+{1d0ib7dqCEzb8+&_*v~t<^H@o{ zt_9F=@jU}^Os88DP1l!6SwwW*)n{C{BA&;VVHXWN75hzTtrjx&@y+=PCGm%%rKP1b z`fprYqc~?$Os)C29A&RPIU`ewm#$nNN5eHGpb#>Zj&2vcsT-Ep*{8j&lI|f#-GwVg zt$F*l@Mfp`*V7~t+W232e<;On--c;B3%#}O_B{5PGe2Pch@5stmm@8%#%0j^4Zbm{ zcg!c_1PAw?_X#Sxx$B~vM$gFMoJ%?WXC&VG_p~gU{VMdZVVcL>Ub|jYcRcs}Lz#7^ zphi86@!WpB_OX4_hgSNGNv81&@80Si^PtyKbI!;0fiKScF5G@*+5CL(4>tv!msQP8 zp6jpfG~YP!oay}@>vFHYI9MuOS>#*85Cl)1U3AfQ-BdxIu6+dk9;SaiD#&4J%+%Zc zc;02cS(O3p20owsF+5w%NA>udFRgX;N9RXH?V5C{pR}J9e5!MHE2G0)skAkwvg^Xs zp6<=`Do;Fbv`f|L=7ZT?gnQG*Ii?&~VO`wqYqY)Ubs8>t--O`I&E^~Wk62&F(#|tx zr7gDDHRMiaN~n>8Y_fLF({_^|jGMgtLg)OHYw}8vs)8EN!%ml%!l%qZG>K)+ZXw_!vo`}xs(y7z(5exTED@(|es?({< z>9}|KJ*l%M4~Xm#-vI}q0ZJP4ShJrZn%9i(s<=Am2<@ERr{qc zzh4giGJLPo^gfntl1-nF&0kH!#rJW@ZbisGwjm=#{ zvo0sU`feyU@l%c7ZOOOC;_epQHT~MR`c~>(+)Xi#4Bia?9DfRj*7uHVmF= zzj5UG#IyzGnekyYH!KG-WhOED*wFa3rQh&^) z9UKm(^179p6l_$~O}9xhN_fxPpcd?I+b@3k9F>9<#sj#HTV-Zx+^69Vq2sRVJoEVE zq!o8t`6d?bcc1D%ee&Fu+Bx=}BK ziq2)uLu*Xb$Gh)i-?A9*<(=fVp?mKQa|fS|`IL0?U1$BQ_jza6>6J{*(ogDDTPZ`s z#rMR-F^?uqcd>N);6JczW}n2vBL{x6Is8g$x8eQd33hG~t?J~~hv|*#5X6YpUVrfW z!e#BpCl(Cl?E8@BRITeVbl;aFooKlD-kCUNb#=+>A9Bi<3#5A4Ds(+@YmJKXo4lRU z$(NEh9C|deAf%&lvA)@yT{0Qc0;MBCa-VI_RNtS?Z2vU>xXE3Cz6||*Je+_+$ds6W z`-aejvm|KxqtOy$dtLmbu_*EA4PSF>yJ8okB*l_V{X(rOtun_Zmf7u>+_r0lp`J5v}35x`5fOlyE-ZGRQq2am@rD!$+_on z)r#s3+S`O%9W1>g>(-~=`7ZTZvEbf|_e1m+hL#yG;%3os$@_K0W`?NV@thrVY?bQ$ z2 z=!0t4K2t`PUyOedwP9zc+B1X3tqzmX={5gBlx>WqZ<3Ok%TZm)Jt6m!{R0=c&~Qi5 zaeH+0Y2R(r#@!)beJ?&z{pva?$;07l-BRAuE>dmZ9f`AX`_X&uqu~eJzS}l_@9k&X zSugS*#9A$z&IxPf;CHQ;34I-MqT}8?R`pofcia9CTjIBmT9y0$uJ2{{cO}rBVpd+J&ClEjPq z9_u7WIVD)6s2*OlC93_+Or|T(*2!UwF5lon^p>P)FOOMN@$oG?XivX0`MJSnAd z)8)PxO{eeIUFf(8d0X7B#aKsjdd<9}VRyPrPOWT8#26vA#y*cQhUM>AQ;B?pkx(EO~PGme#k8H>6s< z9kX(uPpi$F^3Ub$7;fgCc0OJ5Y+;6Z=M6hno2V>2Vfa{)|Fp(4ZB^y7l$~}9Xt=I) z+`@I^@~-)xUNyhH)-cWFw{pW)r+Z23YFH_&kMGrI!|EN5g^n(>vhUrq9MMZ!rhD=; zi@u}zywwIz^oN;nWlDG1(QwIkAqdZW_sV1Es=UFAdk7j=SyH1#j+)y{%1h+lRefy-0h)Fy-sA%JQ$4jyjVWZy@D4^qIud zAJ40NGbOvM+Ih@SzEUB7OKxaE=8~R8H)}eX(AOdS9)>ukihSa@t}dP>Pd>|8cxO)L zuDEN~agFz|`$A`*$A`Gz6%Q0#IV=4py?pNdXWLfR7E5&gB18chFs<7$z zeVzmqLZW+tM z10Ud@n} zmgfpwJW{V+@XUG8`<1&Z4Hv&3B93|SN>%xobIMnjgrB&vUwh0KV`Z~}eVm(T`M_|d1OLy-+)T}D9NTuJGknfQYn<;a8v--r@ zUCqiy2JXuKKC<|klE$2pEN-W?W8p8C#5-oLdAZr^^vte3_J-woUi~;D^W__*oNOo8 z^e=BN%ZIwZ98BXEziT3nDcj3dZtePfbtl)sJ{)h2^cCYwSlgs!rEX=to-|l%>ZEn? zH9Hsdv*tw}eWK-wXQe3UBOqpYf*`+kd(e|2U1Rg9!vt0HoIg9=@; zAJFIDNrYL%EljauMQkqC$vRbQx6JYSv-599dOp{vxiG8ChuDh4Rv}$x4KSFhwy476 zn8L?Rr2%UPrdDb{U;SK4Ii=)QdB|qb`Isr23|N!txRwL$mj%gx2;9qeisJ+~eszx3`U-IYrfttYh2!G#KWQbT0R^5 zcM{~84fZ+JXQRWz8+!45x-2TI)N`Ip$(JFE@BGWkmA-8*B=PF(EgZyK)24-&iW^C?qtlx@0kK^x{`?=%< zTgz2f-K%i6bMW!)=a95u#0q5!mq~pm$D!kfJXG`Y(wybCsB6D==@H#d>J=}0^QfZM za^04|oFlXS^B3;k=KGDmV1l%3j`EpuwTt|$IUAqZtM=|!H+f;$+x*31T;$h>j=Ou7 zes0Gfv+dVcam|D79S=>3Kae;uKz8lpp>C)8=3R9z%AdPF-@MDmwM_SQGgbsHP`YT- zcEmZ(oE_G);XS`O#yAsg zFV}&qTZ!HuGh|T?estWZs{3l!qAzv3+ULgYYKKzkmC6Z*Z8r4wFMQqKUHNFqLbs!i zyzbAUUOTUre_A%>!H&7DuUi~f9_YQz^nPg0=(>IszoPGK{OP#c&zSr;Z&Z3F?sf0c znv7wO%aghX2H9*`+eYWU#4fv%>d4RUC&yeetzI}`aZRt>AL|N~c1<`;T7JN|+OO1hQX7?>;(f^w_R5Prr>FInF}dOTu5Pp7*yg!S zDxItHK*4Tp_?CG{$@9e68%Qcews~qc=sDmAHDSKt1+XVPtG{J zaG#F(djqcrFTXjboY?Mv^wu}0IV#*Sy}H*1Y}mg{&F&2iH;9fKT;Nj7JZ1R)b*rSM z=EtJ-S^Jm7XWR_*Q2)^`SC5djdfJa( zO>{m+!^Q7TiDTv#ovgmjn_?Y)CQ^T}-Z^SEOxZ=JpIt=X>~O7iq`ql&ldKYxz4KBW%WVr2Hm_BG%ZLidFtm=`q8S) z_Mxm4x96|yoZknwQ4Br0l)hgNqvMXvJ(*;fX;!w#y)fBqXP)&uMcw>=yyA?La|b?I&EMNc}u);O;?WIyL&i5zeHWlo{vs`;bsw}y|7 z>^I(j#P$)fE44QlfE)mta_!+0Kk(Gw02C+vuLzJo^0zSUAp&z*-0v8}a^!Dho`s0~ zAIklX_HWu>3H)D`0O~#YTc^(O@fmzK825j%E!d75Fu39S#JDO5|1{43FShM3&!TmP z{0&-f_!taSHSYg6x#0dD9SKFTzyJPEO91B*@^^pn4}g>B|5^`hm;SoH68I~DzY_Q> zfxi;?D}lcf_$z_G68I~DzY_Q>fxi;?D}lcf_$z_G68I~DzY_Q>f&Uv42o=9iR}_f& zZDS$ea}0RF0wFsv(12KrG;jkOgH{?QMj8TMG&jVzkA|rRI}lAE`ojCFdiVW@$YBD0 zUxD|<@fZO|;&?X=@3tt1-%4N^De&a)1mJfLn1=5N$ZzID#cB9AR}#RZ!|w~Q9R9tO zS>k7G3#Q@UI++a~%VWDR%|_fnMe!fI1iM}waZJ_dX&_!;1_{rIhc68H|_vF-SG2e7^Pdw%@w zJ^oG}f76b?KgZvSE66 z9z6cOUK@tWZ8EE0h`b6ZRYSpFVg!@YuIKz@t8(UUUPGdV)HGx`R4|I)%E`7Ceqfln?5g zB6yS^${zb3(=m=A(ZP=JjJk(-8sJgqG{I|u*9MQehI)qjrUSkYcq8zJ;E`8+HUW?6 z=&{cSf;R`>A3XN`An>Rgq)%<&c`$hFLu?=RDfT()(kSqb;E`vP5y}STf%=GTcLR@l zh;1GXehhfj9e41kN2pUsgZY!dWB>Vq_XW=d?*pC#-Wxm{{1os!@KeDDfe!^A3_e60 z@*!L*)}djuAp)+A#RQXnUf}~^hU`~ApBVogq5YSsezG!5%wf-6-O*2 z%1TT!H^3}PzL-O73d%}?kyx%kD3UPrXdJOV2sDTVLPohkzsC`~gOFolVgP^)Vwsd! zLTo@I-whF4o(&ujE2zZkBIFpG85o-w7?E$1h&@oq>1zQ0i8LIf9Y-vNN&*eGQzTz( z53xN8Imk7r1hEQCtdK%ZU&sNp?a-dqKtt@5LXHX414E;`gh+10VkzYGH!#K={9YII zI*!;dg&Z?LgPi@4gJ{I6DMdr^M(nr}yOEG%Y5?s7ZI=>RdL@=6sT>f2F~bIOlmU&{ zpoAQ##TiJarmM{H?QXdnfc zy&(riMjWxeDdM1?K|cnumrLw(LJsx<$beYXB^Ej<8dJ<6Hg}1QPcaQlNyI8Iu>uM? z{SnQKLG1bxJED-&4;93;-a;_3ND4WWzB3qAz%}Y9v27|wgQu-DH@OugF);T z6FaF5XvD%Xv8W0;14I%fHhGB+P>P1?Q(`rlSZReEV^B8`Hdi3BuT1Q@VvYgT3&a95 zvG@u(fQ7sf8_mQfEaZTOV*d~;&%~-M9Mn?Rh1AqQqEluiIoh*K?N{<<5UOb@x^$`X1Q1$Q5o zQk*G>)nEz@ha6~#$euT`A55W9vL+V4iG^V?4QLgy4NhzkQ#2HB#CkZfRxHkedWd~- zV$T?Iu(x3>{F%3Z)-%J%fU4)uG{g=$v3pE$ZEOHbC9z0OEFe=kl!g$S<-|s^qy!|R zaO$m;6RXG+*VLT&2R(pZAePFBWn`d1eS@AOw#>%mo!Dpw8d%Jb1M&qSvCa%R14L^uv8PV#H&Zm!jP&Q(w!)s_T`B^Ye|V2pzo+5#IiiGWKE%&G%{ZU8nH@GtY8BTj$p_k zcI%0qY%vGGHL+YzEM-$URC|8A(&8e+AlB=NwQQ;$*f|(8{yZc7d8PgHs`>kM4i(|o zogHu>+Kw{*yvls&M4cPrh>dQb!MzJehkV&sZ_T^DxBt9iNOY!l<#EIkIE6;dRcyXr zD4Q?f5}V+VgL5y`(;bdDxZfdG!I5jxT%`{=a*#vphC_~ct~v-gxaT7l#Ho5Ht=bER zoQ{w~Y==|zP`dL6i2?_IZqIM#gTA0UFdBc|Un@%Fz+?cYwz$#oPX`Ezb#bNyDsNv{ zWqcq9_m;%|ctcJkoIASTiA?E|+z-~2;*ivuEsfJ|i1!5f?MkDM7&0&il0S8I!IbtVWvVN`q06Ew{ z#A3RnNCq&1%{4?h#AZ664S>CvvC%(HIgn!l3Swd~;5QtY8JP5g31JAV0Q8el0|(lg zqVoc=#onM*OT{O=%k?Kc`t_KA8#Il}Hy9cz(c|5(`P3y79)}+i#1?Y=#R+(F z4Gd%lvHQ~S0t5}^{Ds0$!9YVpKGzRw;71t*hXw@*3_|#Rh7E-bS+ocXhvonSp;afKmUdOF5{WCBHQ(6<^_)RYY#&1$t zu%#EF;pfBTsBgdt5H!LUDF%?_5d@C^HQq_$l?cehPb~2j1JYsrB3%WoZKQIsKC{Gy zS)!veB8XL;1$q_~9?TO)ks{$jULY9=v|Or3Lqo|3;e-VH^88qAKA#=ckjCedXHms` z4vB{bhWqh?SyOpJ8~^YicCfF2`utiHiSQ4>aVani3h@aKqz5+Dc(W(hd{+#og#Qh|Ua2xUhEa|IlBD3=8VVfqniBn;_5Ua%0#hJ{w8;z;Kx40tFEvd>>W>pB;*G84LL5Or;tKdns-(XbqPa z+=%M@S`@1LH3=pgIQliA$GCF?S`2_m-0U{4_YKSfRYQcLZE7Spv>j+0BGkBTs@{5O z0crg+MQPRq$Kta$(21XbSJ*B!LG?@L1NAQ{P&cjzjZ3Rumw>+h8Ri$9seqE2;91{-q?q{gMLgz<-n!z1e~6U=G)ZMQJfi1st{zon4fz(9%#kWf$GF}i*NX-CLZBZc{*j2&hZFpmQI$9|Jp~a{UZ;I_- z*GYi*HHk&t?_x9XhDx-YHln-@g%GQrg6e{%lvjKOCMFcZG=-b3rW6pb)PMv7s0HrQ zkXLFndx!h_HoEhql>!7>3@UDVcKc<|fo%W03!(b5sokRZ79Oa@Pt@AnG!=ELPf<}% zFf-wJgQnvKiw(y(L1SvuP>6yc6x4`sN@+xQFcclE)LfS6MFUn%-4nvbDY6j-`OW5y zf}*x}^er89rg+cZ2wHuOfKmV4FmH)2el=oZG^p1*M${9f(6|q$2$}+~2NvC*Vlx{d zp>I{cqB%l_orWBdB?FS-Sj5+{PTU3ER*Bef@)RBfA?9+(!e<=xozobxOi)t{* zpiW24fTYUN07d6y?2V@6M=eA!I{`6yq$UPxHpIIK7InF8U`T%1DvCG46ICAIsE}$> zQ*$JBtql}Z*dT;P>frdZ1E&H76+*9zx23ong|kvrAXgv=55>ct0Qx1c(Sy&=1p)Kt z1nB6d$2qx42Ws-zEaj!~3#7CdrN~s*QS3t_f?>`SHYO2lCMk!Kp~oqiQavh44rT{6 zHvKjfss};}YNy`R@dK{Su_*!5U}FLogwzlbZCgpT)M6yc_~nS(NF)DD1aWDzaS3-b6O=qxkf)6%O z6!qC0I88L7bw8B@7%YzaSGe?QN}|-ARQ)v+B@UWcn$fYM72B}knhVGqBESWzM-$2+ z#t6W558fO#+|@PKW-*Z{;B$bKJi_uIo)Ja&X)IqpSKyB~RH4+Z6txn2^8Q}hi{(ZHpE$Q^QscL0}zm$!J) z+lUx`TOQzlqNmoHrWQ#t5;ampm*nDWa6l73q0-{A)vU2i0}_o=7IoVWX!K~q67;)+ zhm|FD@@S;}Vl4V8sG$aWDyRk?1%P!NwD7LWfE(G^1Pdhq2>zvZ7=1;Pa|m1}Q)zJY z3Xfz(_A|AqPx4{&BjDEmr!+|L35gK=oG7AYv-uqV-_ZXfy}l}zH(S7k825K|{w9-F zd3|mpl59Zz9idnjzssTts9Eq0f~sdrjQ*RPmV*CNT4L;fX0#Mq%$>M{er8#m*iuLl zQ$HjAl-5!}TL1i}$3!0%G&OvGqtQP%7F4{YeAP?;AHC5$o6DDXPYC0c;hR2-`og8Kb1qd@Yx)$0Ol#& z$u}{@idgx1jxrX_ZZKmtB?_F?Le&Nom|UsvL7Lid{>mp@O`(h_Re}Y9CEyCf8+)hob3v&1=LC`P5K;7L J#{a&5{~r|$1F8T3 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index fd248ea..7ebf628 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "dist" ], "scripts": { - "build": "rm -rf dist && mkdir dist && cp src/*.js dist/", + "build": "rm -rf dist && bun run build.ts", "test": "echo \"No tests specified\" && exit 0", "prepublishOnly": "npm run build", "dev": "npx .", @@ -31,6 +31,10 @@ "@eslint/js": "^9.14.0", "eslint": "^9.14.0", "globals": "^15.12.0", - "prettier": "^3.3.3" + "prettier": "^3.3.3", + "bun": "latest", + "@types/bun": "latest", + "@types/node": "^22.9.1", + "@types/micromatch": "^4.0.9" } } diff --git a/src/MarkdownGenerator.js b/src/MarkdownGenerator.ts similarity index 65% rename from src/MarkdownGenerator.js rename to src/MarkdownGenerator.ts index e29a106..53f7292 100644 --- a/src/MarkdownGenerator.js +++ b/src/MarkdownGenerator.ts @@ -1,4 +1,4 @@ -// MarkdownGenerator.js +// MarkdownGenerator.ts import path from 'path'; import { execSync } from 'child_process'; @@ -6,17 +6,18 @@ import { readFile, writeFile } from 'fs/promises'; import llama3Tokenizer from 'llama3-tokenizer-js'; import { TokenCleaner } from './TokenCleaner.js'; import micromatch from 'micromatch'; +import fileTypeExclusions from './fileTypeExclusions.js'; +import fileExclusions from './fileExclusions.js'; -/** - * @typedef {Object} MarkdownGeneratorOptions - * @property {string} [dir='.'] - The directory to process files from - * @property {string} [outputFilePath='./prompt.md'] - Path where the output markdown file will be saved - * @property {Set} [fileTypeExclusions] - Set of file extensions to exclude - * @property {string[]} [fileExclusions] - Array of specific files or patterns to exclude - * @property {Object} [customPatterns] - Custom patterns for token cleaning - * @property {Object} [customSecretPatterns] - Custom patterns for identifying and redacting secrets - * @property {boolean} [verbose=true] - Whether to log detailed information during processing - */ +interface MarkdownGeneratorOptions { + dir?: string; + outputFilePath?: string; + fileTypeExclusions?: Set; + fileExclusions?: string[]; + customPatterns?: Record; + customSecretPatterns?: Record; + verbose?: boolean; +} /** * @class MarkdownGenerator @@ -24,148 +25,26 @@ import micromatch from 'micromatch'; * It can exclude specific file types and files, clean tokens, and include todo lists. */ export class MarkdownGenerator { + private dir: string; + private outputFilePath: string; + private fileTypeExclusions: Set; + private fileExclusions: string[]; + private tokenCleaner: TokenCleaner; + private verbose: boolean; + /** * Creates an instance of MarkdownGenerator. * @param {MarkdownGeneratorOptions} [options={}] - Configuration options for the generator */ - constructor(options = {}) { + constructor(options: MarkdownGeneratorOptions = {}) { this.dir = options.dir || '.'; this.outputFilePath = options.outputFilePath || './prompt.md'; this.fileTypeExclusions = new Set( - options.fileTypeExclusions || [ - // Images - '.jpg', - '.jpeg', - '.png', - '.gif', - '.bmp', - '.svg', - '.webp', - '.tiff', - '.ico', - - // Fonts - '.ttf', - '.woff', - '.woff2', - '.eot', - '.otf', - - // Lock files - '.lock', - '.lockb', - - // Config files - '.yaml', - '.yml', - '.toml', - '.conf', - - // Binary and compiled - '.exe', - '.dll', - '.so', - '.dylib', - '.bin', - '.dat', - '.pyc', - '.pyo', - '.class', - '.jar', - - // Archives - '.zip', - '.tar', - '.gz', - '.rar', - '.7z', - - // Media - '.mp3', - '.mp4', - '.avi', - '.mov', - '.wav', - - // Database - '.db', - '.sqlite', - '.sqlite3' - ] + options.fileTypeExclusions || fileTypeExclusions, ); - this.fileExclusions = options.fileExclusions || [ - // Config patterns - '**/.*rc', - '**/.*rc.{js,json,yaml,yml}', - '**/*.config.{js,ts}', - '**/tsconfig.json', - '**/tsconfig*.json', - '**/jsconfig.json', - '**/jsconfig*.json', - '**/package-lock.json', - '**/.prettierignore', - // Environment and variables - '**/.env*', - '**/*.vars', - '**/secrets.*', - - // Version control - '**/.git*', - '**/.hg*', - '**/.svn*', - '**/CVS', - '**/.github/', - - // CI/CD - '**/.gitlab-ci.yml', - '**/azure-pipelines.yml', - '**/jenkins*', - - // Dependency directories - '**/node_modules/', - '**/target/', - '**/__pycache__/', - '**/venv/', - '**/.venv/', - '**/env/', - '**/build/', - '**/dist/', - '**/out/', - '**/bin/', - '**/obj/', - - // Documentation - '**/README*', - '**/CHANGELOG*', - '**/CONTRIBUTING*', - '**/LICENSE*', - '**/docs/', - '**/documentation/', - - // IDE and editors - '**/.{idea,vscode,eclipse,settings,zed,cursor}/', - '**/.project', - '**/.classpath', - '**/.factorypath', - - // Test and data - '**/test{s,}/', - '**/spec/', - '**/fixtures/', - '**/testdata/', - '**/__tests__/', - '**/*.{test,spec}.*', - '**/coverage/', - '**/jest.config.*', - - // Logs and temporary files - '**/logs/', - '**/tmp/', - '**/temp/', - '**/*.log' - ]; + this.fileExclusions = options.fileExclusions || fileExclusions; this.tokenCleaner = new TokenCleaner(options.customPatterns, options.customSecretPatterns); this.verbose = options.verbose !== undefined ? options.verbose : true; @@ -177,7 +56,7 @@ export class MarkdownGenerator { * @returns {Promise} Array of tracked file paths that aren't excluded * @throws {Error} When unable to execute git command or access files */ - async getTrackedFiles() { + async getTrackedFiles(): Promise { try { const output = this.execCommand('git ls-files'); const trackedFiles = output.split('\n').filter(file => file.trim().length > 0); @@ -210,7 +89,7 @@ export class MarkdownGenerator { * @returns {Promise} Cleaned and redacted content of the file * @throws {Error} When unable to read or process the file */ - async readFileContent(filePath) { + async readFileContent(filePath: string): Promise { try { const content = await readFile(filePath, 'utf-8'); const cleanedAndRedactedContent = this.tokenCleaner.cleanAndRedact(content); @@ -233,7 +112,7 @@ export class MarkdownGenerator { * @returns {Promise} Generated markdown content containing all processed files * @throws {Error} When unable to generate markdown content */ - async generateMarkdown() { + async generateMarkdown(): Promise { const trackedFiles = await this.getTrackedFiles(); if (this.verbose) { console.log(`Generating markdown for ${trackedFiles.length} files`); @@ -258,18 +137,18 @@ export class MarkdownGenerator { * @returns {Promise} Content of the todo file * @throws {Error} When unable to read or create the todo file */ - async getTodo() { + async getTodo(): Promise { const todoPath = path.join(this.dir, 'todo'); try { if (this.verbose) { console.log('Reading todo file'); } return await readFile(todoPath, 'utf-8'); - } catch (error) { + } catch (error: any) { if (error.code === 'ENOENT') { // File does not exist if (this.verbose) { - console.log("File not found, creating a new 'todo' file."); + console.log('File not found, creating a new \'todo\' file.'); } await writeFile(todoPath, ''); // Create an empty 'todo' file return await this.getTodo(); // Await the recursive call @@ -290,7 +169,7 @@ export class MarkdownGenerator { * @returns {Error} [result.error] - Error object if operation failed * @throws {Error} When unable to create or write the markdown document */ - async createMarkdownDocument() { + async createMarkdownDocument(): Promise<{ success: boolean, tokenCount?: number, error?: Error }> { try { const codeMarkdown = await this.generateMarkdown(); const todos = await this.getTodo(); @@ -317,7 +196,7 @@ export class MarkdownGenerator { * @throws {Error} When command execution fails * @private */ - execCommand(command) { + private execCommand(command: string): string { try { return execSync(command, { cwd: this.dir, encoding: 'utf-8' }).toString().trim(); } catch (error) { @@ -327,4 +206,4 @@ export class MarkdownGenerator { throw error; } } -} +} \ No newline at end of file diff --git a/src/TokenCleaner.js b/src/TokenCleaner.ts similarity index 83% rename from src/TokenCleaner.js rename to src/TokenCleaner.ts index 88a6205..c4eb9eb 100644 --- a/src/TokenCleaner.js +++ b/src/TokenCleaner.ts @@ -1,5 +1,11 @@ export class TokenCleaner { - constructor(customPatterns = [], customSecretPatterns = []) { + patterns: { regex: RegExp; replacement: string }[]; + secretPatterns: { regex: RegExp; replacement: string }[]; + + constructor(customPatterns: { regex: RegExp; replacement: string }[] = [], customSecretPatterns: { + regex: RegExp; + replacement: string + }[] = []) { this.patterns = [ { regex: /\/\/.*$/gm, replacement: '' }, { regex: /\/\*[\s\S]*?\*\//gm, replacement: '' }, @@ -40,22 +46,22 @@ export class TokenCleaner { ]; } - clean(code) { + clean(code: string): string { return this.patterns.reduce( (cleanCode, pattern) => cleanCode.replace(pattern.regex, pattern.replacement), code, ); } - redactSecrets(code) { + redactSecrets(code: string): string { return this.secretPatterns.reduce( (redactedCode, pattern) => redactedCode.replace(pattern.regex, pattern.replacement), code, ); } - cleanAndRedact(code) { + cleanAndRedact(code: string): string { const cleanedCode = this.clean(code); return this.redactSecrets(cleanedCode); } -} +} \ No newline at end of file diff --git a/src/cli.js b/src/cli.ts old mode 100755 new mode 100644 similarity index 71% rename from src/cli.js rename to src/cli.ts index de1bb05..4446bfb --- a/src/cli.js +++ b/src/cli.ts @@ -1,16 +1,16 @@ #!/usr/bin/env node -console.log("RUNNING TOKENIZER") +console.log('RUNNING TOKENIZER'); import { MarkdownGenerator } from './MarkdownGenerator.js'; const generator = new MarkdownGenerator(); generator .createMarkdownDocument() - .then(result => { + .then((result: { success: boolean }) => { if (!result.success) { process.exit(1); } }) - .catch(error => { + .catch((error: any) => { console.error('Error:', error); process.exit(1); - }); + }); \ No newline at end of file diff --git a/src/fileExclusions.ts b/src/fileExclusions.ts new file mode 100644 index 0000000..0e8b006 --- /dev/null +++ b/src/fileExclusions.ts @@ -0,0 +1,71 @@ +export default [ + // Config patterns + '**/.*rc', + '**/.*rc.{js,json,yaml,yml}', + '**/*.config.{js,ts}', + '**/tsconfig.json', + '**/tsconfig*.json', + '**/jsconfig.json', + '**/jsconfig*.json', + '**/package-lock.json', + '**/.prettierignore', + // Environment and variables + '**/.env*', + '**/*.vars', + '**/secrets.*', + + // Version control + '**/.git*', + '**/.hg*', + '**/.svn*', + '**/CVS', + '**/.github/', + + // CI/CD + '**/.gitlab-ci.yml', + '**/azure-pipelines.yml', + '**/jenkins*', + + // Dependency directories + '**/node_modules/', + '**/target/', + '**/__pycache__/', + '**/venv/', + '**/.venv/', + '**/env/', + '**/build/', + '**/dist/', + '**/out/', + '**/bin/', + '**/obj/', + + // Documentation + '**/README*', + '**/CHANGELOG*', + '**/CONTRIBUTING*', + '**/LICENSE*', + '**/docs/', + '**/documentation/', + + // IDE and editors + '**/.{idea,vscode,eclipse,settings,zed,cursor}/', + '**/.project', + '**/.classpath', + '**/.factorypath', + + // Test and data + '**/test{s,}/', + '**/spec/', + '**/fixtures/', + '**/testdata/', + '**/__tests__/', + '**/*.{test,spec}.*', + '**/coverage/', + '**/jest.config.*', + + // Logs and temporary files + '**/logs/', + '**/tmp/', + '**/temp/', + '**/*.log' +] \ No newline at end of file diff --git a/src/fileTypeExclusions.ts b/src/fileTypeExclusions.ts new file mode 100644 index 0000000..b1d3ba0 --- /dev/null +++ b/src/fileTypeExclusions.ts @@ -0,0 +1,60 @@ +export default [ + // Images + '.jpg', + '.jpeg', + '.png', + '.gif', + '.bmp', + '.svg', + '.webp', + '.tiff', + '.ico', + + // Fonts + '.ttf', + '.woff', + '.woff2', + '.eot', + '.otf', + + // Lock files + '.lock', + '.lockb', + + // Config files + '.yaml', + '.yml', + '.toml', + '.conf', + + // Binary and compiled + '.exe', + '.dll', + '.so', + '.dylib', + '.bin', + '.dat', + '.pyc', + '.pyo', + '.class', + '.jar', + + // Archives + '.zip', + '.tar', + '.gz', + '.rar', + '.7z', + + // Media + '.mp3', + '.mp4', + '.avi', + '.mov', + '.wav', + + // Database + '.db', + '.sqlite', + '.sqlite3' +] \ No newline at end of file diff --git a/src/index.js b/src/index.js deleted file mode 100644 index f4237ff..0000000 --- a/src/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export { TokenCleaner } from './TokenCleaner.js'; -export { MarkdownGenerator } from './MarkdownGenerator.js'; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..3675345 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,2 @@ +export { TokenCleaner } from './TokenCleaner'; +export { MarkdownGenerator } from './MarkdownGenerator'; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..fcbc19a --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + t + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +}