From 019b6e48c913d6dbbc3028b8c3f519f8574a31f3 Mon Sep 17 00:00:00 2001 From: geoffsee <> Date: Thu, 6 Mar 2025 08:26:19 -0500 Subject: [PATCH] ignore file is created if it does not exist --- bun.lockb | Bin 69970 -> 69970 bytes package.json | 2 +- src/MarkdownGenerator.ts | 18 ++++++++++++++++++ test/core.test.ts | 28 ++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 1 deletion(-) diff --git a/bun.lockb b/bun.lockb index 87048869df8e11d2aec34fa1d6b907fa9316ee0a..9f2f5a1e12b31372aa9a28caf9bdac0f6438da0e 100755 GIT binary patch delta 2305 zcmbuAdo?u=}a`setBwQPDeROFM5J8n?Nuq7Cl%9)ar zbPO|tc{j+#AWNoX7Dx`v1t3j9dVyq%7E=(#?!Tu%BSggi_+0d@qB;e|t2l`yN*o5h z91W{lAfAqzaugJZ!I-kB(da$U-dw8-1H&Tb#9jq!*c_{x#(dUzux_6dD+X)m9IKTk zh6T;GigaZEUHMK{pZ?9Z zs|)k)9#OV&=erC#pZ~1Lv(sHm+EASG^~nG{PNyzyG;lS&GkdAW(DyI=D#Vhs+^NLS z3&x$!3XRW@qF)AMq8Lqn!&v1C{Xr@8N#!G+d*9rP{Cm{9xaF)S|ITHxyS^+jMoWc^yqT;} za7Lds$NTMr;~(Ds7XG7et_h{BIgv%+SENP9Tr^XnGb{_oo(D8IGAgT<^YR+7@jiiT zqnCZ*{%V1OOEEdqVyM=z&;%vbbYEch%9u7RgyC_CA`7>}0N{N6=fJMe2Ktl<4cr83fI6TS_!;f4WYHIaW(*tx4x$T{_KNnP*`e;rMbQnQ)dP*dec&$e z3(y4I1IVq-1* z;s$6Uwd{!@wtjo@83N~V`Ft)9!=|4RVN>QQjdN~MA3f6#jr5T>g}y%0@}s8&wbe6~ zl*fFa8R30VbH}F&qWRKau z>a^l>;V22{D796WHD6Kk0C`bzT~-v5v{G5~l_ZZLOVXokP!}1r8Q?baEo{x>!jYJ7 zgXEqpBoOQ2$uOm#xakE)dsC(Mm{+=lc8yGVG2cYGc8UO$Q delta 2417 zcmbuAdpwkB6vv;JVa8?L#bidvWEF#ia>-?D%SLE7w#yb#(Ml7AD75t{waMklXS%31 zS=zLP7bOv;GL#s#r9RbYQhm}z7h&yY&pW(f^WToo*E#Pw=Q;0h9-ik&av73bMux!T zTehR&#v;2_b=(Cr>~#+p9-1NWOgOat#>avWmZ_y18;a*2B;5Qo5SoZkiU6!BSSDBt zu#edY@xfjII|=N5u;yUbgQfC5RG#E3U@bO!{Zku7&bb{kq1|e3fe-~U@e4Jd=b3_(a~M0+R57gX-nF2_%6ve!|NMzmbGRphNQ&s z+;`Phi^JVcXiO^Uy%h0Nf85cq9gYnjb?UDqWZX@hnOEJ)vlg12T6C)UW%xQGyGUvL zQvx9ZG2jOwYw9ZxeHiy$-|h42DQ*{sS7;^mIsDV>wOOwqXNf_Ry6K7b*khh)5rH>z z5)+f(G~C(NW99h5T(dz!+IaELoX_3fEvu4Fl{ZE#s$j+LER2hh!aHQCW{By}so;d0l^OhVzGlC577*@2+r~-n%8^E33zG%@;a9DL((P zm_H;K_6XS^l>E6hqtSdyYig)jKo!e7VYk4hvM9fJ@A;II=KNJ!>0usAI_D{y&a>}I zy|O#LcFq*7R@Xge^fM}(-zQyK?q_kZ^c(*n!Bk`0&s{;Vr%9iK%O(SZ#GvIP4?liJyVzjjquS)Z9QzEW7ln|O+xSrj#HSy;naMCN_x<~EP3%04KyK*epM7qR zP;57{vC2LkGc2uayJV}8|I;HXw$XFNM}4QVFZ(38@~)ZL?emVF&D~L%A#^uxn|x$V zz%$iHI;}0of5nU2rbnzj?N>$h#Q}kO$%JK6knsD0+VL9Qw-?Qdih2HS>tQ?XI3jV0 zci_DjC0qLh`?k#P@QYnRwxL~rNRRj58pri?);5d(aKEYS>ejtO0#iVo{YZgHPG;mi zspBhtO_xtM;<&iow<|H8TYkFJVSY}0#ak=OO#k0R@qNj!L_#C!dQ;LkC^$$Q7U;)% zQ>5qXcJP_f(3Vn-r;ThJx46aP?z81p2U0be;d)y_o~Trvh+O)Th)K50*J)()0w z0W<+Ofo7lukl?S zs)36@4Nwc5!RsrG*e2jj01|=C_&|k=k~4TNxUFJBL>+infUCeYpdJtd4L~D6ZEY@) z4Wt7wRpeXO2DSvCwzL!|1ImH3z&W4-C<3TD>g?H(A?IH+6zrYIfQv>-I8UM-(w*Y&6!F8mytDa}?IINp1_5 za2QL5y{!Na&6wilnf-XJgkv<8ioumW_?U!4T)>s^TfR}O!8p9LOVUVa!#RwIirEkn z87YWaxi)rXG`@MulI*_K!-hX7e*Kt-jR%xPQU!vI3uQX+poQ~gJna9JiI>WFA}Nzl z#$uTX1Q@uhgMr`63`9Z|0+uidRgsM%p@e&7I--XJp^Eio6GiO|!bDV~Ld+nXuxY;; zZtfUICC#X}QP0AGS+v{S;X%8?0W;Bj7Ge5%k%=f#i7=+q&;*nTMnB3`vv5WSmx{MY PO>ygAx@6e1*OvbRXxGT} diff --git a/package.json b/package.json index 6c62079..e63fcb1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "toak", - "version": "3.1.1", + "version": "3.1.2", "type": "module", "license": "AGPL-3.0-or-later", "repository": "https://github.com/seemueller-io/toak.git", diff --git a/src/MarkdownGenerator.ts b/src/MarkdownGenerator.ts index 18ab72e..ac69005 100644 --- a/src/MarkdownGenerator.ts +++ b/src/MarkdownGenerator.ts @@ -238,6 +238,23 @@ export class MarkdownGenerator { } } + async getRootIgnore(): Promise { + const rootIgnorePath = path.join(this.dir, '.toak-ignore'); + try { + return await readFile(rootIgnorePath, 'utf-8'); + } catch (error: any) { + if (error.code === 'ENOENT') { + // File does not exist + if (this.verbose) { + console.log('File not found, creating a root \'.toak-ignore\' file.'); + } + await writeFile(rootIgnorePath, 'todo\nprompt.md'); // Create an empty 'todo' file + return await this.getRootIgnore(); // Await the recursive call + } + throw error; + } + } + /** * Creates a complete markdown document combining code documentation and todos. * @async @@ -251,6 +268,7 @@ export class MarkdownGenerator { try { const codeMarkdown = await this.generateMarkdown(); const todos = await this.getTodo(); + const _ = await this.getRootIgnore(); const markdown = codeMarkdown + `\n---\n\n${todos}\n`; await writeFile(this.outputFilePath, markdown); if (this.verbose) { diff --git a/test/core.test.ts b/test/core.test.ts index 4199317..1544bc5 100644 --- a/test/core.test.ts +++ b/test/core.test.ts @@ -353,6 +353,34 @@ const a = 1; }); }); + describe('getRootIgnore', () => { + + it('should create root ignore file if it does not exist', async () => { + const rootIgnorePath = path.join('.', '.toak-ignore'); + + // First call to readFile throws ENOENT, second call resolves to empty string + const readFileSpy = spyOn(fs, 'readFile') + .mockImplementationOnce(() => { + const error: any = new Error('File not found'); + error.code = 'ENOENT'; + return Promise.reject(error); + }) + .mockResolvedValueOnce(''); + + // Spy on fs.writeFile + const writeFileSpy = spyOn(fs, 'writeFile').mockResolvedValue(undefined); + + const rootIgnore = await markdownGenerator.getRootIgnore(); + expect(readFileSpy).toHaveBeenCalledWith(rootIgnorePath, 'utf-8'); + expect(writeFileSpy).toHaveBeenCalledWith(rootIgnorePath, ''); + expect(rootIgnore).toBe(''); + + // Restore the original implementations + readFileSpy.mockRestore(); + writeFileSpy.mockRestore(); + }); + }); + describe('createMarkdownDocument', () => { it('should create markdown document successfully', async () => { const mockContent = '# Project Files\n\n## test.txt\n~~~\ntest\n~~~\n\n';